【问题标题】:How to determine maximum texture memory on Android OpenGL ES如何确定 Android OpenGL ES 上的最大纹理内存
【发布时间】:2023-04-08 23:05:02
【问题描述】:

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

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

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:

    您似乎想知道可用的 VRAM(视频 RAM)的数量。 The question has already been partially answered.

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

    方法一

    From this topic,可以获得最大数量的纹理单元;即可以同时绑定的最大数量:

    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);
    

    因此,从逻辑上讲,您至少可以毫无问题地将maxSize[0]²×maxNum[0] 像素放入 VRAM。即使 VRAM 空间不足,图形驱动程序也会为我们管理它(这可能包括在饥饿的情况下应用程序崩溃)。

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

    方法二

    99% 的时间,图形芯片上的 VRAM 数量与屏幕大小成正比。因此,use the screen's DPI (ldpi, mdpi, hdpi, xhdpi) 确定要加载哪个版本(大小)的纹理(用不同的(真实)设备进行实验),因此您可以放心“它是否适合该设备?”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      相关资源
      最近更新 更多