Android Surface 使用总结

原文链接: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。单向的,不是交换。

 

posted @ 2021-01-22 17:08  SaraMorning  阅读(734)  评论(0编辑  收藏  举报