在AndroidManifest.xml添加是否支持的
<!-- 设置gl版本 -->
<uses-feature
android:glEsVersion="0x00030000"
android:required="true" />
代码判断是否支持opengl
private void checkSupported() {
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
supportsEs2 = configurationInfo.reqGlEsVersion >= 0x2000;
boolean isEmulator = Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1
&& (Build.FINGERPRINT.startsWith("generic")
|| Build.FINGERPRINT.startsWith("unknown")
|| Build.MODEL.contains("google_sdk")
|| Build.MODEL.contains("Emulator")
|| Build.MODEL.contains("Android SDK built for x86"));
supportsEs2 = supportsEs2 || isEmulator;
}
GLSurfaceView设置
- 常用
//设置渲染器
setRenderer()
//设置OpenGl ES的版本 2->2.0 ,3->3.0
setEGLContextClientVersion()
//设置渲染的模式(连续和手动)
setRenderMode()
//告诉它的画笔(GLSurfaceView.Renderer),要重新画画(渲染)
requestRender()
- 其他
setDebugFlags(int)
setEGLConfigChooser(boolean)
setEGLConfigChooser(EGLConfigChooser)
setEGLConfigChooser(int, int, int, int, int, int)
setGLWrapper(GLWrapper)
GLSurfaceView.Renderer 渲染器
渲染器运行的环境是opengl特定的环境,在一个独立的线程里面,这个线程也称之为gl线程,所以所有的gl程序处理都是围绕这个渲染器的以下三个回调函数
- onSurfaceCreated
它是在Surface创建的时候被调用
在这个回调里面我们一般做gl的初始化工作以及准备一些固定数据,例如gl程序的创建,连接,加载都应该在这个回调来做
- onSurfaceChanged
当GLSurfaceView大小改变时,对应的Surface大小也会改变。值得注意的是,
在Surface刚创建的时候,它的size其实是0,也就是说在画第一次图之前它也会被调用一次的。
(而且对于很多时候,Surface的大小是不会改变的,那么此函数就只在创建之初被调用一次而已)
- onDrawFrame
这个函数是交给用户做绘制工作的,每调用一次就画一幅图
这个函数在第一次调用完之后,会根据模式不同调用的方式也不同,调用模式由GLSurfaceView的setRenderMode(int renderMode)决定,有两种模式:第一种模式(RENDERMODE_CONTINUOUSLY):
连续不断的刷,画完一幅图马上又画下一幅。这种模式很明显是用来画动画的;第二种模式(RENDERMODE_WHEN_DIRTY):
只有在需要重画的时候才画下一幅。这种模式就比较节约CPU和GPU一些,适合用来画不经常需要刷新的情况。
多说一句,系统如何知道需要重画了呢?当然是你要告诉它……
调用GLSurfaceView的requestRender ()方法,告诉它,你脏了。