一个简单的问题:如何获取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