无法获取 opengl OutOfMemory 错误 1285

Can't get opengl OutOfMemory error 1285

我只想知道 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。

实在没有什么好办法。 ES 2.0 规范说明了错误情况(添加了重点):

If memory is exhausted as a side effect of the execution of a command, the error OUT_OF_MEMORY may be generated.

这意味着您不能指望获得 GL_OUT_OF_MEMORY.

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

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

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

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