关于GLSurfaceView 渲染的那些事


上文咱们说到如何使用GLSurfaceView 进行camera预览,可是关于camera的预览数据是如何渲染到屏幕上的仍是一头雾水,下面咱们就结合源码,说一说GLSurfaceView 渲染的那些事。函数

1、仍是从camera预览做为切入点,在预览的时候会建立和绑定一个纹理即SurfaceTexture,而后经过Camera调用setPreviewTexture并将建立的纹理作为参数传进去。而后Camera会同JNI桥梁调用到Camera.cpp中spa


获取IGraphicBufferProducer本地代理gbp,而后传给Service端camera->setPreviewTarget(gbp)。当打开一个Camera时会实例一个Client,而后由Client去设置一个预览的窗口。线程


当ap端设置完Camera参数开启预览startPreview,经过IPC通知Client状态改成previewEnabled,而后Client端会调用Camera的硬件接口层初始化预览窗口信息。3d


camera预览就介绍这里,本文的重点是介绍数据的渲染。代理

2、回过头在来看下MyGLSurface代码。orm


深刻源码看下setRenderer都干了什么。

setRenderer函数主要干了2件事,一个是给View设置一个渲染器对象二是开启渲染线程。线程start后执行guardedRun,run函数一个while(true)循环,渲染数据。对象


到此咱们看见了一个关键词Draw,draw你们都很熟悉,给个Paint和Canvas就能够往画布上画东西了。可是画布咱们已经有了就是当前这个View,可是画什么呢?blog

前面咱们说预览的时候会给Camera建立一个纹理,这个纹理会和咱们渲染关系吗?在继续往下面看代码接口


从上述代码中看跟SurfaceTexture有关的就2个函数updateTexImage和getTransformMatrix,咱们一个一个分析,先看updateTexImage函数,get

updateTexImage函数注释是这样写的:Update the texture image to the most recent frame from the image stream,意思是说,从OpenGL上下文线程,即当前渲染线程中更新图像数据流最近的一帧纹理图像。也是经过JNI桥梁获取到GLConsumer而后调用GLConsumer对象的updateTexImage,如图:


上述流程总结下大体是这样的。

一、获取BufferItem,建立EglImage对象

二、更新GLConsumer状态,computeCurrentTransformMatrixLocked对当前的buffer进行矩阵变换处理

三、绑定EglImage到GL texture,doGLFenceWaitLocked,判断当前mCurrentFence是否有效。等待新的buffer ready。
2、getTransformMatrix


获取刚刚计算获得的变换矩阵。而后调用OpenGL接口开始绘制。


以上就是对渲染这部分的解析,可能会有些不太准备的地方,还请各位指正。

下面是上述分析中涉及到源码部分的路径:


原创不易,若是您以为好,能够分享此公众号给你更多的人。

相关文章
相关标签/搜索