对纹理尺寸的限制?Android Open GL ES 2.0

Vin*_*nod 7 performance android textures opengl-es

我想知道是否可以在任何Android Opengl Es 2.0项目中使用的纹理大小有任何限制.据我所知,拥有4096x4096大尺寸的纹理有点意义,因为它在小屏幕上呈现.但是如果要求在运行时在许多纹理之间切换怎么办?如果我想要一个纹理图集来快速单个上传而不是多个较小的纹理上传.请在这方面告诉我你的想法.

此外,我确信必须对设备可以处理的图像大小进行限制,因为设备上的内存有限.但我想知道它是基于分辨率还是基于尺寸.我的意思是,如果设备具有1024x1024图像大小的限制,它可以处理大小为2048x2048的压缩纹理,其大小与未压缩的1024x1024相同.

另外请告知我一般情况下,运行Android 2.2及以上版本的纹理大小或分辨率正常设备的限制程度.

另外,如果在opengles 2.0中处理高分辨率图像时有任何最佳实践,请告知我们在加载时间和运行时间内获得最佳性能.

Jav*_*ave 22

纹理大小存在硬件限制.要手动查找它们,您可以访问诸如glbenchmark.com之类的网站(此处显示有关google galaxy nexus的详细信息).
要从代码中自动查找最大大小,您可以使用以下内容:

int[] max = new int[1];
gl.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, max, 0); //put the maximum texture size in the array.
Run Code Online (Sandbox Code Playgroud)

(对于GL10,但GLES20存在相同的方法)

处理编辑图像时,您通常在Android中使用Bitmap实例.它保存图像的未压缩值,因此取决于分辨率.但是,建议您为openGL应用程序使用压缩纹理,因为这会提高内存使用效率(请注意,您无法修改这些压缩纹理).
从上一个链接:

纹理压缩可以通过减少内存需求和更有效地利用内存带宽来显着提高OpenGL应用程序的性能.Android框架支持ETC1压缩格式作为标准功能[...]

您应该查看此文档,其中包含许多有关纹理加载和使用的良好实践和提示.作者明确写道:

最佳实践:使用ETC进行纹理压缩.

最佳实践:确保几何和纹理分辨率适合于显示的大小.不要在屏幕上使用1k x 1k纹理来获得最多500像素宽的内容.几何相同.