Android的图形架构

基础概念:
BufferQueue: 将生成图形数据缓冲的模块与接收缓冲数据进行渲染或者进一步处理的模块连接起来。
缓冲的内存分配是通过gralloc 内存的分配者通过HAL接口来实现的。
SurfaceFlinger:从多个源接收缓冲数据然后组合并且发送到显示设备。生产者那边将一个Binder通过WindowManager传递给app,然后数据就可以发送给SurfaceFlinger。当vsync信号到来后,SurfaceFlinger将遍历它的layer来寻找新的buffer数据,如果有新的就获取新的数据否则就继续用老的数据。当收集好所有的buffer数据后,它将向HAL获取组装数据的方式。
Hardware Composer(HAL)根据可用硬件决定组装buffer的最高效的方式。
Surface:生成被SurfaceFlinger消费的buffer queue。当在Surface上渲染的时候,最终是将缓冲发送到消费者如显示设备。
SurfaceHolder:任何与View相关的操作都与SurfaceHolder有关,SurfaceHolder有关的api如设置Surface的大小和格式。
SurfaceView包含了一个Surface和view。SurfaceView的内容是由SurfaceFlinger来组合的,渲染的是由一个单独的线程进行的。
SurfaceTexture包含了一个Surface和一个GLES texture。它们创建了一个BufferQueue。
生产者送入一个新的buffer,通知app,app释放之前持有的buffer,从bufferqueue中获取这个新buffer,然后发出EGL call,来让这个buffer可以给GLES作为一个external texture。
TextureView将一个View和一个SurfacTexture结合起来。TextureView负责响应回调和获取新的数据buffer,内容的更新会引起其他view元素的重绘。即TextureView是与UI层一起绘制的。


Surface生成数据--->SurfaceFlinger组装数据-->交由渲染模块显示


SurfaceTexture:

新数据加入BufferQueue-->生成回调onFrameAvailable()-->调用updateTexImage()释放之前持有的数据,从队列中获取新的数据,并且发出一些EGL call来将新的可用的buffer可供GLES作为oes texture使用-->SurfaceView显示视频画面
External textures(GL_TEXTURE_EXTERNAL_OES)和GL_TEXTURE_2D不太一样。

Android的图形架构_第1张图片


你可能感兴趣的:(Android)