Android OpenGL加载纹理会占用大量内存

时间:2016-07-18 19:52:37

标签: android opengl-es

我正在使用OpenGL ES 2.0在Android中构建一个动态壁纸,它实际上只是一堆漂浮在空间中的纹理矩形。我的问题是,由于某些原因,加载这些纹理消耗的内存比远程合理的内存更多。我最大的图像是2078 kb,我只加载大约6-7 mb的图像,根据Settings-> Developer options->运行服务数据,我的应用程序使用的是1.3 GB的内存。

当我删除纹理加载时,我的问题似乎消失了(33 mb的内存),如果我实际绘制纹理似乎并不重要。我不完全确定是否

我的纹理加载代码的代码片段:

        Bitmap bmp = sceneSetter.getTexture(DataCodes.ROOM, DataCodes.FOUR_EIGHTY_P, DataCodes.BLUR_NONE);
    // Bind texture to texturename
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texturenames[0]);
    // Set filtering
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
    //clamp texture to edge of shape
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
    // Load the bitmap into the bound texture.
    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bmp, 0);

    //texture 1
    bmp = sceneSetter.getTexture(DataCodes.GIRL, DataCodes.FOUR_EIGHTY_P, DataCodes.BLUR_NONE);
    GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texturenames[1]);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bmp, 0);

最后跟着这个:

bmp.recycle();

sceneSetter从以下资源中检索位图:

bmp = BitmapFactory.decodeResource(context.getResources(), R.drawable.testimage);

编辑:所以,我在三星S7上测试它,但当我在Xperia Z3 compact上运行时,它'只需要154 MB的内存。这仍然很多,但远远低于S7使用的1.3GB。

1 个答案:

答案 0 :(得分:0)

以一个纹理尺寸为例,1191x892通常会在所占空间方面向上舍入到下一个二维幂,因此它相当于2048x1024。看起来您可能加载为888/8888,每像素占32位,因此2048 * 1024 * 4 = 8388608,那么您可能也有mipmap,这是额外的33%, 8388608 * 1.33 = 11156848,只有一个纹理接近11MB。

如果这可以解释您已经看过的1.3GB,那么您还没有提供足够的详细信息,但它可能至少解释了154MB。

我会研究ETC1压缩或565/4444格式,并尝试选择更智能的纹理尺寸。