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。单向的,不是交换。

更多相关文章

  1. 一句话锁定MySQL数据占用元凶
  2. Android应用数据存储几种方式(2)
  3. android:三种菜单(Menu)的设置
  4. Android——使用ContentProvider在应用间传递数据
  5. Pro Android学习笔记(五):了解Content Provider(上)
  6. Android监听程序进入后台,或者恢复到前台
  7. android小项目打地鼠(五)
  8. Android(安卓)网络提交数据(使用Asynchronous Http Client)
  9. Android(安卓)学习之那些年我们遇到的BUG8:ArrayAdapter 直接使用

随机推荐

  1. Android(安卓)Animation 框架
  2. 如何让Android开机不锁屏
  3. View事件分发机制
  4. RTC搭建android下三层应用程序访问服务器
  5. Android(安卓)Makefile中是 如何识别 TAR
  6. Android(安卓)Telephony 框架分析
  7. Android(安卓)SDK: adb shell 命令的使用
  8. Android(安卓)绑定数据到界面控件
  9. Android如何调用第三方SO库
  10. Android(安卓)官方博客 - Android应用程