无法获得opengl OutOfMemory错误1285

时间:2015-08-08 13:14:06

标签: android opengl-es vram

我只想知道Android设备上有多少视频内存。为此,我创建了很多次opengl纹理并检查glGetError()但总是没有错误,但我不相信这可能在内存中有这么多纹理。所以这里代码:

        int COUNT = 100500;

        int[] textureHandle = new int[COUNT];
        Bitmap bitmap = BitmapFactory.decodeResource(m_activity.getResources(), R.drawable.space);

        for(int i = 0; i < COUNT; i++)
        {
            GLES20.glGenTextures(1, textureHandle, i);
            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[i]);
            GLES20.glActiveTexture(textureHandle[i]);
            GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);

            System.out.println("Error code " + GLES20.glGetError());
        }

为什么我无法获得opengl OutOfMemory?或者也许有另一种方式知道我的Android设备上有多少VRAM。

1 个答案:

答案 0 :(得分:1)

真的没有办法做到这一点。 ES 2.0规范说明了错误情况(强调增加):

  

如果内存因执行命令的副作用而耗尽,则可能生成错误OUT_OF_MEMORY

这意味着您不能依赖获取GL_OUT_OF_MEMORY

移动设备通常不像台式机显卡那样使用VRAM。但即使他们这样做,在你第一次使用纹理进行渲染之前,纹理的VRAM很可能不会被分配。因此,当发布的循环运行时,驱动程序很可能根本不会分配任何VRAM。

这与在OpenGL中报告和处理内存不足情况非常棘手的原因非常相关。与OpenGL几乎所有其他内容一样,内存分配可以并且经常与API调用异步发生。例如,当glTexImage2D()调用返回时,至少一些将用于纹理的内存可能尚未分配。这意味着以同步方式报告分配错误几乎是不可能的。

这是开发人员对低级API感兴趣的部分原因,这些API允许他们对内存管理有更多控制。

如果您的设备支持,您可以尝试GL_KHR_debug extension。我没有个人经验,但看起来它可能会在你内存不足时告诉你。