美文网首页Android系统源码分析
Android WMS(二)-Surface管理

Android WMS(二)-Surface管理

作者: Stan_Z | 来源:发表于2019-07-23 13:34 被阅读27次

    一、捋清View、WindowState、Surface的关系

    这部分牵扯到的是视图绘制渲染架构。

    这里主要分三部分:

    1)添加Window(WMS与应用层通信)
    ViewRootImpl.setView()方法会向WMS请求添加一个Window,mWindowSession.addToDisplay()跨进程最终调用到了WMS.addWindow(): 这里会创建WindowState,它是WMS中描述应用程序窗口的对象。

    2)与SurfaceFlinger建立连接(WMS与SurfaceFlinger通信)
    WMS.addWindow()中WindowState通过attach方法建立建立一个SurfaceSession走windowAddedLocked()流程与SurfaceFlinger进行连接:
    ComPoserService作为client 与 SurfaceFlinger server进行binder IPC , 获取到SurfaceFlinger创建的Client对象,它相当于是SurfaceFlinger内部对应用程序客户端的封装对象,而Client与SurfaceComposerClient又互为binder ipc的两端,SurfaceComposerClient为client端,Client为server端。

    3)创建Surface(WMS分别与应用程序和SurfaceFlinger通信)

    Surface是真正UI视图的载体和处理者。
    ViewRootImpl内会new一个Surface,ViewRootImpl 、WindowState与Surface是一一对应关系。
    创建Surface主要走的是ViewRootImpl setView操作的requestLayout流程中的relayoutWindow部分:
    这个过程实际上就是在SurfaceFlinger创建Layer,对应在客户端通过SurfaceControl在native层创建Surface并copyForm返回给ViewRootImpl内java层的Surface,为什么这么麻烦?因为Surface主要负责调用绘制引擎执行渲染视图的操作,这部分工作在native效果更高。并且Android4.0之后的硬件加速绘制,渲染过程是又native进程RenderThread来负责的。

    三者关系是:

    View是视图的素材;
    WindowState是窗口实体对象,WMS会通过z-order计算来决定窗口的层级关系,为SurfaceFlinger合成Layer提供层级依据。
    Surface是View的载体和处理者。它会调用绘制引擎处理View,然后申请一块buffer,存入绘制素材,传递给SurfaceFlinger。

    具体可以参考之前图形系统文章:
    Android图形系统(五)-Surface图形系统概览
    Android图形系统(六)-app与SurfaceFlinger服务连接过程
    Android图形系统(七)-app请求SurfaceFlinger创建Surface过程
    Android图形系统(八)-app与SurfaceFlinger共享UI元数据过程
    Android图形系统(九)-View、Canvas与Surface的关系
    Android图形系统(十)-SurfaceFlinger启动及图层合成送显过程

    二、视图绘制的整体流程

    梳理ViewRootImpl#scheduleTraversals( )流程,主要参与的有如下几个模块:

    HwComposer: 产生vsync信号
    周期性唤醒DipsSyncThread产生虚拟化Vsync信号,EventThread负责请求和分发vsync信号分别到app与surfaceFlinger。

    UIThread: 绘制
    通过Choreographer请求vsync信号,接收信号执行doFrame,走绘制流程,初始化RenderThread并最终draw出DisplayList。

    RenderThread: 渲染
    同步DisplayList数据;dequeueBuffer;渲染数据并保存到buffer;queueBuffer同时更新Layer并触发invalidate-sf-vsync请求。

    SurfaceFlinger: 合成送显
    INVALIDATE:接收invalidate-sf-vsync请求,acquireBuffer更新脏区域、发送refresh-sf-vsync请求。
    REFRESH:接收refresh-sf-vsync请求,按z-order计算可见区域,合成视图并做栅格化处理,通过FrameBuffer送显。

    最后总结一张手绘的整体流程图:

    视图绘制整体流程图

    具体可以参考之前图形系统文章:
    Android图形系统(十一)-Choreographer
    Android图形系统(十三)-Vsync信号处理
    Android9.0 硬件加速(二)-RenderThread线程的启动
    Android9.0 硬件加速(三)-绑定Surface到RenderThread
    Android9.0 硬件加速(四)-UI Thread绘制过程
    Android9.0 硬件加速(五) -RenderThread渲染过程
    从systrace看app冷启动过程(三)-首帧的合成与送显

    相关文章

      网友评论

        本文标题:Android WMS(二)-Surface管理

        本文链接:https://www.haomeiwen.com/subject/ebpolctx.html