如何确定Android OpenGL ES上的最大纹理内存?

15

我正在Android上编写一个混合的2D/3D游戏,但无法确定可以使用多少纹理内存。是否有方法可以在OpenGL ES中确定最大纹理内存?

我有自己的纹理缓存,并想知道纹理内存的最大阈值。我正在使用activityManager.getMemoryInfo(mi)进行近似估计,但是在某些设备上,当我尝试分配纹理(并且许多其他纹理已经在内存中)时,应用程序会崩溃(EGL_BAD_ALLOC)。当我将此阈值设置为较低的值时,一切似乎都正常。有没有人有任何想法?或者最终如何确定纹理分配失败而不是崩溃。

1个回答

5

看起来你正在尝试了解可用的VRAM(视频RAM)数量。 问题已经有部分回答。

然而,VRAM的数量并不决定可以容纳多少纹理:这些纹理可以被压缩,VRAM的数量可能会因为另一个应用程序而改变,并且我们不知道视频驱动程序使用多少内存。

方法1

从这个主题中,你可以获得最大纹理单元的数量;这意味着可以同时绑定的最大数量:

int[] maxSize = new int[1];
gl.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxSize, 0);

从这个链接中,您可以检索到最大纹理尺寸:

int[] maxNum = new int[1];
glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, maxNum, 0);

所以,逻辑上讲,你至少可以在VRAM中放下maxSize[0]²×maxNum[0]像素而没有问题。即使VRAM空间不足,图形驱动程序也会为我们处理(这可能包括应用程序因饥饿而崩溃)。

总之,你可能不会根据VRAM数量或可用像素调整纹理大小;这是可能的,但不划算、不可移植且难以正确实现。有一种更好的方法

方法2

99%的情况下,显卡上的VRAM数量与屏幕大小成比例。因此,使用屏幕的DPI(ldpi、mdpi、hdpi、xhdpi)确定要加载哪个版本(大小)的纹理(尝试在不同的(真实的)设备上进行实验),这样就可以确保它适合该设备。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接