鸿蒙系统进一步学习(三):ArkUI的差分渲染

鸿蒙智能体与马年文化的技术融合实践 分布式计算和情景感知是构建智能操作系统的核心技术。通过设备虚拟化和动态优先级调度,鸿蒙智能体实现了跨设备的无缝协同,将AI能力延伸到多个终端。这种架构不仅提升了服务响应速度,更为文化数字化提供了新范式。在传统马年主题实践中,鸿蒙智能体展示了多模态感知、知识图谱和个性进化三大技术支柱的应用价值,从动态水墨渲染到非遗内容推荐,体现了分布式AI在文化传承领域的创新可能。 阅读详情

1. UI组件树

以一段普通的代码为例,里面有个空布局,它的长宽都为父控件的80%,并设置了背景色。经过编译运行后,通过ArkUI的载入后,它的内部数据结构如图1所示。

@Entry
@Component
struct Index {
  build() {
    Stack() {
    }.width('80%').height('80%')
    .backgroundColor('#fff111')
  }
}

图1 UI组件树示意图

最上面的一层是根节点,所有系统组件的节点的数据结构都是FrameNode,第二层也是个FrameNode,但是整个Page的根节点,一个Ability有不同的Page组成,当不同的Page载入的时候,实际就是把自己挂在根节点下,然后渲染,这样会变成为新的页面,第三个节点则是CustomNode,即用户定义的节点,这个时候刻意看到@Entry关键字了,此时读者应该明白了,这个就是Index节点,Index下有个Stack组件。所以真正意思上来说,@Entry节点只是第三层的节点,它的上面还有两个节点,一个是根节点,当应用启动时,ArkUI框架会初始化应用UI根节点;另外一个就是Page的节点,表示当前应用加载的是哪个页面。

2. 三棵树

为了实现局部的最小化更新,老版本的ArkUI定义了三棵树模型,这三棵树分别是Component、Element和Render,它们的组合实现了数据驱动UI的最小化更新。它的核心思路是:在状态发生变化的时候,比对Element树和Component树的差异点,形成差异树,在差异树中,选取可以渲染的节点,生成Render树,最后把Render树交给渲染管线去渲染。

在UI首次创建时,会先生成Component树,基于Component树会生成最初的Element树和Render树,Render树在生成时会忽略非渲染节点对象(比如自定义的Component,本身没有显示内容,不参与渲染),这些对象会生成页面唯一的id标识,用于后续的更新。

1)树的生成

一段有@Component注解的代码,在经过编译后,最后到ArkUI后,首次会生成一颗树形结构,这个就是Component树,基于Component树,复刻一个树,就是Element树。记住,这是首次创建的时候,如下代码就会生成一颗如图2的一棵树。

@Component
struct MyComponent {
  @State needShowSecond: boolean = true
  @State message: string = "hello world"

  build() {
    Column() {
      Text(this.message)
      if (this.needShowSecond) {
        Text(this.message)
      }
    }
  }
}

图2 MyComponent生成的Component树

可以看出,needShowSecond这个变量此时是true,所以if判断条件成立,Column容器下有两个子节点,其中右边的子节点是依据该变量从而决定是否显示。同时可以看出,build()函数的里面的层级决定了树的深度,所以在了解清楚这个原理后,读者在后期的开发中,一定要能尽量降低层级,减少树的深度,从而提高树的遍历效率,这样后期的渲染会更加高效。

上述只是一个简单的自定义组件的树生成情况,那么带到一个完整的页面中,除了要生成树的结构之外,还需要对每一个节点做Id的标记,这样每个节点可以唯一被表示。从UI根节点开始,完整的生成的Component树如图3所示。同时在ArkUI还会克隆出一颗一模一样的Element树,从标号1开始,就是build()里面的Column容器,每深入一个层级,标号就多一位,兄弟层级之间,尾号加1,为了后面方便讲解。后续的节点树都从build()函数的第一个容器开始,省去根节点到@Entry节点,它们不是消失了,只是不展示,因为同一个页面的刷新,不涉及到它们,减少整体展示图的大小。

@Component
struct MyComponent {
  @State needShowSecond: boolean = true
  @State message: string = "hello world"

  build() {
    Column() {
      Text(this.message).onClick(() => {
        this.needShowSecond = !this.needShowSecond
      })
      if (this.needShowSecond) {
        Text(this.message)
      }
    }
  }
}


@Entry
@Component
struct Index {
  @State message: string = 'Hello World'

  build() {
    Column() {
      Row() {
        Stack() {
          Text(this.message)
        }
      }
      MyComponent()
    }
  }
}

图3 Index页面的完整树形图

那么第三棵树,渲染树是怎么样的呢?之前提过,渲染树会删除一些非渲染的节点,也就是1-2编号的节点,它的作用是支撑起完整的树形结构,在ArkUI里面,这样的节点称为Composed对象(非渲染节点),Composed对象会生成页面唯一的id标识,用于后续的更新。当1-2节点因为是Composed对象,所以被渲染树移除后,原来的1-2-1节点,也就是MyCompoent里面的Column节点,它的层级就会上升,成为渲染树中的1-2节点,如图4所示。至此三棵树在初始阶段创建完成。

图4 Index页面创建时所对应的渲染树

2)树的更新

首次创建的时候,树一定是全量的,如果此时点击了MyComponent里面的第一个Text,就会把needShowSecond取反,因为@State的变化了,就会触发MyComponent的刷新,此时Component树的结构发生了变化,1-2-1-2节点被删除了,它就会和原来的旧的Element树进行比较,生成新的Render树,此时可以看到,Render树比较小,只有两个节点要更新,那么此时只需要对这两个节点渲染即可,其它节点不需要动,从而实现了最小化刷新。同步地,旧的Element树也更新为新的Element树了。其流程示意如图5所示。

图5 三颗树的更新流程示意图

纵观整个例子,读者可以发现,整个的思路是非常清晰的,即不断比对新旧两棵树的差异,生成渲染树,最后交给渲染管线去渲染即可。

3)小结与思考

对上述几棵树的功能做个小结,三棵树分别承担着不同的责任:

(1)Component树:

每次创建或者更新时都会重新生成相应的子树结构,成员方法提供了创建Element和Render节点,成员变量保存相应的属性值。

(2)Element树:

维持UI组件树形结构,承载计算树之间差异的任务,在新的Component子树生成并请求更新时,会基于老的树形结构进行差异计算,来实现树形结构更新和渲染节点属性更新。

(3)Render树:

承载布局渲染任务,保存Component结构中的属性值,基于保存的属性值驱动内容布局和渲染。

进一步思考:

然而,读者也应该有一个感觉,这三棵树的渲染机制,虽然能解决最小化刷新问题,但是也会带来一些缺陷:

(1)对于每个页面,都有三棵树,会带来额外的内存的开销,其中Component树和Element树高度相似,略有冗余。

(2)在列表滑动等实时性要求严苛的场景下(如快速滑动列表,这也是自媒体非常喜欢测试流畅度的场景之一),列表动态创建相应的列表项时需要创建更多的对象(Component、Element和Render,同时属性值也需要进行多次拷贝赋值,属性值在创建Component组件时会先复制到Component内的成员中,在Element和Render节点创建完成后,上述的属性值会再次拷贝到Render节点中以便进行内容布局和绘制),复杂场景下可能带来帧率的下降。

所以如何砍掉多余的树,也同时能够保持最小化刷新,将是要考虑和解决的难题!

React Native鸿蒙ScrollView横向分页实现与优化 在跨平台移动开发中,ScrollView横向分页是常见的UI交互模式,尤其在React Native框架下需要针对不同操作系统进行适配。鸿蒙系统(HarmonyOS)因其独特的轻量级内核设计和JS UI框架,在滚动容器实现上与Android/iOS存在显著差异。本文深入解析鸿蒙平台的手势识别优先级队列机制和硬件加速合成特性,通过对比传统`pagingEnabled`实现方案,揭示分页边界错位等典型问题的成因。重点介绍`snapToInterval`精确计算、`decelerationRate`参数调优等关键 阅读详情

相关推荐

底层软件测试规范,QA评审底层测试

本文首发于【林子的空间】“林子,咱们上次讨论的高效Desk check清单,用起来还挺好的,最近我们组每次Desk check变得顺利多了,Dev也是越来越熟练。”玥玥跟我说。“真好!我们组感觉也是这样!”“不过,我听小慧说他们组有人对QA review UT提出了一些concern(质疑),觉得QA review的价值不大,基本都是Dev给讲一遍,QA也提不出来什么反馈...”玥玥补充说道。“哦...

weixin_42144707的博客 1189

HarmonyOS ArkUI 3.0:从命令式到声明式UI开发的范式变革与实战解析

在软件开发领域,UI开发范式经历了从命令式到声明式的深刻演进。命令式编程要求开发者精确控制每一步状态变化,而声明式编程则允许开发者专注于描述“界面应该是什么样子”,框架会自动处理状态更新与渲染。这种转变的核心技术价值在于大幅提升开发效率、减少冗余代码,并改善代码的可维护性。其背后的原理依赖于响应式数据绑定与高效的差分更新算法,确保UI能随数据变化而自动、精准地刷新。在应用场景上,声明式UI尤其适合需要快速迭代、UI频繁变更的现代移动应用与跨端应用开发。以华为HarmonyOS的ArkUI 3.0为例,它正是

weixin_30684743的博客 513

OV5640调试大坑,关于binning、RES分辨率与EV曝光

OV5640在使用binning模式时,必须考虑使用场景,分辨率下降叠加动态范围压缩,会使目标对象细节在高光环境下大量丢失,2x2的binning模式,分辨率会远低于感光面积的1/4。

chongyun_的专栏 1829

腾讯Kuikly框架鸿蒙版开源:高性能跨端开发新选择

跨端开发框架通过抽象底层平台差异,为开发者提供统一的编程接口,显著提升多端应用开发效率。其核心原理在于构建中间渲染层,将声明式UI转换为各平台原生组件。在鸿蒙生态快速发展的背景下,腾讯开源的Kuikly框架创新性地采用轻量级渲染管线和原子化服务适配,实现了接近原生的性能表现。该框架特别适用于需要快速迁移现有应用到鸿蒙平台,同时充分发挥分布式硬件协同优势的场景。通过模块化架构设计和三重缓存机制,Kuikly在华为设备上实测启动速度提升40%,内存占用降低35%,为开发者提供了高性能的跨端解决方案。

weixin_34050519的博客 359

基于JAVA的GB28181实现之SIP服务核心组件解析

本文深入解析了基于JAVA的GB28181标准中SIP服务的核心组件实现,包括协议栈选择、消息处理引擎、事务管理器等关键技术点。通过实战案例分享海康威视、大华设备的特殊处理技巧,并提供性能优化和常见问题排查指南,帮助开发者高效构建稳定的视频监控系统。

weixin_30892037的博客 264

告别Windows!Oculus Quest 2在Mac M1上的串流实战(scrcpy+SideQuest避坑指南)

本文为Mac M1用户提供了Oculus Quest 2在macOS上实现高清低延迟串流的实战指南。通过使用开源工具scrcpy和SideQuest,绕开官方限制,详细讲解了从环境准备、无线调试到画质与延迟优化的完整步骤,重点解决了Apple Silicon芯片Mac的连接与性能问题,助你告别Windows依赖。

weixin_29224309的博客 310

鸿蒙系统进一步学习(二):ArkUI底层原理揭秘

鸿蒙6.0系统流畅度堪比iOS,其核心在于ArkUI的底层渲染优化机制。系统渲染流程分为信号触发、前期准备、控件测量、布局定位和最终渲染五个关键步骤,各步骤职责明确且顺序严格。高刷新率屏幕(如120Hz)对系统提出更高要求,需在8.3ms内完成单帧处理。ArkUI采用差分渲染技术,通过智能识别局部变化区域(如按钮状态更新),仅刷新必要控件而非整个页面,显著降低计算量和渲染时间。这种局部刷新策略配合硬件升级,共同实现了鸿蒙系统的卓越流畅体验,也为开发者优化应用性能提供了明确方向。

memoryjs的专栏 451

SpringBoot4.0+JDK25+GraalVM实战:云原生新纪元,微服务性能翻倍的落地指南

三者的组合不是偶然,而是“框架优化+JDK升级+虚拟机革新”的必然结果——SpringBoot4.0完善了对GraalVM原生镜像的支持,JDK25强化了云原生与AOT编译能力,GraalVM则提供了极致的启动速度和资源利用率,三者协同,刚好命中云原生微服务的核心痛点。SpringBoot4.0+JDK25+GraalVM的组合,不是简单的版本升级,而是云原生微服务的一次性能革命。

2601_94871597的博客 1142

鸿蒙ArkUI即将取代Java UI?

关注前端开发的同学,一定听过近些年,DSL 描述式的 UI 构建写法,大有取代传统命令式布局的趋势。 传统上,写一套 UI 代码,需要根据数据的逻辑,手动的在业务代码里,去改变界面 UI 元素的状态,造成业务代码和 UI 代码搅在一起,黑话=“耦合性极高”。结果就是,把人人都炼成了一身诸哥的本事,事必躬亲,鞠躬尽瘁… 好的。话说在网页开发的远古时代(2013 年以前),想写一个炫酷的网页,往往需要直接操作 HTML 元素,比如控制网页上一个价格数字根据选择不同优惠券的变化,需要直接操作这个价格文字元素。 类

张晨光老师的播客 6618

UE5实现建筑剖切效果

UE5实现建筑剖切效果

专注GIS开发 8464

地图之家总目录

地图之家总目录 cesium示例 leaflet示例

GIS之家家长 1万+

ArkUI-X简介:跨平台框架架构与运行原理(99)

ArkUI-X 是由 OpenHarmony 跨平台应用开发框架 TSG(技术指导委员会)孵化的开源项目。它基于 OpenHarmony 官方原生框架 ArkUI 进行扩展,旨在让开发者基于一套主代码,就能构建支持多平台(如 HarmonyOS/OpenHarmony、Android、iOS 等)的精美、高性能应用。

Davina_yu的博客 799

如何使用 SAP ABAP Development Tool 连接 SAP BTP 上的免费 ABAP 编程环境

在云端环境编写 ABAP 代码会遇到一些限制,比如你无法在云端 ABAP 编程环境进行发生在传统 SAPGUI 里的 Dynpro 和 Screen 编程。部分在 SAPGUI 里使用的 List 处理相关的关键字比如 WRITE,还有 CALL TRANSACTION 等代码,也无法在云端使用。 当然如果大家觉得上面提到的这些限制不会影响自己的 ABAP 学习,就可以继续本文的阅读,使用 ABAP Development Tool 登录云端的 ABAP 编程环境。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1521

【HarmonyOS】ArkUI - 声明式开发范式

在 HarmonyOS 开发中,官方主要推出了两种开发框架,一个是基于 Java 的,一个是基于 ArkTS 的。而后,基于 ArkTS 的 UI 开发,出现了两种开发范式,一种是基于 JS 的类 Web 开发范式和基于 eTS 的声明式开发范式,后变为基于 ArkTS 的声明式开发范式。

2401_86810295的博客 835

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

HarmonyOS 应用开发深度解析:基于 Stage 模型的 ArkUI 声明式开发实践

Component// @State 装饰器表示该变量是组件内部的状态数据。// 当其值变化时,会触发UI重新渲染。build() {// Column 是垂直方向排列的布局容器// 显示文本,内容绑定到count状态// 按钮,点击事件触发时,修改count状态}).justifyContent(FlexAlign.Center) // 主轴(垂直)居中最佳实践组件化:立即将 UI 拆分为小的、可复用的@Component结构。这是声明式 UI 的核心理念。状态下沉。

不懂先生的博客 1270

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ArkUI-X 初探:声明式UI如何让跨平台开发更高效?

《声明式UI与ArkUI-X跨平台开发解析》 摘要:本文系统分析了UI开发范式从命令式到声明式的演进,重点解读华为ArkUI-X框架的技术实现。声明式UI通过状态驱动视图、组件化组合和自动差分更新三大特性,显著提升开发效率与维护性。ArkUI-X采用四层架构设计,包含响应式状态系统和跨平台渲染管线等核心技术,实现代码复用率提升40%以上。框架通过统一布局系统、事件归一化和平台能力桥接保障多端一致性,同时运用增量式DOM更新和三级内存管理策略优化性能。文章还详细阐述了组件化开发模式、状态管理方案及调试工具链,

m0_59315734的博客 1376

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

HarmonyOS NEXT (二): UI开发体系深度解析

HarmonyOS NEXT (二): UI开发体系深度解析

我是 二川兄,对Web开发、GIS开发、3D模型、机器学习、面试技巧等方面都有一些涉猎~ 欢迎您加入技术交流圈!你可以在我的文章末尾找到我~ 5553

ArkUI V1 VS V2 深度对比:细粒度响应式如何解决冗余渲染痛点

ArkUI V1粗粒度对象级响应式,本质是「一改动、全树刷」,是列表、折叠、原子卡片、多窗口场景冗余渲染、闪烁卡顿的底层根源;ArkUI V2通过编译时静态依赖扫描、全深度属性级Proxy劫持、节点级增量差分渲染三大底层革新,实现仅变更字段对应的最小UI节点局部重绘,从架构层面彻底根除无效渲染。

2502_93915572的博客 284

HarmonyOS ArkTS开发指南:从TypeScript到鸿蒙应用实战

在现代化应用开发中,强类型语言和声明式UI框架已成为提升代码质量和开发效率的关键技术。TypeScript作为JavaScript的超集,通过静态类型检查在编译阶段捕获错误,显著增强了代码的健壮性和可维护性。声明式UI范式则将开发者从繁琐的命令式DOM操作中解放出来,让UI成为应用状态的函数,实现了更高效、可预测的渲染更新。这些技术价值在跨平台应用开发中尤为重要,能够确保应用在不同设备上的一致性和高性能。HarmonyOS ArkTS正是基于这些核心理念构建的鸿蒙应用开发语言,它继承并扩展了TypeScri

weixin_30263277的博客 329

HarmonyOS应用开发:深入ArkUI声明式开发范式与最佳实践

传统的命令式开发需要开发者一步步描述"如何做",而声明式开发只需描述"做什么"。ArkUI的声明式开发通过状态驱动UI更新,大大简化了开发流程。// 命令式示例(传统方式)});// 声明式示例(ArkUI)build() {})@Component// 父组件传递的参数// 组件内部状态build() {Column() {// 标题行Row() {})// 内容区域 - 条件渲染Column() {// 使用插槽内容Slot()// 使用自定义组件。

不懂先生的博客 515

项目创建:使用ArkUI-X CLI创建跨平台工程(100)

在执行过程中,CLI 会引导开发者依次输入工程名称、包名称(Bundle Name)、目标系统(OpenHarmony 或 HarmonyOS)以及项目类型(Application 或 Library)。但需要注意的是,跨平台项目必须在各个平台(HarmonyOS、Android、iOS)的配置文件中分别声明对应的权限,否则会导致调用失败。命令,开发者还可以使用更精细的构建指令,并结合平台特定的调试工具来排查问题。目录下,各平台的原生代码则被隔离在各自的文件夹中。分析各平台的性能差异,并定期执行。

Davina_yu的博客 324

HarmonyOS 应用开发:Scroll滚动容器的深度性能优化

HarmonyOS Scroll容器的性能优化是一个系统工程,需要从架构设计、内存管理、渲染管线等多个维度综合考虑。通过本文介绍的深度优化策略,开发者可以构建出流畅高效的滚动体验。

不懂先生的博客 742

鸿蒙中 @State 的底层更新机制

鸿蒙系统(HarmonyOS)中@State的更新机制采用响应式数据绑定与差异更新(Diff)相结合的方式。其核心流程分为:状态初始化时编译器生成ObservedProperty实例;组件渲染时自动收集依赖;状态变更时触发订阅组件更新;最后通过VDOM差异算法高效更新UI。关键特性包括异步批量更新(减少渲染次数)、编译时依赖收集(自动绑定变量与组件)以及优化的Diff算法(同级节点比较)。该机制在底层实现上类似React和Vue的响应式系统,但结合了鸿蒙特有的编译优化和ArkUI框架特性,最终实现高效的状态

梦想不只是梦与想的博客 1036

HarmonyOS 6 ArkUI - 枚举常量数组数据源管理,把标签选项、时间选项抽离全局常量数组便于统一维护

引言在移动互联网与消费升级深度融合的时代浪潮中,精品咖啡已经从一种饮品演变为一种生活方式和文化符号,而移动应用作为连接咖啡品牌与消费者的核心纽带,其技术实现的质量直接决定了用户体验的深度与广度。HarmonyOS 6.1.1 作为华为鸿蒙操作系统的重要版本迭代,在系统底层渲染管线、内存调度策略以及 ArkTS 编译器优化方面均实现了显著提升,为开发者构建高品质的移动消费类应用提供了坚实的运行时基础。基于 HarmonyOS API 24 的应用开发能力,开发者可以充分利用系统级声明式 UI 框架所提供的丰富

2401_89578244的博客 238

ArkUI-X深度解析:跨平台渲染引擎与高性能架构设计

ArkUI-X通过。

m0_73448825的博客 358

HarmonyOS ArkTS API 24|字符串数字转换技巧,number 转 string、数值运算后格式化展示避免精度异常

引言在当今移动互联网高速发展的时代背景下,跨平台应用开发框架层出不穷,而华为推出的 HarmonyOS 操作系统凭借其分布式架构和声明式 UI 编程范式,正在为开发者提供一个全新的技术选择。HarmonyOS 6.1.1 作为华为鸿蒙操作系统的重要版本迭代,不仅在前代基础上进一步优化了系统底层的渲染性能和内存管理机制,还为开发者带来了更加丰富完善的 ArkTS 语言特性和 ArkUI 声明式组件库。基于 HarmonyOS API 24 的应用开发能力,开发者可以充分利用系统级的能力来构建出具有原生体验的高

2401_89578244的博客 353
上一篇: 鸿蒙系统进一步学习(二):ArkUI底层原理揭秘
memoryjs
博客等级 码龄18年 240粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值