use*_*593 14 android opengl-es
我正在Android上编写一个混合2D/3D游戏,我无法确定我可以使用多少纹理内存.有没有办法确定OpenGL ES中的最大纹理内存?
我有自己的纹理缓存,想知道纹理内存的最大阈值.我正在使用activityManager.getMemoryInfo(mi),但在某些设备上,当我尝试分配纹理(还有更多已经在内存中)时,应用程序崩溃(EGL_BAD_ALLOC).当我将此阈值设置为较低值时,一切似乎都可以.有谁有想法吗?或者最终如何确定纹理分配不成功,而不是崩溃.
您似乎正在尝试了解可用的VRAM(视频RAM). 这个问题已经得到了部分回答.
然而,VRAM的数量并不能决定它适合多少纹理:这些可以被压缩,VRAM的数量可以因为另一个应用程序而改变,我们不知道视频驱动程序使用了多少内存.
方法1
从这个主题,您可以获得最大量的纹理单位; 这意味着可以同时绑定的最大数量:
int[] maxSize = new int[1];
gl.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxSize, 0);
Run Code Online (Sandbox Code Playgroud)
从另一个,您可以检索最大纹理大小:
int[] maxNum = new int[1];
glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, maxNum, 0);
Run Code Online (Sandbox Code Playgroud)
所以,从逻辑上讲,你至少可以在VRAM中适应maxSize[0]²× maxNum[0]像素而不会出现问题.即使VRAM空间不足,图形驱动程序也会为我们管理它(可能包括在饥饿的情况下应用程序崩溃).
无论如何,根据VRAM数量或可用像素,您可能不会调整纹理的大小; 这是可能的,但不盈利,便携,很难正确实施.有一个办法更好的方式来做到这一点:
方法2
99%的时间,图形芯片上的VRAM的大小与屏幕尺寸成正比.因此,使用屏幕的DPI(ldpi,mdpi,hdpi,xhdpi)来确定要加载的纹理的版本(大小)(使用不同的(真实)设备进行实验),这样你就可以安全地使用"它是否适合它设备?".