1

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

4

1 回答 1

1

确实没有什么好的方法可以做到这一点。ES 2.0 规范说明了错误情况(添加了重点):

如果由于执行命令而导致内存耗尽,则可能会生成错误 OUT_OF_MEMORY。

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

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

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

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

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

于 2015-08-08T17:09:02.057 回答