生产消费模型
BufferQueue
Android通过BufferQueue管理图像图层数据的跨进程传输。BufferQueue的两端分别是图像数据的生产者和消费者。
GraphicBuffer
单帧图像,系统分配和回收.
Buffer传递通过文件句柄.BufferQueue有2-3个GraphicBuffer.
Surface
生产者.native层是ANativeWindow形式. 由WMS(WindowManagerService)管理.
SurfaceFlinger 是一种消费者
接受多个来源的图形显示数据,将他们合成,然后发送到显示设备。
SurfaceTexture
一种消费者, 消费图像数据. Buffer转换为GL的纹理(Texture). 创建后由Surface连接, Surface有个构造函数参数是SurfaceTexture.
Surface 使用
应用窗口
应用窗口包括Activity和Dialog,他们的显示Surface都是通过请求WMS(WindowManagerService)创建,最终由SurfaceFlinger创建。
在生产者这一端,应用可以通过CPU在Canvas上作图,也可以通过转换为GLSurface,有GL作图。
消费者即为SurfaceFlinger的Layer,在hardware支持的情况下,也可能由硬件composer消耗。
SurfaceView
SurfaceView有独立与应用窗口的Surface,同样也可以由应用通过Canvas或者GL作图,更常见的是交由MediaCodec(视频播放)或者Camera(视频录制)填充数据。
- 优点:
可以在一个独立的线程中进行绘制,不会影响主线程
使用双缓冲机制,播放视频时画面更流畅 - 缺点:
Surface不在View hierachy中,它的显示也不受View的属性控制,所以不能进行平移,缩放等变换,也不能放在其它ViewGroup中。SurfaceView 不能嵌套使用。
TextureView
TextureView将图像数据转换为GL的Texture,并显示在应用窗口上,因此其显示的内容与应用窗口的其他元素是时间同步的。
TextureView的SurfaceTexture可以转换为Surface来使用,通过Canvas或者GL作图,也可以由MediaCodec或者Camera填充数据。
- 优点:
支持移动、旋转、缩放等动画,支持截图 - 缺点:
必须在硬件加速的窗口中使用,占用内存比SurfaceView高,在5.0以前在主线程渲染,5.0以后有单独的渲染线程。
MediaCodec
在视频编码场景,与视频播放情况相反,由MediaCodec创建Surface,该Surface可以由应用、Camera填充数据。
VirtualDisplay
VirtualDisplay向Surface填充数据,由SurfaceFlinger管理,SurfaceFlinger将Layer读到到数据也通过GL叠加合成到VirtualDisplay上。如果将VirtualDisplay于TextureView结合,你将会看到图像无穷递归的科幻场景