本文譯自:http://developer.android.com/guide/topics/graphics/opengl.html#compatibility
OpenGL版本和裝置相容性
Android系統從1.0開始就支援OpenGL
ES 1.0和1.1規範,從Android2.2(API Level 8)開始,架構支援OpenGL
ES 2.0 API規範。OpenGL ES 2.0被大多數Android裝置支援,並且推薦新的應用程式用OpenGL來開發。對於支援給定OpenGL
ES版本的Android裝置的數量的相關資訊,請看OpenGL ES版本統計表(http://developer.android.com/about/dashboards/index.html)
紋理壓縮的支援
紋理壓縮能夠通過降低對記憶體的需求和提高對記憶體的利用效率來顯著的提高OpenGL應用的效能。Android架構提供了對ETC1壓縮格式的支援,把它作為標準的功能,架構中提供ETC1Util工具類和etc1tool壓縮公用程式(位於Anddroid
SDK的<sdk>/tools/目錄下)。使用紋理壓縮的Android應用程式範例,請看CompressedTextureActivity範例程式碼(http://developer.android.com/tools/samples/index.html)。
大多數的Android裝置都支援ETC格式,但是並不保證對所有裝置都有效。如果要檢查裝置是否支援ETC1格式,可以調用ETC1Util.isETC1Supported()方法。
注意:ETC1紋理壓縮格式不支援帶有alpha通道的紋理。如果應用程式需要帶有alpha通道的紋理,應該調查目標裝置上其他的紋理壓縮格式是否支援alpha通道。
除了ETC1格式之外,Android裝置還基於GPU晶片集合OpenGL的實現來支援其他的各種紋理壓縮。應該調查目標裝置所支援的紋理壓縮格式,從而決定應用程式應該支援哪種壓縮格式,為了判斷給定的裝置上支援什麼類型的紋理壓縮格式,就必須裝置並檢查OpenGL的副檔名,它標識了裝置所支援的紋理壓縮格式(以及其他的OpenGL功能)。通常支援的紋理壓縮格式如下:
1. ATITC(ATC)---
ATI紋理壓縮(ATITC或ATC)在大部分裝置上都是有效,並且支援針對帶有alpha通道和不帶有alpha通道的RGB的固定的壓縮比率。這種格式可以通過以下幾種OpenGL副檔名來表示,如:
GL_AMD_compressed_ATC_texture
GL_ATI_texture_compression_atitc
2. PVRTC---PowerVR紋理壓縮(PVRTC)在大部分裝置上也是有效,並且支援帶有alpha或不帶有alpha通道的2位和4位像素紋理。這種格式通過以下OpenGL副檔名來表示:
GL_IMG_texture_compression_pvrtc
3. S3TC(DXTn/DXTC)---S3紋理壓縮(S3TC)有幾種格式變種(DXT1到DXT5),並且有效範圍很窄。這種格式支援帶有4位或8位alpha通道的RGB紋理。這種格式使用以下OpenGL副檔名來表示:
GL_OES_texture_compression_s3TC
GL_EXT_texture_compression_s3tc
GL_EXT_texture_compression_dxt1
GL_EXT_texture_compression_dxt3
GL_EXT_texture_compression_dxt5
4. 3DC---3DC紋理壓縮(3DC)是很少使用的支援帶有alpha通道RGB紋理壓縮格式。這種格式使用以下OpenGL副檔名來表示:
GL_AMD_compressed_3DC_texture
警告:這些紋理壓縮格式不是所有裝置都支援的,通過廠家和裝置能夠確認針對這些格式的支援的變化。
注意:一旦決定應用程式要支援的紋理壓縮格式,就要確保在該應用清單的<supports-gl-texture>元素中聲明它們。使用這個聲明能夠啟用像Google
Play這樣的外部服務的過濾功能,以便應用程式只能被安裝在支援應用程式所需要的格式的裝置上。
判斷OpenGL的擴充
不同Android裝置所的OpenGL的實現對它所支援的OpenGL
ES API進行不同擴充。這些擴充包括紋理壓縮,但通常也包含其他的對OpenGL功能集的擴充。
用以下的方法來判斷一個特殊的裝置上所支援的紋理壓縮格式和其他的OpenGL擴充:
1. 在目標裝置上運行以下代碼來判斷裝置所支援的紋理壓縮格式:
String extensions= javax.microedition.khronos.opengles.GL10.glGetString(GL10.GL_EXTENSIONS);
警告:這個調用會因裝置不同而有所差異,因此必須在不同目標裝置上分別調用這個方法來判斷裝置所支援的壓縮格式。
2. 檢查這個方法的輸出結果,來判斷裝置所支援的OpenGL擴充功能。
選擇OpenGL API版本
OpenGL ES API 1.0(含1.1的擴充)和2.0為建立3D遊戲、可視效果和使用者介面都提供了高效能的圖形介面。針對OpenGL
ES1.0/1.1API和ES 2.0的圖形編程的差異是顯著的,因此在使用其中任何一種API開始開發之前,要充分考慮以下因素:
1. 效能---通常情況下,OpenGL
ES 2.0API提供了比OpenGL ES 1.0/1.1API更快的圖形效能,但是,效能的差異也會因應用程式所啟動並執行Android裝置實現的OpenGL的圖形管道的差異而有所不同。
2. 裝置的相容性---開發人員應該考慮裝置的類型、Android的版本以及OpenGL
ES版本等內容對客戶的有效性。關於跨裝置的OpenGL的相容性的更多資訊,請看OpenGL版本和裝置的相容性一節。
3. 編碼的變數性---OpenGL ES 1.0/1.1 API提供了一個固定的功能管道和便利的在ES
2.0 API中所沒有的便利的功能函數。對於新手可以更快和更方便的利用OpenGL ES 1.0/1.1 API進行編碼。
4. 圖形控制---OpenGL ES 2.0 API通過著色器的使用,提供一個完整的可程式化的管道,從而提供了更高程度的控制。用更多的直接對圖形處理管道的控制,開發人員能夠建立很多使用ES
1.0/1.1 API很難到達的效果。
因為效能、相容性、便利性、控制以及其他因素都會影響到API版本選擇的決定,因此要基於想要提供最佳的使用者體驗來選擇要使用的OpenGL
API 版本。