[TOC]

文章参考:https://zhuanlan.zhihu.com/p/271270354

文章参考:https://zhuanlan.zhihu.com/p/145331514

概述

Android对OpenGL这块封装是非常好的,也是非常隐蔽的,一般使用者直接使用GLSurfaceView即可达到需求。最近项目中将很多功能下层到c++层,这样必须对OpenGL 底层逻辑有所了解。Android虽然提供OpenGL 各个版本的So库,但是并没有对底层api做封装,所以如果是自己想用C++写OpenGL,最好的方式学习Android源码。

GLSurfaceView使用

1
2
3
4
5
6
7
8
9
10
11
12
13
surfaceView = findViewById(R.id.triangle_api_surfaceView)
surfaceView.setEGLContextClientVersion(3)
surfaceView.setRenderer(object : GLSurfaceView.Renderer {
override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {
TODO ("surface被创建后需要做的处理,包括顶点、纹理数据的处理")
}
override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) {
TODO ("渲染窗口大小发生改变的处理,在视频播放是可以用来调整分辨率变化的视图窗口,或者3D动画中坐标系转换等")
}
override fun onDrawFrame(gl: GL10?) {
TODO("加载顶点、纹理数据并执行渲染工作")
}
}

可以看到使用GLSurfaceView非常简单,只要APP开发者实现以下三个方法:

1
2
3
4
5
onSurfaceCreated(gl: GL10?, config: EGLConfig?) 

onSurfaceCreated(gl: GL10?, config: EGLConfig?)

onDrawFrame(gl: GL10?)

GLSurfaceView渲染模式

OpenGl ES关于渲染方式有以下两种:RENDERMODE_CONTINUOUSLY和RENDERMODE_WHEN_DIRTY。

ß默认渲染方式为RENDERMODE_CONTINUOUSLY,当设置为RENDERMODE_CONTINUOUSLY时渲染器会不停地渲染场景,当设置为RENDERMODE_WHEN_DIRTY时只有在创建和调用requestRender()时才会刷新。

一般设置为RENDERMODE_WHEN_DIRTY方式,这样不会让CPU一直处于高速运转状态,提高手机电池使用时间和软件整体性能。

GLSurfaceView源码解析

在分析GLSurfaceView源码之前我们非常有必要介绍一下GLSurfaceView的使用方法: