OpenHarmony开源社区
直播中

ss

8年用户 8762经验值
擅长:电源/新能源 制造/封装 RF/无线
私信 关注
[经验]

基于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做完显示窗口的初始化动作后,开始绘制图像。
  源码分析
  启动
  服务启动配置graphic.cfg在foundation/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端完成送显。

更多回帖

发帖
×
20
完善资料,
赚取积分