Есть ли способ проверить, поддерживает ли устройство Android openGL ES 2.0? - PullRequest
25 голосов
/ 08 февраля 2012

Мне нужно динамически проверять, поддерживает ли используемое устройство openGL ES 2.0.Как я могу это сделать?

Ответы [ 7 ]

36 голосов
/ 08 февраля 2012

Да.Следующий код справится с задачей:

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

Прочтите это для получения дополнительной информации: http://www.learnopengles.com/android-lesson-one-getting-started/

Вам также может потребоваться ограничить просмотр вашего приложения устройствами, которые не поддерживают 2.0.на рынке, добавив в свой манифест следующее:

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

См. также документ uses-feature.

5 голосов
/ 08 февраля 2012

В дополнение к проверке кода способами, упомянутыми другими, если вы хотите ограничить его на рынке ТОЛЬКО теми устройствами с 2.0, то в манифесте:

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

Вы должны сделать и то и другое, у меня были люди, устанавливающие apk непосредственно на неподходящие устройства, и мне приходилось сталкиваться со странными исключениями. Теперь я бросаю время запуска:

private boolean detectOpenGLES20() {
        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        ConfigurationInfo info = am.getDeviceConfigurationInfo();
        return (info.reqGlEsVersion >= 0x20000);
    }

      //in activity onCreate    
    if (!detectOpenGLES20()) {
        throw new RuntimeException("Open GL ES 2.0 was not found on device");
    }
2 голосов
/ 24 сентября 2015

Вы можете использовать этот код в вашем коде:

            int result;
            ActivityManager activityManager =
                    (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
            ConfigurationInfo configInfo = activityManager.getDeviceConfigurationInfo();
            if (configInfo.reqGlEsVersion != ConfigurationInfo.GL_ES_VERSION_UNDEFINED) {
                result= configInfo.reqGlEsVersion;
            } else {
                result= 1 << 16; // Lack of property means OpenGL ES version 1
            }

            Log.e("reqGlEsVersion", String.valueOf(result));
            Log.e("getGlEsVersion", configInfo.getGlEsVersion());
2 голосов
/ 08 февраля 2012

Определение расширений OpenGL:

Реализации OpenGL зависят от устройства Android в зависимости от поддерживаемых расширений API OpenGL ES. Эти расширения включают в себя сжатия текстур, но, как правило, также включают в себя другие расширения набора функций OpenGL.

Чтобы определить, какие форматы сжатия текстур и другие расширения OpenGL поддерживаются на конкретном устройстве:

Запустите следующий код на целевых устройствах, чтобы определить, какие форматы сжатия текстур поддерживаются:

  String extensions = javax.microedition.khronos.opengles.GL10.glGetString(GL10.GL_EXTENSIONS);

Внимание! Результаты этого звонка зависят от устройства! Вы должны выполнить этот вызов на нескольких целевых устройствах, чтобы определить, какие типы сжатия обычно поддерживаются. Просмотрите выходные данные этого метода, чтобы определить, какие расширения OpenGL поддерживаются на устройстве.

0 голосов
/ 29 апреля 2015

Некоторое время я тоже искал тот же ответ.Но, к сожалению, я не смог найти подходящего описания для этого.Я только что нашел способ минуту назад сам и чувствую, что хотел бы поделиться им со всеми.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FeatureInfo[] list = this.getPackageManager()
            .getSystemAvailableFeatures();

    Toast.makeText(this,
            "OpenGL ES Version: " + list[list.length - 1].getGlEsVersion(),
            Toast.LENGTH_LONG).show();
}
0 голосов
/ 27 июня 2013

Этот код работает отлично ..

     // Check if the system supports OpenGL ES 2.0.
final ActivityManager activityManager = ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
    final ConfigurationInfo configurationInfo = activityManager
            .getDeviceConfigurationInfo();
    final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000;

    if (supportsEs2) {
        Log.i("JO", "configurationInfo.reqGlEsVersion:"
                + configurationInfo.reqGlEsVersion + "supportsEs2:"
                + supportsEs2);
        // Request an OpenGL ES 2.0 compatible context.
        myGlsurfaceView.setEGLContextClientVersion(2);

        final DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

        // Set the renderer to our demo renderer, defined below.
        myRenderer = new MyRenderer(this, myGlsurfaceView);
            } else {
        // This is where you could create an OpenGL ES 1.x compatible
        // renderer if you wanted to support both ES 1 and ES 2.
        return;
    }
0 голосов
/ 08 февраля 2012

Никогда не использовал OpenGL ES, но видел, что он имеет тот же метод glGetString, что и OpenGL. Это должно сделать трюк:

http://www.khronos.org/opengles/sdk/docs/man/xhtml/glGetString.xml

...