android Surface相关

生产消费模型

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结合,你将会看到图像无穷递归的科幻场景

原文地址:https://www.cnblogs.com/WillingCPP/p/14544324.html