Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >OpenHarmony 实战开发——图形框架解析

OpenHarmony 实战开发——图形框架解析

原创
作者头像
小帅聊鸿蒙
发布于 2025-04-09 12:42:16
发布于 2025-04-09 12:42:16
1680
举报
文章被收录于专栏:鸿蒙开发笔记鸿蒙开发笔记

众所周知,动画是系统和应用与用户交互的重要环节。动画效果的好坏会直接影响用户的体验。动画效果依赖图形系统,华为作为 OpenAtom OpenHarmony(以下简称“OpenHarmony”)开源项目贡献者,自主研发了一套以统一渲染为基础、高性能动效引擎为驱动的图形系统——OpenHarmony 图形栈。

一、OpenHarmony 图形栈介绍

下面先为大家介绍一下 OpenHarmony 图形栈的架构。

按照分层抽象和轻模块化的架构设计原则,OpenHarmony 图形栈分为接口层、架构层和引擎层,且每一层按能力分成了若干个能力模块。OpenHarmony 图形栈的完整能力视图如图 1 所示。(目前,视图中的能力尚未全部实现,还在持续开发和完善中)

图 1 OpenHarmony 图形栈

对上,OpenHarmony 图形栈为应用程序框架提供高性能、易用的图形接口,支撑多窗口、复杂页面的图形渲染和流畅自然动画的实现。对下,OpenHarmony 图形栈屏蔽差异化的芯片平台,支撑任意符合 OpenHarmony 图形标准的设备接入。

OpenHarmony 图形栈的分层说明如下:

• 接口层:提供图形的 NDK(native development kit,原生开发包)能力,包括:WebGL、Native core Canvas 的绘制能力、OpenGL 指令级的绘制能力支撑等。

• 框架层:分为 Render Service、Drawing、Animation、Effect、显示与内存管理五个模块。

• 引擎层:包括 2D 图形库和 3D 图形引擎两个模块。2D 图形库提供 2D 图形绘制底层 API,支持图形绘制与文本绘制底层能力。3D 图形引擎能力尚在构建中。

看了上面 OpenHarmony 图形栈的介绍,你也许还没有 get 到 OpenHarmony 图形栈到底能为用户带来哪些更好的体验。别急,下面就为大家一一道来。

二、提升动画流畅度

从通俗角度看,动画是多张连续的画面通过一定的帧率展示出来。用户大部分时间是处在人机交互的动画场景中,比如浏览新闻页面等,动画的流畅性对用户体验非常关键。我们通过对传统动画处理流程的深入分析,发现了影响动画流畅的两个关键问题:

1. 动画受 UI 主线程影响

如果 UI 主线程的业务阻塞,这很容易引发动画卡顿的现象,给用户带来不好的体验。下面的 Demo 模拟了 UI 主线程业务阻塞的场景,可以看到动画明显卡顿了。

2. 动画过程图形计算负载高

传统的动画处理流程如图 2 所示。开发者在应用代码中创建动画、设置动画参数、设置每帧回调等,从而实现想要的动画效果。应用运行时,系统会对动画一帧一帧地渲染。首先,在动画阶段,系统会计算被修改的控件的属性值。接着,进入测量/布局/绘制阶段,系统测量所有控件的属性,根据设备尺寸对所有控件进行布局,并形成绘制指令。最后由 GPU 进行每一帧的渲染。

图 2 传统的动画处理流程

在测量/布局/绘制阶段,如果控件属性发生变化(如图 3),则每一帧都要重新测量、布局和绘制。这意味着每一帧都会引入图形计算负载,增加了耗时,且最终影响动画效果。

图 3 图形计算负载

下面我们来看一个示例:

以上示例中,点击 Title 后,窗体根据设备尺寸进行伸展。这个过程其实就是控件属性发生变化的过程,我们看到动画效果不流畅,是因为测量、布局绘制环节耗时长导致。

为了解决上面两个影响动画流畅的关键问题,OpenHarmony 图形栈采取了 UI 与动画分离、测量布局绘制优化等关键技术来提升动画性能。

1. UI 与动画分离

OpenHarmony 图形栈采用 UI 与动画分离的设计思想,动画的使能和参数下发在 UI 主线程,动画的步进在渲染过程中。在这种分离的方式下,动画不再受 UI 主线程阻塞的影响,从架构上避免了因 UI 主线程阻塞导致动画卡顿的问题。

下面我们再次通过上面的 Demo 来模拟 UI 主线程业务阻塞。这次我们看到动画非常流畅,丝毫没有受到 UI 主线程业务阻塞的影响。

2. 测量布局绘制优化

传统的动画过程中,宽高的变化必然引起布局的变化,从而导致每帧进行重新测量、布局和绘制。当控件数量过多的时候,因测量、布局、绘制所带来的 CPU 负载是非常高的。为此,对于布局中内容不变的场景,OpenHarmony 图形栈对测量布局计算进行优化,动画过程中由系统进行动态的“插帧”处理,从而有效地避免了每帧的重新测量、布局和绘制。

下面我们看看同样的示例在 OpenHarmony 中的动画效果:

可以看到,在 OpenHarmony 中此示例的动画效果非常流畅。

DD一下:欢迎大家关注公众号<程序猿百晓生>,可以了解到以下知识点。
代码语言:erlang
AI代码解释
复制
`欢迎大家关注公众号<程序猿百晓生>,可以了解到以下知识点。`
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案) 
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.OpenHarmonyUboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......

三、自然地提升动画衔接

对于单段动画而言,动画的流畅性是用户体验的一个重要指标。很多情况下,开发者还会面临多段动画的衔接处理,这时动画衔接是否自然,也是用户体验的一个重要指标。

比如,图 4 展示了两种传统的动画衔接处理方式,能很明显地看到动画衔接得不自然。

图 4 动画衔接不自然

OpenHarmony 图形栈为开发者们提供了便利且自然的动画衔接实现方式。当出现动画中断时,开发者只需要指定新的终点即可,系统会以一种自然的方式进行动画衔接。这样既降低了开发者的负担,又可以得到很好的动画体验。图 5 展示了 OpenHarmony 图形栈的动画衔接效果。

图 5 OpenHarmony 动画衔接效果

四、丰富动效

随着应用蓬勃发展,多任务、多窗口越来越普遍,给动效呈现带来了很大挑战。比如下面的视频,长按应用图标,桌面和壁纸产生模糊效果。由于桌面和壁纸是独立绘制、分离渲染的,要想实现动态实时模糊,需要在合成阶段进行模糊处理(GPU 合成方式),导致性能和功耗的代价高,用静态模糊的效果是一种比较“经济”的做法。

OpenHarmony 图形栈采用统一绘制与渲染机制。以上示例在 OpenHarmony 图形栈的绘制与渲染流程如图 6 所示。

图 6 绘制与渲染流程

解决了跨窗口联动问题后,上面示例中桌面和壁纸模糊效果呈现时,也能同步看到壁纸的动效,如下:

此外,OpenHarmony 图形栈从时间和空间上提供了更丰富的动效能力。空间维度上,更容易实现空间相关的动效。时间维度上,开发者只需设置终止界面,图形栈自动进行插值计算,简化复杂的计算。

图 7 时间和空间联合动效

五、结束语

通过深挖动画处理流程中的各个环节, OpenHarmony 图形栈解决了动画受 UI 主线程影响而引发的卡顿问题,也解决了动画过程中图形计算负载高引起的耗时问题,提升了动画性能。此外,OpenHarmony 图形栈提供的时间和空间联合动效能力,让动效开发变得更简单,提升了开发效率。

写在最后

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力;
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识;
  • 想要获取更多完整鸿蒙最新学习知识点,可关注B站:码牛课堂;

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
编辑精选文章
换一批
鸿蒙5开发宝藏案例分享---分析帧率问题
​**​嘿,各位鸿蒙开发者!​**​ 今天分享一个开发中的大发现——鸿蒙官方文档里藏着一堆超实用的性能优化案例!这些案例不仅解决了常见的丢帧卡顿问题,还附带了详细的分析思路和代码改造方案。我整理了几个高频场景,结合代码讲解,帮你彻底搞定流畅度优化!
陈杨
2025/06/17
740
鸿蒙5开发宝藏案例分享---性能体验设计
以下是一篇基于HarmonyOS性能体验设计文档的开发者实践指南,结合官方案例和代码实现,用更亲切的语言分享实用技巧:
陈杨
2025/06/17
920
OpenHarmony 实战开发——ArkUI中的线程和看门狗机制
• AceContainer是一个容器类,由前端、任务执行器、资源管理器、渲染管线、视图等聚合而成,提供了生命周期对接、功能调度接口和UI渲染的各项能力。
小帅聊鸿蒙
2025/04/28
790
OpenHarmony 实战开发——ArkUI中的线程和看门狗机制
深度剖析浏览器渲染性能原理,你到底知道多少
作者:齐修_qixiuss https://www.jianshu.com/p/a32b890c29b1
用户4456933
2021/06/01
1.5K0
深度剖析浏览器渲染性能原理,你到底知道多少
前端-狙杀页面卡顿 —— Performance 工具指北
今天介绍下 Chrome dev tools 家族的一个小兄弟,它在 Chrome 57 之前叫作「Timeline」,而现在换了个更长的马甲 —— 「Performance」,毕竟名字要「长~~~~~~~~~」更能吸引注意。
grain先森
2019/03/29
3.3K0
前端-狙杀页面卡顿 —— Performance 工具指北
HarmonyOS NEXT 使用XComponent + Vsync 实现自定义动画
XComponent 提供了应用在 native 侧调用 OpenGLES 图形接口的能力,本文主要介绍如何配合 Vsync 事件,完成自定义动画。在这种实现方式下,自定义动画的绘制不在 UI 主线程中完成,即使主线程卡顿,动画效果也不会受影响。
小帅聊鸿蒙
2024/09/14
2500
HarmonyOS NEXT 使用XComponent + Vsync 实现自定义动画
分享 | 前端性能优化(CSS动画篇)
最近拜读了一下html5rocks上几位大神写的一篇关于CSS3动画性能优化的文章,学到了很多,在这里记录一下,其中的知识都是来源于这俩篇文章,我只是截取了其中比较关注的内容出来,原文地址High Performance Animations及Accelerated Rendering in Chrome
疯狂的技术宅
2019/03/28
2K0
揭秘:60FPS流畅体验背后,Android渲染机制深度解析与性能优化秘籍!
Android 的渲染显示是一个复杂的过程,涉及多个系统组件和层次。为了理解帧率、掉帧和卡顿的原理,我们需要深入了解 Android 的渲染体系。
AntDream
2024/10/31
3550
揭秘:60FPS流畅体验背后,Android渲染机制深度解析与性能优化秘籍!
鸿蒙(HarmonyOS)性能优化实战-Swiper高性能开发
在应用开发中,Swiper 组件常用于翻页场景,比如:桌面、图库等应用。Swiper 组件滑动切换页面时,基于按需加载原则通常会在下一个页面将要显示时才对该页面进行加载和布局绘制,这个过程包括:
小帅聊鸿蒙
2024/10/17
2400
鸿蒙(HarmonyOS)性能优化实战-Swiper高性能开发
OpenHarmony轻松玩转GIF数据渲染
OpenAtom OpenHarmony(以下简称“OpenHarmony”)提供了Image组件支持GIF动图的播放,但是缺乏扩展能力,不支持播放控制等。今天介绍一款三方库——ohos-gif-drawable三方组件,带大家一起玩转GIF的数据渲染,搞定GIF动图的各种需求。
小帅聊鸿蒙
2025/04/22
810
OpenHarmony轻松玩转GIF数据渲染
28. 精读《2017前端性能优化备忘录》
本期精读的文章是:Front End Performance Checklist 2017
黄子毅
2022/03/14
5620
28. 精读《2017前端性能优化备忘录》
Android界面性能优化必读
Android系统要求每一帧都要在 16ms 内绘制完成,平滑的完成一帧意味着任何特殊的帧需要执行所有的渲染代码(包括 framework 发送给 GPU 和 CPU 绘制到缓冲区的命令)都要在 16ms 内完成,保持流畅的体验。这个速度允许系统在动画和输入事件的过程中以约 60 帧每秒( 1秒 / 0.016帧每秒 = 62.5帧/秒 )的平滑帧率来渲染。
做个快乐的码农
2022/01/10
5K0
Android界面性能优化必读
Android性能优化-渲染优化
我们在开发的过程中,可能经常会遇到测试的一些反馈,就是APP运行卡顿的问题。我们通常所讲的卡顿问题都是因为渲染掉帧的问题引起视觉上的卡顿感。所以了解渲染机制,我们在项目的开发过程中,可以有意识的少挖坑。同时要打造一款精品的应用,注意渲染优化也是非常重要的一件事情。
Anymarvel
2018/10/22
1.5K0
Android性能优化-渲染优化
从15个点来思考前端大量数据渲染与频繁更新的方案
一个精简且有效的DOM结构可以加速页面渲染,提高用户交互响应速度,并减少内存使用。
JanYork_简昀
2024/03/05
2.4K1
从15个点来思考前端大量数据渲染与频繁更新的方案
《社交应用动态表情:RN与Flutter实战解码》
React Native依托于JavaScript和React,为动态表情的实现开辟了一条独特的道路。其核心优势在于对原生模块的便捷调用,这为动态表情的展示和交互提供了强大支持。在社交应用中,当用户点击发送动态表情时,React Native能够迅速调用相册或表情库模块,流畅展示各类动态表情资源。这种与原生功能的紧密结合,使得表情的加载速度和显示效果近乎原生应用,为用户带来了极为流畅的体验。
程序员阿伟
2025/05/14
520
《社交应用动态表情:RN与Flutter实战解码》
小红书鸿蒙 OS 下的性能优化探索与实践
随着互联网技术的快速发展,大前端领域正经历着前所未有的变革。从传统的 Web 开发到移动应用、小程序、IoT、乃至新兴的 AR/VR,大前端技术不仅需要适应越来越多样化的需求场景,还面临着如何更高效地利用现有资源、提升用户体验等挑战。与此同时,AI 等新技术的发展为解决这些问题提供了新的思路和工具。在即将于 4 月 10 日召开的 QCon 全球软件开发大会(北京站),我们策划了「越挫越勇的大前端」专题,将深入探讨大前端技术在当前及未来一段时间内的演进趋势及其实践案例。欢迎围观:https://qcon.infoq.cn/2025/beijing/track/1763
深度学习与Python
2025/04/09
2390
小红书鸿蒙 OS 下的性能优化探索与实践
窥探现代浏览器架构(三)
本文是笔者对Mario Kosaka写的inside look at modern web browser系列文章的翻译。这里的翻译不是指直译,而是结合个人的理解将作者想表达的意思表达出来,而且会尽量补充一些相关的内容来帮助大家更好地理解。
进击的大葱
2022/08/22
5630
窥探现代浏览器架构(三)
[Flutter 渲染优化系列] Flutter 渲染性能问题分析
易老师写了很多篇关于 Flutter 渲染引擎的文章,讲的非常深入,我从中学到了很多,昨天很有幸的加到易老师微信,表达了一番崇敬之情,易老师人非常好,也非常谦逊。
老孟Flutter
2021/04/02
2.8K0
每天10个前端小知识 【Day 16】
改变transform或opacity不会触发浏览器重新布局(reflow)或重绘(repaint),只会触发复合(compositions)。
程序媛夏天
2024/01/18
2390
每天10个前端小知识 【Day 16】
动效歌词之全新实践
一、 背景 1. 现状 歌词浏览已经成为音乐app的标配,展示和动画效果也基本上大同小异,主要是单行的逐字染色的卡拉OK效果和多行的滚动效果。当然,我们也不例外。 2. 目标 我们的目标十分明确,一是提升歌词的基础体验,二是在此基础上,能提供差异化的VIP特效,来吸引用户开通VIP。 二、探索技术方案 经过多次的需求评审和沟通讨论,各方在需求的目标和细节上也达成了初步的统一。 产品的希望 :效果炫酷,能实现逐字动画(位移,翻转,渐隐渐现,模糊,粒子特效等),可配置等。开发的思考: 技术架构方案,性能挑战等
QQ音乐技术团队
2019/01/11
2.5K0
动效歌词之全新实践
相关推荐
鸿蒙5开发宝藏案例分享---分析帧率问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档