7

我需要动态检查使用的设备是否支持 openGL ES 3.0。

我怎样才能做到这一点?

我在谷歌或这里找不到任何东西......

4

4 回答 4

13

我将扩展这个答案。该答案的初始部分包含配置信息并获取reqGlEsVersion. 请注意,它获取的是设备的实际 OpenGL 版本,而不是某些注释中建议的清单中声明的​​必需版本。

但是,我偶然发现了ConfigurationInfo类中一个相当明显的方法,称为getGlEsVersion. 它依赖于reqGlEsVersionConfigurationInfo 类中的系统,并返回一个 String 值。通过一些微小的设置,我做了一个简单的测试片段:

ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();

System.out.println(Double.parseDouble(configurationInfo.getGlEsVersion()));
System.out.println(configurationInfo.reqGlEsVersion >= 0x30000);
System.err.println(String.format("%X", configurationInfo.reqGlEsVersion));

我测试的设备支持并使用 GLES 3.2,并且测试应用在 manifest 中声明了 GLES3.0

运行此打印:

3.2
true
30002 //A note about this one: It doesn't print as 0x30002 because of the printing method. But it is the same as 0x30002

这三个打印语句的全部目的是表明任何一种方式都有效。它打印设备支持的版本,而不是某些注释中提到的清单中声明的​​版本。

因此,您可以使用其中任何一种方法来检查给定设备上的 OpenGL ES 版本。就个人而言,我使用这个:

double version = Double.parseDouble(configurationInfo.getGlEsVersion());
System.out.println("Version: " + version);//Optional obviously, but this is the reason I use the String and parse it to a double
if(version < 3)
    throw new RuntimeException("Unsupported GLES version");

但这也有效(并且内存效率略高):

int version = configurationInfo.getGlEsVersion();
//format and print here if wanted
if(version < 0x30000)
    throw new RuntimeException("Unsupported GLES version");

如果用户不满足要求,您当然可以显示祝酒词并退出、对话框、活动、片段,无论您感觉如何。您也应该这样做,因为如果它来自第三方站点,则有可能绕过要求。我只是抛出一个异常,因为我在清单中声明了 GLES3 的使用,这意味着首先不应该发生抛出。

至于清单标签:

<uses-feature android:glEsVersion="0x00030000" android:required="true" />

这不会阻止具有 GLES2 或更低版本的应用程序安装它,如果他们从 APK 文件或通过 USB 调试直接安装实例。这是一个标志,告诉 Google Play(或任何其他存在并检查的商店)不支持 GLES <(在这种情况下)3,并且 Google Play 会阻止安装。但是任何人都可以从忽略此类内容的镜像中安装它,因此标签本身并不是阻止 GLES2 和较低设备安装它的方法。

当然还有eglCreateContext()方法,但这只适用于本机系统。它不适用于 LibGDX 之类的东西或使用单独渲染器的任何东西,因为它会创建与库将使用的上下文不同的上下文。

glGetString(GL_VERSION)假设库/框架支持该方法,并且几乎可以在任何地方工作。不过,它本身已集成到 GLES2 中,并且需要先实际创建 OpenGL 上下文。在 Android 上使用第一种方法似乎是更好的选择。但是,这当然取决于您。

于 2017-12-21T16:54:39.083 回答
2

是的,下载CPU-Z,你手机的每一条信息都在这个应用程序中。

它在 Play 商店中为:CPU-Z。

于 2017-08-03T05:32:49.097 回答
1

这在 Android SDK 文档中有记录:

http://developer.android.com/guide/topics/graphics/opengl.html#version-check

你基本上有3个选择:

  1. 如果您的应用仅适用于 ES 3.0,您可以在清单中请求该版本:

    <uses-feature android:glEsVersion="0x00030000" android:required="true" />
    
  2. 您尝试使用 创建 ES 3.0 上下文eglCreateContext(),并检查它是否成功。

  3. 您创建一个 ES 2.0 上下文,然后使用glGetString(GL_VERSION).

上面的链接包含解决方案 2 和 3 的示例代码。

于 2014-08-30T16:01:00.863 回答
1

I think this code will help you

final ActivityManager activityManager = 
    (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
final ConfigurationInfo configurationInfo = 
    activityManager.getDeviceConfigurationInfo();
final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x30000;

this article can help you more

http://www.learnopengles.com/android-lesson-one-getting-started/

于 2014-08-30T15:40:47.830 回答