AbilityMain中的Surface使用和窗口合成

AbilityMain中的Surface使用和窗口合成

本文作者:江苏润和软件股份有限公司 郎建中


一、总体介绍
由AppSpawn进程Fork出来的AbilityMain进程 是JS FA应用native的实现载体。其中包含了Ability的生命周期管理、JerryScript引擎初始化和注册内部JS类、JS APP文件读取和在Jerry里运行、以及调用Graphic UI控件进行窗口绘制。架构图如下:
在这里插入图片描述

本文主要专注在窗口的创建、Surface创建使用和在WMS中进行合成送显的过程。对于BufferQueue、BufferQueueProducer、BufferQueueConsumer的关系在另一篇文章《Camera中的Surface使用》有介绍。
约束:本文中所有场景介绍都是指轻量设备侧的鸿蒙系统。

二、代码目录
涉及的代码目录:
foundation/ace :JS应用开发框架代码,包括了JerryScipt引擎等
foundation/graphic/lite :图形框架子系统,包含了ui和WMS、IMS等
foundation/aafwk/frameworks/ability_lite :AbilityMain框架和主程序

三、代码分析
3.1 AbilityMain进程创建Window和Surface的过程

在这里插入图片描述

上面时序图中,蓝色部分是运行在AbilityMain进程中,绿色部分是运行在wms_server进程中。AbilityMain进程就是JS应用的本地实现,wms_server进程就是窗口管理服务(负责窗口管理和合成、IMS)。
在AbilityMain进程中通过调用Window::CreateWindow()函数来创建窗口。代码如下:
在这里插入图片描述
Window类是WindowImpl的基类,只实现了CreateWindow和DestoryWindow两个静态方法。
在CreateWindow中new出来WindowImp实例,并且调用了Create()方法,在Create()完成后,将这个实例通过AddToDisplay()方法加入到RenderManager中,这里不多解析。我们来看看Create()做了什么。
在这里插入图片描述
IWindowsManager::GetInstance()得到的就是LiteProxyWindowsManager,这个类负责AbilityMain进程内的窗口管理,负责创建IWindow实例。
在这里插入图片描述
上面的代码可以看出:LiteProxyWindowManager通过LiteWMRequestor创建出来 LiteWinRequestor对象,然后用这个对象构造了LiteProxyWindow对象(也就是IWindow的实现)。
我们往下看LiteWMRequestor::CreateWindow()的代码:
在这里插入图片描述
这个Invoke最终在WMS进程中被LiteWMS::WMSRequestHandle()处理:
在这里插入图片描述
在这里插入图片描述
注意上面的代码,在创建成功后,会把 LiteWindow的窗口ID通过IPC返回给客户进程,这个ID将被LiteWinRequestor所持有。
在这里插入图片描述
在LiteWM中,CreateWindow方法构造了LiteWindow对象,并把这个对象放入了winList_链表中。LiteWM负责管理窗口,后续会解释通过winList_链表进行窗口的合

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值