Android SDK中无需GLSurfaceView,如何以编程方式获取GPU信息?
Android 无需创建GLSurfaceView获取GPU信息
核心思路
直接通过EGL API创建离屏的OpenGL上下文,无需依赖任何View组件,就能获取GPU相关信息。这种方式不会改动宿主应用的视图层级,完全在后台完成。
实现步骤与代码示例
- 初始化EGL显示连接
- 选择合适的EGL配置
- 创建EGL上下文
- 激活上下文并调用OpenGL API获取信息
- 释放EGL资源
以下是完整的实现代码:
import android.opengl.EGL14; import android.opengl.EGLConfig; import android.opengl.EGLContext; import android.opengl.EGLDisplay; import android.opengl.EGLSurface; import android.opengl.GLES20; import java.util.ArrayList; import java.util.List; public class GpuInfoHelper { public static GpuInfo getGpuInfo() { EGLDisplay eglDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY); if (eglDisplay == EGL14.EGL_NO_DISPLAY) { return null; } int[] version = new int[2]; if (!EGL14.eglInitialize(eglDisplay, version, 0, version, 1)) { return null; } // 配置属性列表 int[] configAttribs = { EGL14.EGL_RED_SIZE, 8, EGL14.EGL_GREEN_SIZE, 8, EGL14.EGL_BLUE_SIZE, 8, EGL14.EGL_ALPHA_SIZE, 8, EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT, EGL14.EGL_NONE }; EGLConfig[] configs = new EGLConfig[1]; int[] numConfigs = new int[1]; if (!EGL14.eglChooseConfig(eglDisplay, configAttribs, 0, configs, 0, configs.length, numConfigs, 0)) { EGL14.eglTerminate(eglDisplay); return null; } EGLConfig eglConfig = configs[0]; // 创建上下文属性列表 int[] contextAttribs = { EGL14.EGL_CONTEXT_CLIENT_VERSION, 2, EGL14.EGL_NONE }; EGLContext eglContext = EGL14.eglCreateContext(eglDisplay, eglConfig, EGL14.EGL_NO_CONTEXT, contextAttribs, 0); if (eglContext == EGL14.EGL_NO_CONTEXT) { EGL14.eglTerminate(eglDisplay); return null; } // 创建离屏表面(Pbuffer) int[] surfaceAttribs = { EGL14.EGL_WIDTH, 1, EGL14.EGL_HEIGHT, 1, EGL14.EGL_NONE }; EGLSurface eglSurface = EGL14.eglCreatePbufferSurface(eglDisplay, eglConfig, surfaceAttribs, 0); if (eglSurface == EGL14.EGL_NO_SURFACE) { EGL14.eglDestroyContext(eglDisplay, eglContext); EGL14.eglTerminate(eglDisplay); return null; } // 激活上下文 if (!EGL14.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)) { EGL14.eglDestroySurface(eglDisplay, eglSurface); EGL14.eglDestroyContext(eglDisplay, eglContext); EGL14.eglTerminate(eglDisplay); return null; } // 获取GPU信息 String vendor = GLES20.glGetString(GLES20.GL_VENDOR); String renderer = GLES20.glGetString(GLES20.GL_RENDERER); String version = GLES20.glGetString(GLES20.GL_VERSION); String extensionsStr = GLES20.glGetString(GLES20.GL_EXTENSIONS); List<String> extensions = new ArrayList<>(); if (extensionsStr != null) { for (String ext : extensionsStr.split(" ")) { extensions.add(ext); } } // 释放资源 EGL14.eglMakeCurrent(eglDisplay, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_CONTEXT); EGL14.eglDestroySurface(eglDisplay, eglSurface); EGL14.eglDestroyContext(eglDisplay, eglContext); EGL14.eglTerminate(eglDisplay); return new GpuInfo(vendor, renderer, version, extensions); } public static class GpuInfo { public final String vendor; public final String renderer; public final String version; public final List<String> extensions; public GpuInfo(String vendor, String renderer, String version, List<String> extensions) { this.vendor = vendor; this.renderer = renderer; this.version = version; this.extensions = extensions; } } }
代码说明
- 使用
EGL14API创建离屏的Pbuffer表面,无需绑定到任何View - 通过
GLES20.glGetString()获取所需的GPU信息:GL_VENDOR:GPU供应商名称GL_RENDERER:GPU渲染器名称GL_VERSION:OpenGL ES版本GL_EXTENSIONS:支持的扩展列表
- 操作完成后务必释放所有EGL资源,避免内存泄漏
使用注意事项
- 该操作需要在非UI线程执行,避免阻塞主线程
- 确保设备支持OpenGL ES 2.0及以上(代码中指定了
EGL_CONTEXT_CLIENT_VERSION, 2,可根据需求调整为更高版本) - 部分低版本Android设备可能存在EGL实现差异,需做好兼容性测试
内容的提问来源于stack exchange,提问作者Abdul Mateen
相关产品推荐
相关产品推荐

