原文链接:https://blog.csdn.net/luansxx/article/details/86622353
1、Surface的本质
1.1、BufferQueue
Android通过BufferQueue管理图像图层数据的跨进程传输。BufferQueue的两端分别是图像数据的生产者和消费者。
1.2、GraphicBuffer
GraphicBuffer(简称Buffer)是BufferQueue传递的数据,一个Buffer包含一帧图像,Buffer由gralloc分配和回收。根据需求Buffer可能来源于普通内存,也可能是硬件专有内存池中的。
一个BufferQueue一般有2~3个Buffer,按需分配。Buffer传递通过文件句柄,不存在大数据的拷贝。收到Buffer的进程需要映射到虚拟地址空间才能访问,当然也可以不通过CPU访问,而是由其他硬件设备直接访问(通过DMA等)。
1.3、Productor
图像数据的生产者,Surface就是一种Productor,Surface在native层是ANativeWindow形式。
1.4、Consumer
图像数据的消费者,一般应用产生的图像被SurfaceFlinger消耗,其Layer是一种Consumer,将Buffer转换为GL的Texture,通过GL完成多个图层的叠加合成。
1.5、SurfaceTexture
将Buffer转换为GL的纹理(Texture),可以认为是图像数据的消费者,一般由消费者创建,等待生产者连接。
2、Surface的使用
2.1、应用窗口
应用窗口包括Activity和Dialog,他们的显示Surface都是通过请求WMS(WindowManagerService)创建,最终由SurfaceFlinger创建。
在生产者这一端,应用可以通过CPU在Canvas上作图,也可以通过转换为GLSurface,有GL作图。
消费者即为SurfaceFlinger的Layer,在hardware支持的情况下,也可能由硬件composer消耗。
2.2、SurfaceView
SurfaceView有独立与应用窗口的Surface,同样也可以由应用通过Canvas或者GL作图,更常见的是交由MediaCodec(视频播放)或者Camera(视频录制)填充数据。
2.2、TextureView
TextureView将图像数据转换为GL的Texture,并显示在应用窗口上,因此其显示的内容与应用窗口的其他元素是时间同步的。
TextureView的SurfaceTexture可以转换为Surface来使用,通过Canvas或者GL作图,也可以由MediaCodec或者Camera填充数据。
2.3、MediaCodec
在视频编码场景,与视频播放情况相反,由MediaCodec创建Surface,该Surface可以由应用、Camera填充数据。
2.4、VirtualDisplay
VirtualDisplay向Surface填充数据,由SurfaceFlinger管理,SurfaceFlinger将Layer读到到数据也通过GL叠加合成到VirtualDisplay上。如果将VirtualDisplay于TextureView结合,你将会看到图像无穷递归的科幻场景。
3、Surface的生命期
3.1、BufferQueue
BufferQueue 由 SurfaceFlinger 创建,被同时创建的 IGraphicBufferrProducer 可能引用。
IGraphicBufferrProducer 被 SurfaceControl 和 Surface 持有。IGraphicBufferrProducer 由自身的引用计数管理生命期。
SurfaceControl 可以提前 destory BufferQueue ,不需要得到所有引用释放。
3.2、Native Surface
Native 层的 Surface 从 IGraphicBufferrProducer (实际是BufferQueue)创建,通过引用计数管理生命期。
3.3、Java Surface
Java Surface 持有 Native Surface 指针,并且持有一个引用计数。
Java Surface 可以从 SurfaceTexture 创建,实际是获取 SurfaceTexture 里面的 producer 来创建 Native Surface。
Java Surface 的 release 方法释放 Native Surface 指针,并减少引用计数。
Java Surface 的 destory 方法只是 release 的别名。
两个 Java Surface 可以移动持有的 Native Surface。单向的,不是交换。