我正在 Android 上编写混合 2D/3D 游戏,但我无法确定我可以使用多少纹理内存。有什么方法可以确定 OpenGL ES 中的最大纹理内存?
我有自己的纹理缓存,想知道纹理内存的最大阈值。我正在使用 activityManager.getMemoryInfo(mi)
进行近似估计,但是在某些设备上,当我尝试分配纹理时(还有更多已经在内存中)应用程序崩溃(EGL_BAD_ALLOC
)。当我将此阈值设置为较低的值时,一切似乎都正常。有人有什么主意吗?或者最终如何确定纹理分配不成功,而不是崩溃。
最佳答案
您似乎想知道可用的 VRAM(视频 RAM)的数量。 The question has already been partially answered.
但是,VRAM 的数量并不能决定其中可以容纳多少纹理:这些纹理可以被压缩,VRAM 的数量可以因为另一个应用程序而改变,而且我们不知道视频驱动程序使用了多少内存.
方法一
From this topic ,可以获得最大数量的纹理单元;这意味着可以同时绑定(bind)的最大数量:
int[] maxSize = new int[1];
gl.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxSize, 0);
And from this other one ,您可以检索最大纹理大小:
int[] maxNum = new int[1];
glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, maxNum, 0);
因此,从逻辑上讲,您至少可以在 VRAM 中容纳 maxSize[0]
²×maxNum[0]
像素而不会出现问题。即使 VRAM 空间不足,图形驱动程序也会为我们管理它(这可能包括在饥饿情况下应用程序崩溃)。
无论如何,您可能不会根据 VRAM 数量或可用像素来调整纹理的大小;这是可能的,但不盈利、便携且难以正确实现。 有一种方式可以更好地做到这一点:
方法二
99% 的时间,图形芯片上的 VRAM 数量与屏幕尺寸成正比。因此,use the screen's DPI (ldpi, mdpi, hdpi, xhdpi)确定要加载哪个版本(大小)的纹理(使用不同的(真实)设备进行试验),因此您可以放心“它适合该设备吗?”。
关于android - 如何确定 Android OpenGL ES 上的最大纹理内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9266952/