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

  • 相关阅读:
    Spring shiro 初次使用小结
    Spring data Redis
    Redis 学习相关的网站
    Spring依赖注入 — util命名空间配置
    添加至数据库的中文显示问号
    freemarker的classic_compatible设置,解决报空错误
    HTTP协议
    Maven添加本地Jar包
    java中的字符串分割函数
    读取文件方法大全
  • 原文地址:https://www.cnblogs.com/WillingCPP/p/14544324.html
Copyright © 2011-2022 走看看