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

  • 相关阅读:
    cyq.data 常见使用方法
    JS生成随机数进行循环匹配数组
    CSS3常用的循环动画
    JSSDK调用微信原生的功能上传图片保存到自己的服务器中
    C#图片压缩
    nodejs使用vue从搭建项目到发布部署
    JS在一个数组中查找某个用户输入的值,返回对应值所在索引值
    转载文章记录篇
    随笔诗词-1
    mobilebone与weiui_example.css 使用问题
  • 原文地址:https://www.cnblogs.com/WillingCPP/p/14544324.html
Copyright © 2020-2023  润新知