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

标签 android opengl-es

我正在 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/

相关文章:

android - 如何将前景属性设置为其他非 FrameLayout View

android - OpenGL - 为什么 normalize() 不是幂等的?

android - OPEN GL Android - 如何将位图对象转换为可绘制纹理

ios - 如何在 UIView 和另一个线程之间共享 CVOpenGLESTextureCache?

android - 如何在 CachedNetworkImage flutter 中清除缓存

Android布局将一个布局放置在另外两个布局的中间

android - 如何在 Android 上制作 Twitter 应用风格的快速操作

android - 在android studio中添加LinkedIn SDK报错: "Configuration with name ' default' not found"

安卓 OpenGL 截图

ios - - (BOOL)loadShaders 方法对我不起作用