OpenHarmony——Graphic子系统之开机动画 原创 精华
作者:曹璀
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做完显示窗口的初始化动作后,开始绘制图像。可参考
OpenGLES 与 EGL 基础概念 - 知乎 (zhihu.com)
源码分析
启动
服务启动配置graphic.cfg在foundation/graphic/standard/graphic.cfg目录,分别启动了bootanimation和render_service进程。
初始化
说明:
- Init函数会初始化surface。
- InitBootWindow创建启动窗口,通过WindowScene调用WindowImpl创建RSSurfaceNode对象。
- RSSurfaceNode对象可在InitRsSurface中创建surface。
- UnzipFile输入参数都是固定的,分别为zip包和输出目录。
- CountPicNum会对输出目录下的图片进行统计。
- Draw对解压出来的开机图片进行绘制渲染。
- PostTask设置开机动画结束退出回调。
说明:
- 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端完成送显。
更多原创内容请关注:深开鸿技术团队
入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。
图形子系统的讲解必须支持一波