我只想知道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。
答案 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。我没有个人经验,但看起来它可能会在你内存不足时告诉你。