Android 显示框架:Surface详解之一

1、Surface图形系统概览

Surface是一个显示系统中的组件,无论是在图形系统的结构之中,还是在生产消费模型的流程之中都做作为一个举足轻重的角色,参与整个安卓的显示生命周期之中。

我们摘抄了两段谷歌对surface的描述作为贯穿整个文章的中心:
1.A surface is an interface for a producer to exchange buffers with a consumer.
2.No matter what rendering API developers use, everything is rendered onto a surface. The surface represents the producer side of a buffer queue that is often consumed by SurfaceFlinger. Every window that is created on the Android platform is backed by a surface.

  • 下图是安卓官网对于安卓图形架构组成的说明
    • 其中High-level components 是在编写安卓程序时使用到的具体类,安卓app通过控制这些工具,来间接控制surface在底层的使用。
    • 其中Low-level components 是真正属于在framework层中的图形显示实践。

在这里插入图片描述

  • 下图是整个Low-level components的Graphic Oerview,着重说明了整个显示系统的流转。我们从每个组件,每个箭头来一一分析。
    在这里插入图片描述

我们将整个过程当做一次美术博物馆的展出,便于理解这些组件在显示过程中的作用。

1.1 IMAGE STREAM PRODUCERS

在这里插入图片描述
位于生产消费模型的生产端,所有可以生成buffer data 的内容。读取media中的内容,读取camera中的内容,用NDK生成图像,用OpenGL生成图像等等。他们都可以作为纯粹的画家,也就是内容生产者。
他们既决定Buffer Data中的内容,也同时决定“取景框”Windows的大小位置。

1.2 NATIVE FRAMEWORK

在这里插入图片描述

  • 在native framework层中,libgui负责构建buffer队列,安排buffer的消费者,组织有序的生产和消费流程。
  • 可以理解为“不懂画但是手握画品的拍卖工厂”。

1.3 WINDOW POSITIONING

在这里插入图片描述

  • 大部分显示系统,无论安卓、windows、qnx都会需要一个window管理,用来管理不同buffer的大小、层级、位置等等信息,在一个屏幕中,尽可能的配合所有画面的内容。
  • 相当于“杂志的排版编辑”

1.4 IMAGE STREAM CONSUMERS

在这里插入图片描述

  • 自此真正的消费者出现了,他们根据排版编辑的排列信息,去到拍卖工厂中的GraphicBufferQueue中,整合信息将展览画面传到屏幕中。SurfaceFlinger会与HWC通信,决定由谁来合成layer画面。

1.5 HAL

在这里插入图片描述

  • 硬件部分的内容,HWC是Android中进行窗口(Layer)合成和显示的HAL层模块,Gralloc是用于给graphicbuffer申请内存地址的。

2 Surface的创建

surface在很多层面都有自己的属性,从base到native。由上而下来看看surface到底是怎么创建的。

2.1 构造函数

  • 第一层:java接口调用
    • 位置:/frameworks/base/core/java/android/view/Surface.java
    /**
     * Create an empty surface, which will later be filled in by readFromParcel().
     * @hide
     */
    public Surface() {
   
    }

    /**
     * Create Surface from a {@link SurfaceTexture}.
     *
     * Images drawn to the Surface will be made available to the {@link
     * SurfaceTexture}, which can attach them to an OpenGL ES texture via {@link
     * SurfaceTexture#updateTexImage}.
     *
     * Please note that holding onto the Surface created here is not enough to
     * keep the provided SurfaceTexture from being reclaimed.  In that sense,
     * the Surface will act like a
     * {@link java.lang.ref.WeakReference weak reference} to the SurfaceTexture.
     *
     * @param surfaceTexture The {@link SurfaceTexture} that is updated by this
     * Surface.
     * @throws OutOfResourcesException if the surface could not be created.
     */
    public Surface(SurfaceTexture surfaceTexture) {
   
		....
        mIsSingleBuffered = surfaceTexture.isSingleBuffered();
        synchronized (mLock) {
   
            mName = surfaceTexture.toString();
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值