Android OpenGL:可能会耗尽内存?

时间:2012-02-04 15:51:16

标签: android opengl-es

我一直试图解决这个问题好几个星期但我现在还不知道该怎么做。

我认为有些Android设备没有足够的内存来加载纹理量,虽然它可能是导致问题的其他因素,正如我所说,我真的不知道如何处理这个问题。

有28个PNG正在加载所有1024x1024,总共4.8megs。下面是用于加载纹理的OpenGL方法

    GL10 gl = glGraphics.getGL();
    int[] textureIds = new int[1];
    gl.glGenTextures(1, textureIds, 0);
    textureId = textureIds[0];

    InputStream in = null;
    try {
        in = fileIO.readAsset(fileName);
        Bitmap bitmap = BitmapFactory.decodeStream(in);
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
        setFilters(GL10.GL_LINEAR , GL10.GL_LINEAR);
        gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);
        width = bitmap.getWidth();
        height = bitmap.getHeight();
        bitmap.recycle();
    } catch(IOException e) {
        throw new RuntimeException("Couldn't load texture '" + fileName +"'", e);
    } finally {
        if(in != null)
            try { in.close(); } catch (IOException e) { }
    }

我的Desire HD上没有任何问题,但在HTC Cha Cha上,很多纹理根本没有出现,而在Galaxy S上,两个纹理只显示为白色。 Cha Cha在加载纹理时抛出此错误

  

02-04 15:46:28.907:E / Adreno200-ES20(1501):override1 = 0xfffffffe,   override2 = 0xfff *

奇怪的是,如果Cha Cha被锁定(OpenGL纹理被破坏)然后解锁(重新加载纹理),那么最初不存在的特定纹理现在是,但是现在不同的纹理是不可见的。

这是内存问题吗?如果是这样的话有办法吗?

由于

1 个答案:

答案 0 :(得分:1)

正确的解决方案是纹理压缩,而不是PNG压缩。 PVR-TC会为您提供所需的大部分内容。在4-bpp,你可以降到12MB而不是117MB。即使只使用较低的深度图像,如RGB-565格式(每像素16位),也可以将您的需求减少一半。

此外,您不必为手机使用1024x1024纹理;这有点矫枉过正。你可能可以使用512x512图像。与PVR-TC结合使用,您只需要大约3MB的纹理数据。