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

  • 相关阅读:
    学习 CosmosDB (NoSql)
    <linux-sed> sed基本用法
    grep 正则表达式用引号括起来和元字符加反斜杠转义的测试
    CACTI批量添加linux主机sh脚本
    一个简单的C共享库的创建及Python调用此库的方法
    Linux下的C的开发之GCC的初级使用
    AcitveReocrd事件和关联操作
    Samrty技术的 初步了解
    Ubuntu下配置Tomcat
    在ubuntu中安装jdk
  • 原文地址:https://www.cnblogs.com/SaraMoring/p/14314323.html
Copyright © 2020-2023  润新知