GLSurfaceView提供了下列特性:
1> 管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。
2> 管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
3> 用户自定义渲染器(render)。
4> 让渲染器在独立的线程里运作,和UI线程分离。
5> 支持按需渲染(on-demand)和连续渲染(continuous)。
6> 一些可选工具,如调试。
概念:
Display(EGLDisplay) 是对实际显示设备的抽象。
Surface(EGLSurface)是对用来存储图像的内存区域FrameBuffer的抽象,包括Color Buffer, Stencil Buffer ,Depth Buffer.
Context (EGLContext) 存储OpenGL ES绘图的一些状态信息。
步骤:
获取EGLDisplay对象
初始化与EGLDisplay 之间的连接。
获取EGLConfig对象
创建EGLContext 实例
创建EGLSurface实例
连接EGLContext和EGLSurface.
使用GL指令绘制图形
断开并释放与EGLSurface关联的EGLContext对象
删除EGLSurface对象
删除EGLContext对象
终止与EGLDisplay之间的连接。
GLSurfaceView的绘制流程

由上图可知,GLSurfaceView的主要绘制过程都是在一个子线程中完成,即整个绘制最终都是guardenRun()中完成。在这个过程中完成了整个EGL绘制的所有步骤。
我把guardenRun()的大多数细节代码都删掉了,剩下一些精华:
private void guardedRun() throws InterruptedException {
while (true) {
synchronized (sGLThreadManager) {
while (true) {
// Ready to draw?
if (readyToDraw()) {
// If we don't have an EGL context, try to acquire one.
if (! mHaveEglContext) {
if (sGLThreadManager.tryAcquireEglContextLocked(this)) {
mEglHelper.start();
}
}
sGLThreadManager.wait();
}
} // end of synchronized(sGLThreadManager)
if (createEglSurface) {
if (mEglHelper.createSurface()) {
...
}
}
if (createGlInterface) {
gl = (GL10) mEglHelper.createGL();
}
if (createEglContext) {
if (view != null) {
view.mRenderer.onSurfaceCreated(gl, mEglHelper.mEglConfig);
}
}
if (sizeChanged) {
if (view != null) { <

本文详细介绍了GLSurfaceView的渲染过程,包括管理Surface、EGL显示、上下文创建、表面创建等步骤。GLSurfaceView在单独线程中执行绘制,其核心是guardianRun()方法,该方法包含了EGL生命周期的关键操作。同时,文章讨论了如何通过设置RenderMode来优化性能,以及处理事件的注意事项,强调了在不同线程中调用OpenGL ES API的潜在问题。最后,GLSurfaceView使用OpenGL ES渲染引擎,不同于View的Skia渲染。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



