HarmonyOS Next中分帧渲染的原理是什么?

阅读 590
avatarAI BotBETA

HarmonyOS Next中分帧渲染的原理主要是将原本在一帧中加载的数据分成多帧加载

在应用开发中,页面内列表结构复杂,每个列表项包含的组件较多,会导致嵌套层级较深,从而引起组件负载加重,绘制耗时增长。在这种情况下,转场或者列表滑动时列表项会一次性加载大量的数据,此时可以采用分帧渲染。开发者需要根据实际的业务逻辑、应用页面布局和数据量,提前计算规划出需要通过多少帧完成加载以及每帧具体加载的数据。

应用页面实际加载绘制时,结合页面的布局,使用帧回调监听修改状态变量或补充数据到数据结构等方式,对每一帧需要处理的渲染数据进行计算和设置,保证每一帧内只处理提前设置好的数据。因为已经设置了帧回调监听,所以具体的页面组件加载数据时,只需要通过状态变量或者数据结构,即可实现按帧分批加载数据。这样就达到了原本在一帧中加载的数据分到多帧加载的目的,有效减少了首帧的耗时,避免首帧卡顿现象的出现。

在高负载场景下使用分帧渲染的关键操作是把数据拆分到每一帧中加载,但加载新的数据时可能会将已有数据再次绘制,因此需要搭配合理的页面布局来避免重绘。可以通过ifForEach两种方法来实现布局。

  • if更新机制:根据状态判断条件,如果分支没有变化,不会对条件渲染语句进行更新。
  • ForEach非首次渲染:会检查新生成的键值是否在上次渲染中已经存在。如果键值不存在,则会创建一个新的组件;如果键值存在,则不会创建新的组件,而是直接渲染该键值所对应的组件。

因此在分帧逐步加载数据时使用上述两种方法不会引起重绘。并且在页面布局时可以给分帧渲染的外部容器组件设置宽高,这样组件本身不会触发重新进行Measure的过程,对组件的宽高不会重新测算,避免因外部容器大小改变引起重绘。

1 个回答

单帧内绘制多个特点各不相同的组件时,会同时创建数量较多的GraphicsPipelines,引发后续整个Flush阶段的耗时延长,从而导致单帧耗时超长。对于这种单帧内组件负载重、加载数据多和绘制耗时长的问题场景,开发者可以根据实际的业务逻辑、应用页面布局和数据量,提前计算规划出需要通过多少帧完成加载以及每帧具体加载的数据。应用页面实际加载绘制的时候,结合页面的布局,使用帧回调监听修改状态变量或补充数据到数据结构等方式,对每一帧需要处理的渲染数据进行计算和设置,保证每一帧内只处理提前设置好的数据。因为已经设置了帧回调监听,具体的页面组件加载数据时,只需要通过状态变量或者数据结构,即可实现按帧分批加载数据。这样就达到了原本在一帧中加载的数据分到多帧加载的目的,有效减少了首帧的耗时,避免首帧卡顿现象的出现。如下图所示,将一帧数据拆分到三帧示例:
image.png

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题