1 简介
标准系统提供了图形接口能力和窗口管理接口能力, 支持应用程序框架子系统和ACE等子系统使用。故可以根据不同硬件系统选择编译不同模块,选择适配轻量系统或者标准系统。图形子系统主要包括UI组件、布局、动画、字体、输入事件、窗口管理、渲染绘制等模块。

以下主要分析标准系统能力。代码版本是OpenHarmony3.1版本。
开机动画是鸿蒙系统启动后,运行的第一个和图形渲染相关的进程,相关依赖相对独立便于分析,是分析图形子系统比较好的切入点。图形子系统主要依赖窗口、surface、render service。
目录

Graphic子系统 提供了图形接口能力和窗口管理接口能力, 支持应用程序框架子系统和ACE等子系统使用。支持所有运行标准系统的设备使用。
其主要的结构如下图所示:

Surface
图形缓冲区管理接口,负责管理图形缓冲区和高效便捷的轮转缓冲区。依赖Display driver开辟buffer及buffer管理。
Vsync Client
垂直同步信号管理接口,负责管理所有垂直同步信号注册和响应。
WindowManager
窗口管理器接口,负责创建和管理窗口。
IPC/RPC
通信
进程间通信协议,支持渲染客户端和服务端建立连接、申请buffer、刷新buffer等
Render Service ohos
render service适配ohos的部分,属于render service的基础能力,其中适配了ohos的render service client及IPC代理能力
Compositor
图像合成送显,依赖Display driver和Surface,管理buffer及送显。
Input Manager
多模输入模块,负责接收事件输入
Skia
第三方渲染接口,支持CPU和GPU渲染情况下的画布绘制
Render Service Base
render service的基础能力,包含Render Service ohos
主要流程
CPU渲染
申请buffer

创建画布

说明:GPU渲染时,获取buffer没有经过render service server,而是在client端用skia完成,在用egl做完显示窗口的初始化动作后,开始绘制图像。
源码分析
启动
服务启动配置graphic.cfg在founda
tion/graphic/standard/graphic.cfg目录,分别启动了bootanimation和render_service进程。

初始化
void BootAnimation::Init(int32_t width, int32_t height)

说明:
Init函数会初始化surface。
InitBootWindow创建启动窗口,通过WindowScene调用WindowImpl创建RSSurfaceNode对象。
RSSurfaceNode对象可在InitRsSurface中创建surface。
UnzipFile输入参数都是固定的,分别为zip包和输出目录。
CountPicNum会对输出目录下的图片进行统计。
Draw对解压出来的开机图片进行绘制渲染。
PostTask设置开机动画结束退出回调。
void BootAnimation::InitRsSurface()
说明:
ExtractRSSurface则是在InitBootWindow获得的RSSurfaceNode的基础上获取surface。
绘制流程
1.获取RSSurface,当是CPU渲染的时候获取的是个RSSurfaceOhosRaster对象,GPU渲染时是个RSSurfaceOhosGl对象,这个地方获取RSRenderServiceConnectionProxy就是IPC机制的应用。

2.绘制开机图片,逐个图片加载渲染,渲染时flush的过程参考获取buffer的过程,flush会把buffer发送到render service server端合成送显。

说明:
MakeFromFILE加载图片。
MakeFromEncoded对加载图片数据进行转化。
SkCanvas通过drawRect和drawImageRect绘制图像。
FlushFrame把画布数据送显,经过IPC通信会把buffer信息传到server端BufferQueue。总体过程参考申请buffer的过程。

说明:
DoFlushBuffer会调用display驱动FlushCache。
OnBufferAvailable调用的是RSRenderServiceListener::OnBufferAvailable,进行可用buffer计量,同时会通知Vsync可以同步。
3.递归刷新图片,把BootAnimation::Draw注册成回调函数,在DispatchMain中循环调用,达到逐个图片渲染的效果。

说明:
会通过VsyncHelper注册回调,定时调用Draw。
总结
开机动画的CPU渲染过程是从render_service获取buffer,在client端用buffer+skia创建canvas,进行绘制。逐个图片flush到render service server端,在server端完成送显。