OpenGL的设计思想是状态机,所有OpenGL调用均可以看作是对某个远端的指令,包括数据发送、状态变更。
在Android上,这个远端即是SurfaceFlinger(中vendor对OpenGL的实现)。
- Bitmap
- 图片信息,存储在内存中
- Paint
- 画笔对象,保存这颜色、线条类型等绘制参数
- Canvas
- 画布,用于对Bitmap/View的绘制操作进行抽象
- 纹理
- OpenGL中的图片信息,存储在OpenGL Host中,本地保存句柄(Android中是int)
- 状态
- OpenGL绘制参数,包括shader uniform参数、纹理参数、深度检测方式等,存储在OpenGL Host中
- OpenGL上下文
- OpenGL绘制上下文,在Android中是EGLContext,对GLSurfaceView或离屏渲染进行抽象
- Android采用面向对象的设计方式,Bitmap/Paint/Canvas都是类,Bitmap/Paint与Canvas没有绑定关系,职责区分明显
- OpenGL基于状态机的设计思想,将OpenGL Host与本地(即我们的app)进行隔离,所有的操作都是在传输数据或者像按开关一样进行远程操纵,纹理、shader等与上下文有绑定关系
- 良好的可扩展性,远端状态通过唯一id进行表示,便于扩展,新增feature时不需要对api进行改动
- 可读性好,所有的状态变更都清晰简洁的展现给开发者
- 性能稍差,状态在上下文中相当于全局变量,无法进行并发调用,因此才有了vulkan