获取aos设备支持的opengles版本

本文提供了一种在Android设备上检测OpenGL ES版本的方法,包括使用EGL API进行低级别检查,以及通过ActivityManager获取更高级别的信息。两种方法分别适用于不同场景,实测第二种方法更为有效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个简单的问题:如何获取aos设备支持的opengles版本?

在网上找了各种代码、资料,包括官方文档,均说得不是很完整。
特别是官方文档,里面的 context/config/egl/gl对象都是从哪里来的统统没告诉你,简直无敌。

最后综合各家,通过真机测试,精简成下列代码:


/*v1 需要的import*/
import android.opengl.EGL14;
import android.opengl.EGLDisplay;
import android.opengl.EGLConfig;
import android.opengl.EGLContext;

/*v2 需要的import*/
import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.ConfigurationInfo;

final class GLHelper
{
    static public boolean checkGLVersion1(int ver)
    {
        final int[] EGL_CONFIG_FIELD = {EGL14.EGL_NONE};
        EGLDisplay eglDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);
        int []version = new int[2];
        if (EGL14.eglInitialize(eglDisplay, version,0,version,1))
        {
            int []configAttribs = {EGL14.EGL_NONE};
            final int[] EGL_ATTRIBUTE = {
                    EGL14.EGL_CONTEXT_CLIENT_VERSION, ver,
                    EGL14.EGL_NONE,
            };

            int []numConfigs = new int[]{0};
            EGLConfig[] configs = new EGLConfig[]{null};
            if (EGL14.eglChooseConfig(eglDisplay, configAttribs,0, configs, 0,configs.length, numConfigs,0)) {
                EGLConfig eglConfig = configs[0];
                EGLContext eglContext;
                eglContext = EGL14.eglCreateContext(eglDisplay, eglConfig, EGL14.EGL_NO_CONTEXT, EGL_ATTRIBUTE, 0);
                if (eglContext == EGL14.EGL_NO_CONTEXT) {
                    return false;
                }
                else
                {
                    EGL14.eglDestroyContext(eglDisplay, eglContext);
                    EGL14.eglReleaseThread();
                    EGL14.eglTerminate(eglDisplay);
                    return true;
                }
            }
        }
        return false;
    }

    static public boolean checkGLVersion2(Activity activity, float ver)
    {
        final ActivityManager activityManager = (ActivityManager)activity.getSystemService(Context.ACTIVITY_SERVICE);
        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
        int majorVer = configurationInfo.reqGlEsVersion >>> 16;
        int minorVer = configurationInfo.reqGlEsVersion & 0xFFFF;
        float fullVer = majorVer + ((minorVer < 10)?(minorVer/10f):(minorVer/100f));
        return fullVer >= ver;
    }

}

调用代码: 
if ( GLHelper.checkGLVersion1(2) ) { /* 支持GLES20*/}
if ( GLHelper.checkGLVersion1(3) ) { /* 支持GLES20*/}

if ( GLHelper.checkGLVersion2(mainActivity, 2.0) ) { /* 支持GLES20*/}
if ( GLHelper.checkGLVersion2(mainActivity, 3.0) ) { /* 支持GLES20*/}
if ( GLHelper.checkGLVersion2(mainActivity, 3.1) ) { /* 支持GLES20*/}

后记:
实际测试的时候发现,v1版本的函数不好使, 不论怎样都能创建出来对应的context.(gles,3/2/1)
偶遇v2的代码,实测比v1好用。
但是v1是官方文档推荐的方法,但不知道为什么不好使,可能是哪些字段参数传递的不正确。如果您知道,请指点一下。


参考资料:
创建一个安卓程序:https://developer.android.com/training/basics/firstapp
在设备上开启"开发者选项":https://developer.android.com/studio/debug/dev-options
检测OpenGL版本(v1):https://developer.android.com/guide/topics/graphics/opengl#version-check
检测OpenGL版本(v2):https://stackoverflow.com/questions/15804365/is-there-any-way-to-get-gpu-informatio
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值