2011-12-13 112 views
4

我正在爲Android構建一個簡單的動態壁紙。我使用下面的代碼將所需的紋理上傳到OpenGL ES 2.0中。我已將所有圖像加載到大小爲2048x2048的單個文件中。下面的代碼需要大約900到1200毫秒來加載紋理。這是正常的時間還是我做錯了,讓它變慢?將紋理加載到OpenGL 2.0中

我也嘗試每次在渲染器中調用onSurfaceCreated時,清除Opengl中的紋理列表。這是正確的做法,還是有辦法簡單檢查以前加載的紋理是否已經在內存中,如果是的話,避免清理和重新加載?請讓我知道你對此的評論。謝謝。

同樣在屏幕方向改變OnSurfaceCreated被調用。所以紋理上傳再次發生。這不是一個好主意。什麼是工作?

public int addTexture(Bitmap texture) { 

    int bitmapFormat = texture.getConfig() == Config.ARGB_8888 ? GLES20.GL_RGBA : GLES20.GL_RGB; 

    int[] textures = new int[1]; 
    GLES20.glGenTextures(1, textures, 0); 
    int textureId = textures[0]; 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId); 

    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmapFormat, texture, 0); 
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR_MIPMAP_LINEAR); 
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT); 
    GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D); 
    return textureId; 
} 

回答

3

有幾種方法可以提高性能。

  1. 不要在每次調用onSurfaceChanged時加載紋理。將您的textureId初始化爲-1(在渲染器的構造函數/ surfaceCreated中),並在onSurfaceChanged的開頭檢查是否有不同的Id。當你撥打glGenTextures時,你會得到一個正數。
  2. 你需要Mipmaps嗎?這可能是您的方法的關鍵點。嘗試沒有行GLES20.glGenerateMipMap(GLES20.GL_TEXTURE_2D);
  3. 2048x2048是巨大的。尤其對於紋理。你真的需要那麼多細節嗎?也許1024x1024是足夠的。
  4. 避免使用RGB_888,請使用RGB_565:您將獲得幾乎相同尺寸的視覺質量。
+0

我的尺寸2048x2048是因爲我已將我的應用程序中的許多項目的紋理合併到1個文件中。我可以很容易地將紋理分割爲4個不同的1024x1024文件。但是我將不得不加載4個不同的文件。分裂這種方式會提高我的表現,還是會導致上傳時間增加,因爲我現在有4張圖片需要上傳? – Vinodtiru

+1

我想說,如果由於與其他函數調用相關的一些開銷而分割文件,上傳時間將會增加,但您可能需要嘗試。 –

+0

謝謝。我也想知道在加載2048x2048大小的紋理時是否會有問題?我的意思是在任何運行2.2的舊款Android手機中,會不會有圖像大小的限制? – Vinodtiru