Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android GL最大纹理大小策略_Android_Opengl Es 2.0_Andengine - Fatal编程技术网

Android GL最大纹理大小策略

Android GL最大纹理大小策略,android,opengl-es-2.0,andengine,Android,Opengl Es 2.0,Andengine,我正在和安德林一起开发一个游戏。因为我是为Android做这件事的,而且我想在不牺牲纹理质量的情况下覆盖尽可能多的设备,所以我有两种纹理包类型:HD和LOW: HD纹理=2048x2048 低纹理=1024x1024 高清摄像机=800x1280 低摄像头=400x640 我已经做了所有的逻辑设置高清纹理包或低纹理包,我现在需要的是一个好的政策,选择巫婆使用时,应用程序启动 使用AndEngine的: GLState state = new GLState(); int max = stat

我正在和安德林一起开发一个游戏。因为我是为Android做这件事的,而且我想在不牺牲纹理质量的情况下覆盖尽可能多的设备,所以我有两种纹理包类型:HD和LOW:

  • HD纹理=2048x2048
  • 低纹理=1024x1024
  • 高清摄像机=800x1280
  • 低摄像头=400x640
我已经做了所有的逻辑设置高清纹理包或低纹理包,我现在需要的是一个好的政策,选择巫婆使用时,应用程序启动

使用AndEngine的:

GLState state = new GLState();
int max = state.getInteger(GLES20.GL_MAX_...);
我遇到了一些价值观:

型号:三星Note 8,索尼XPERIA U
GL_最大_纹理尺寸:4096
GL_最大_纹理_图像_单位:8
GL_最大值_组合_纹理_图像_单位:8

型号:三星Galaxy Mini、三星S3 Mini、HTC One S
GL_最大_纹理尺寸:4096
GL_最大_纹理_图像_单位:16
GL_最大值_组合_纹理_图像_单位:20

型号:三星S4、Nexus4、XPERIA Z1
GL_最大_纹理尺寸:4096
GL_最大_纹理_图像_单位:16
GL_最大值_组合_纹理_图像_单位:32

在这里,我可以找到每个常量的含义,但我在这里有点迷茫,我不知道如何使用这些数据来为我的纹理和相机选择正确的设置。

我需要你的帮助和提示,我走对了吗?我接下来该如何处理这些信息?

谢谢您的时间。

GL\u MAX\u TEXTURE\u SIZE
是您的硬件支持的最大方形纹理尺寸

  • 任何纹理的X或Y维度都不能超过此大小
GL_MAX_TEXTURE_IMAGE_UNITS
指可在可编程管道中绑定和使用的最大纹理数(例如GLSL程序中唯一的采样器统一名称)(
GL_MAX_TEXTURE_UNITS
是GLE1.0中的固定模拟函数)

  • 在GLES 2.0中,最小值为2
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
指可以在GLSL程序中的所有着色器中使用的纹理数量

  • 片段着色器中的4个采样器+顶点着色器中的4个采样器=8个组合纹理图像单位

注意:OpenGL ES 2.0不需要顶点着色器中的纹理查找支持,我怀疑
三星NOTE 8、Sony XPERIA U
有一个实现不支持这一点,从组合和常规TMU计数之间的奇偶性判断

  • 查询
    GL\u MAX\u VERTEX\u TEXTURE\u IMAGE\u UNITS
    的值将结束任何猜测


但要回答你的实际问题。。。这些值中唯一可用于确定使用哪个纹理包的值是
GL\u MAX\u texture\u SIZE
。您无法查询OpenGL参数来确定底层硬件的内存容量/纹理填充率,这是您在选择纹理包时真正想知道的。您需要通过其他方式收集这些信息,可能是一个小型基准测试或已知硬件的数据库,或者如果您幸运的话,平台有一个单独的API让您可以查询这些信息。

我遇到了另一个可能很方便的测试用例,检查可用内存:

        ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
        ActivityManager activityManager = (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE);
        activityManager.getMemoryInfo(mi);
        long availableMegs = mi.availMem / 1048576L;
到目前为止,我的测试用例是:

if (IS_TABLET7 || IS_TABLET10) {
    useHIGH &= smallestWidthSize >= TABLET_MAX_SMALLEST_WIDTH;
} else {
    useHIGH &= smallestWidthSize >= SMARTPHONE_MAX_SMALLEST_WIDTH;
}

Log.i(C.TAG, "=========SCREEN DIMENSIONS=========");
Log.i(C.TAG, "Screen Size Info: smallestWidthSize = " + smallestWidthSize);
Log.i(C.TAG, "Screen Size Info: smallestWidthSize >= MAX_SMALLEST_WIDTH (" + (IS_TABLET ? TABLET_MAX_SMALLEST_WIDTH : SMARTPHONE_MAX_SMALLEST_WIDTH) + ")? " + useHIGH);
Log.i(C.TAG, "Screen Size Info: should use Texture Type > " + (useHIGH ? "HIGH" : "LOW"));


useHIGH &= availableMegs > MIN_RAM_LIMIT;
Log.i(C.TAG, "=========AVAILABLE RAM=========");
Log.i(C.TAG, "Memory Info: available RAM = " + availableMegs + "Mb");
Log.i(C.TAG, "Memory Info: available RAM > MIN_RAM_LIMIT(" + MIN_RAM_LIMIT + "Mb)? " + useHIGH);
Log.i(C.TAG, "Memory Info: should use Texture Type > " + (useHIGH ? "HIGH" : "LOW"));

如上所述,我会一直更新这篇文章,直到找到一个好的固溶体。

Hello Andon。首先让我感谢你的时间和信息。我有一些紧张的最后期限,所以现在我必须把这个“选择纹理类型策略”搁置。我会仔细研究你说的话,尽快继续我的研究。我会一直更新这篇文章。