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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何确定Android OpenGL ES上的最大纹理内存相关的知识,希望对你有一定的参考价值。

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

我有自己的纹理缓存,想知道纹理内存的最大阈值。我正在使用activityManager.getMemoryInfo(mi)进行近似估计,但在某些设备上,当我尝试分配纹理时(还有更多已经在内存中)应用程序崩溃(EGL_BAD_ALLOC)。当我将此阈值设置为较低值时,一切似乎都可以。有谁有想法吗?或者最终如何确定纹理分配不成功,而不是崩溃。

答案

您似乎正在尝试了解可用的VRAM(视频RAM)数量。 qazxsw poi

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

方法1

The question has already been partially answered.,你可以获得最大量的纹理单位;这意味着可以同时绑定的最大数量:

From this topic

int[] maxSize = new int[1]; gl.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxSize, 0); ,你可以检索最大纹理大小:

And from this other one

所以,从逻辑上讲,你可以毫无问题地在VRAM中至少适合int[] maxNum = new int[1]; glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, maxNum, 0); ²×maxSize[0]像素。即使VRAM空间不足,图形驱动程序也会为我们管理它(可能包括在饥饿的情况下应用程序崩溃)。

无论如何,根据VRAM数量或可用像素,您可能不会调整纹理的大小;这是可能的,但不盈利,便携,很难正确实施。有一种更好的方法可以做到这一点:

方法2

99%的时间,图形芯片上的VRAM的大小与屏幕尺寸成正比。因此,maxNum[0]确定要加载的纹理的版本(大小)(尝试使用不同的(真实)设备),这样你就可以安全地“它是否适合该设备?”。

以上是关于如何确定Android OpenGL ES上的最大纹理内存的主要内容,如果未能解决你的问题,请参考以下文章

Android 上的 OpenGL ES 2:如何使用 VBO

如何在 Android 中将 OpenCV 旋转和平移矢量与 OpenGL ES 一起使用?

Android设备上的OpenGL ES 2.0扩展[关闭]

在 Android 上的 OpenGL ES 2.0 中使用 VBO/IBO

Android 上的 openGl es 在右上角显示一个 Square

使用 Android 上的 OpenGL ES 2.0,在帧缓冲区上渲染时是不是可以保留多重采样?