簡體   English   中英

將紋理快速加載到OpenGL 2.0中

[英]Loading Textures fast into OpenGL 2.0

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

每次在渲染器中調用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;
}

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

  1. 每次調用onSurfaceChanged都不要加載紋理。 textureId初始化為-1(在渲染器的構造函數/ surfaceCreated中),如果您有不同的Id,請在onSurfaceChanged的開頭檢查。 當你打電話給glGenTextures ,你會得到一個正數。
  2. 你需要Mipmap嗎? 這可能是你方法的關鍵點。 嘗試不使用GLES20.glGenerateMipMap(GLES20.GL_TEXTURE_2D);
  3. 2048x2048是巨大的。 特別是紋理。 你真的需要那么多細節嗎? 也許1024x1024就足夠了。
  4. 避免使用RGB_888,而是使用RGB_565:你將獲得幾乎相同的視覺質量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM