深入UGUI源码:性能优化与自定义组件实战指南
1. 项目概述为什么我们要深入UGUI源码做Unity开发尤其是做手游或者对性能有要求的项目UGUI几乎是绕不开的坎。你可能已经熟练地用Canvas、Image、Text、ScrollView搭出了各种酷炫的界面也大概知道“合批”、“重建”这些词对性能至关重要。但当你遇到界面卡顿、Draw Call异常飙升或者想实现一个特殊交互效果却发现UGUI原生组件不支持时那种无力感是不是特别强烈网上搜到的解决方案要么是“玄学调参”要么是“用这个插件”知其然不知其所以然。这就是我决定花时间啃下UGUI源码的原因。这不仅仅是为了回答面试官那句“UGUI的渲染流程是怎样的”更是为了在实战中当问题出现时你能像外科医生一样精准定位病灶而不是像个赤脚医生一样乱试偏方。通过分析源码你将彻底理解性能瓶颈的根源为什么滚动列表快速滑动时会卡为什么看似简单的界面Draw Call却降不下来自定义组件的底气如何从底层扩展一个满足特殊需求的UI组件而不是在现有组件上打丑陋的补丁。问题排查的效率遇到UI显示异常、点击失效、渲染错乱时能快速形成排查思路直击要害。接下来的内容我会带你从宏观设计到微观实现结合大量实战中踩过的坑和优化技巧把UGUI的核心机制掰开揉碎了讲清楚。这不是一篇简单的API文档翻译而是一位老司机带你走的“源码级”UGUI实战之路。2. UGUI核心架构与渲染管线拆解UGUI的架构设计清晰地分离了逻辑更新和渲染提交两个阶段。理解这个分离是理解一切的基础。2.1 核心类关系与职责划分我们可以把UGUI的核心类看作一个协作团队Canvas团队经理。它持有最终的CanvasRenderer列表并负责在合适的时机如摄像机渲染前命令整个团队开始工作Canvas.willRenderCanvases事件。它也是网格合批的决策中心。Graphic所有可渲染UI元素如Image,Text的基类。它是“设计师”负责生成自己的网格数据顶点、三角形、UV、颜色。但它只设计不施工。CanvasRenderer施工队。每个Graphic都对应一个CanvasRenderer。Graphic把设计好的网格数据交给它它负责持有这些数据并在接到Canvas的命令后把数据提交给Unity的底层图形接口如OpenGL ES, Direct3D。MaskableGraphic继承了Graphic增加了与遮罩Mask,RectMask2D协作的能力。Image和Text都继承自它。ICanvasElement接口。定义了UI元素需要“重建”时应具备的行为主要是Rebuild方法。Graphic和LayoutGroup都实现了它。它们的关系简单概括为Canvas驱动 -Graphic生成数据 - 存入对应的CanvasRenderer-Canvas统一提交所有CanvasRenderer的数据进行渲染。2.2 渲染流程详解从顶点到屏幕渲染一帧UI的完整流程可以分解为以下步骤步骤一脏标记Marking as Dirty这是流程的触发器。当UI元素的属性发生改变需要重新生成网格或重新布局时它会将自己标记为“脏”。几何脏Geometry Dirty当Graphic的rectTransform、color、material、sprite等影响最终网格形状和外观的属性改变时触发。调用Graphic.SetVerticesDirty()和Graphic.SetMaterialDirty()。布局脏Layout Dirty当UI元素的尺寸或其在布局组中的位置可能需要改变时触发例如Text的文字内容变化。这会向上冒泡通知父级的LayoutGroup如HorizontalLayoutGroup。步骤二重建Rebuild这是核心计算阶段。Unity在特定的更新循环中检查并处理所有“脏”的元素。布局重建CanvasUpdateRegistry.PerformUpdate在Canvas.willRenderCanvases事件中首先进行布局重建。这会遍历所有布局脏的元素从叶子节点向根节点Canvas进行重新布局计算确保所有RectTransform的尺寸和位置是正确的。这是ContentSizeFitter等组件生效的地方。几何重建布局完成后进行几何重建。遍历所有几何脏的Graphic元素调用其Rebuild方法。Graphic.Rebuild会调用OnPopulateMesh方法对于Text是Text.OnPopulateMesh或TextGenerator来生成文本网格。步骤三网格填充与合批判断在OnPopulateMesh中组件将计算出的顶点、UV、颜色等数据填充到一个VertexHelper对象中。VertexHelper是一个临时的顶点数据容器。 随后Graphic会将这些数据更新到它所附的CanvasRenderer中通过CanvasRenderer.SetMesh。 在这个过程中合批Batching的判断悄然发生。Unity会根据CanvasRenderer的材质Material和纹理Texture来判定哪些UI可以合并到一个Draw Call中。如果两个CanvasRenderer使用相同的材质和纹理且渲染顺序相邻、深度测试等状态一致它们就有可能被合批。步骤四渲染提交最后Canvas将所有CanvasRenderer中存储的网格数据按照正确的渲染顺序由Canvas的sorting order、Render Mode和元素在Hierarchy中的顺序决定提交给Unity的渲染管线。这一步对于开发者来说是黑盒由Unity底层图形API完成。关键心得很多性能问题就出在步骤一和步骤二。频繁设置UI属性如每帧改变颜色、位置会导致频繁的“标记为脏”和“重建”造成CPU性能瓶颈。而步骤三中的合批失败则是导致Draw Call过高的元凶通常是因为材质或纹理不同。3. 性能杀手深度剖析重建与合批理解了流程我们就能精准定位性能问题。下面用两个实战中最头疼的场景来分析。3.1 重建Rebuild的触发条件与优化实战重建是CPU开销的主要来源。除了上面提到的属性改变还有一些隐蔽的触发点隐蔽触发点Canvas组件启用/禁用这会强制其下所有UI元素重建。改变父节点UI元素的parent改变时会触发布局和几何重建。SpriteAtlas加载如果Image的sprite来自一个尚未加载的图集当图集加载完成时会触发该Image重建。实战优化策略分离动态与静态Canvas将频繁变化的UI如血条、计时器、飘字放在一个或多个独立的Canvas上与静态背景UI分开。因为重建是以Canvas为单位的分离可以最小化重建范围。避免每帧调用SetActive显示/隐藏UI优先考虑调整CanvasGroup.alpha从1到0并设置CanvasGroup.blocksRaycasts false而不是直接SetActive(false)。后者会触发整个Canvas下所有元素的禁用和启用流程开销更大。对频繁更新的文本使用缓存对于每秒更新多次的计时器如“00:13”不要直接拼接字符串赋值给Text.text。可以创建一个char[]数组来缓存数字字符只更新变化的位最后一次性构建字符串。或者对于固定格式的数字考虑使用多个Image组件显示数字图集通过切换sprite来更新这通常比文本重建更快。谨慎使用ContentSizeFitter和LayoutGroup它们非常方便但代价是任何子元素尺寸变化都会导致向上冒泡的布局计算。在复杂的滚动列表项中如果尺寸固定应手动设置RectTransform避免使用这些自动布局组件。3.2 合批Batching原理与突破Draw Call限制合批是降低Draw Call、提升GPU效率的关键。UGUI的合批主要是静态合批基于材质和纹理。合批失败的常见原因材质不同即使纹理相同如果材质实例不同例如一个Image加了材质球另一个没加就无法合批。纹理不同这是最常见的原因。每个不同的Sprite即使来自同一个图集但不同Sprite在渲染时被视为不同纹理。层级打断两个使用相同材质和纹理的UI中间插入了一个使用不同材质/纹理的UI会打断合批。渲染顺序由Hierarchy顺序和Canvas的sort order决定。重叠与深度测试复杂的重叠关系有时会影响合批逻辑。使用Mask组件Mask组件会为子元素生成新的材质实例几乎必然导致合批中断。应优先使用RectMask2D它是在Shader中通过Stencil Test实现裁剪不创建新材质对合批更友好。实战优化策略纹理图集化Atlas这是最重要的手段。使用Unity的Sprite Atlas功能或第三方工具如TexturePacker将大量小图打包成一张大图。确保UI元素使用的Sprite都来自同一张图集这是合批的基础。统一材质尽可能让UI元素使用默认的UI/Default材质不要轻易附加自定义材质球。如果必须使用自定义Shader确保所有需要合批的UI共享同一个材质实例。精心规划Hierarchy顺序调整UI元素在Hierarchy中的顺序让使用相同材质/纹理的物体尽量连续排列避免被其他物体打断。可以写编辑器工具在打包前自动排序。利用Canvas的Additional Shader Channels如果你的自定义UI Shader需要额外的顶点数据如UV2、顶点法线需要在这里声明否则合批可能出错。动态字体合批Text组件使用动态字体时每个字符其实是从字体纹理Font Texture中裁剪出来的。同一个Font文件的Text组件只要渲染状态一致是可以合批的。但要注意字体纹理的分辨率和“字符集”避免运行时动态添加字符导致纹理重建。踩坑记录我们项目曾有一个复杂的角色属性面板Draw Call始终在50以上。排查后发现几十个图标虽然来自同一个图集但因为Hierarchy顺序被一些分割线使用不同材质和带外发光效果的技能图标附加了特效材质完全打乱。通过重组Hierarchy将普通图标集中放置并将特效图标剥离到另一个子Canvas最终将Draw Call降到了15以内。4. 从源码到实战自定义高性能UI组件读源码的终极目的是为了创造。我们以两个实战案例看看如何借鉴UGUI源码的思想打造自己的组件。4.1 案例一实现一个虚拟化滚动列表标准ScrollRect在列表项很多时会实例化所有项造成巨大的内存和重建开销。虚拟化列表只创建可视区域内的项复用它们来显示不同数据。核心设计思路借鉴自Graphic与CanvasRenderer的分离数据与视图分离维护一个数据列表。视图ListItem只是一个用于显示的容器。视图池像CanvasRenderer池一样我们维护一个可复用的ListItem对象池。滚动时重建监听ScrollRect的onValueChanged事件。根据滚动位置和项的高度计算出当前可视区域的起始索引和结束索引。按需更新从对象池中取出或创建对应数量的ListItem根据计算出的数据索引调用一个Setup(data)方法更新其显示内容。移出可视区域的ListItem回收到对象池。关键代码片段与避坑指南// 伪代码展示核心逻辑 public class VirtualizedScrollRect : ScrollRect { public RectTransform itemPrefab; public int dataCount; private ListItemData _allData; private QueueRectTransform _pool new QueueRectTransform(); private ListRectTransform _activeItems new ListRectTransform(); private float _itemHeight; private int _firstVisibleIndex 0; protected override void Start() { base.Start(); content.sizeDelta new Vector2(content.sizeDelta.x, dataCount * _itemHeight); // 设置Content总高度 onValueChanged.AddListener(OnScrollValueChanged); RefreshVisibleItems(); } private void OnScrollValueChanged(Vector2 normalizedPos) { // 根据垂直滚动位置计算新的_firstVisibleIndex int newIndex Mathf.FloorToInt((1 - normalizedPos.y) * (dataCount - visibleItemCount)); if (newIndex ! _firstVisibleIndex) { _firstVisibleIndex newIndex; RefreshVisibleItems(); // 更新可见项 } } private void RefreshVisibleItems() { // 1. 将滚出视口的项回池 // 2. 计算需要的新项 // 3. 从池中取或创建新项并调用Setup(data) // 4. 更新这些项的位置 } }避坑指南项高度不均如果列表项高度不固定计算会复杂很多。需要预先计算或缓存每一项的累计高度使用二分查找来确定起始索引。快速滚动白屏如果Setup方法开销很大快速滚动时可能来不及更新。可以考虑分帧更新或者在滚动惯性结束后再统一更新。回收池管理回收时务必重置ListItem的状态避免显示旧数据。4.2 案例二扩展Image组件实现圆角与渐变UGUI的Image组件功能有限。我们通过继承MaskableGraphic重写OnPopulateMesh方法可以自定义几何形状。实现圆角矩形Image的核心继承自MaskableGraphic这样能保留遮罩支持。重写OnPopulateMesh不再调用基类方法而是自己计算顶点。顶点计算将矩形分割成中心矩形和四个圆角。每个圆角用多个三角形扇形来模拟。通过VertexHelper添加顶点位置、UV、颜色。属性暴露定义float radius等属性并在属性设置器里调用SetVerticesDirty()以触发重建。实现渐变如从左到右的色变的核心在计算每个顶点位置时根据其X坐标在矩形宽度中的比例从0到1对预设的起始颜色和结束颜色进行插值Color.Lerp得到该顶点的颜色值然后传给VertexHelper.AddVert。注意事项性能圆角分割的精细度顶点数直接影响性能。在移动端需要权衡效果和性能。合批自定义的Graphic只要使用相同的材质通常是UI/Default并且纹理相同依然可以参与合批。但如果你在自定义Shader中引入了新的属性则需要确保材质实例相同。射线检测Graphic默认的射线检测Raycast是基于其矩形区域的。对于圆角Image你可能需要重写IsRaycastLocationValid方法通过计算点击位置是否在圆角矩形内来提供精确的点击检测。5. 高频问题排查与调试技巧实录即使理解了原理实战中还是会遇到各种光怪陆离的问题。这里分享一个排查清单和调试方法。5.1 UGUI常见问题速查表问题现象可能原因排查方向与解决方案UI点击无响应1.Raycast Target未勾选。2. 被上层UI如图像、透明Panel遮挡。3.CanvasGroup的Blocks Raycasts为false。4. 自定义Graphic未正确重写IsRaycastLocationValid。1. 检查组件复选框。2. 检查Hierarchy顺序及RectTransform覆盖区域。3. 检查父节点CanvasGroup设置。4. 在Scene视图开启GameObject/UI/Debug下的Show Raycast可视化。UI显示异常、紫屏1. 材质丢失或Shader错误。2. 图集Sprite Atlas未打包或未在构建中包含。3. 自定义Shader编译错误或属性未正确设置。1. 检查MeshRenderer或CanvasRenderer的Material字段。2. 检查Sprite Atlas的Include in Build设置或检查AssetBundle依赖。3. 查看Console错误日志检查Shader代码。Draw Call异常高1. 合批被打断见3.2节。2. 使用了多个Canvas且未合理分离。3. 大量UI使用了Mask组件。1. 使用Frame Debugger工具逐帧分析Draw Call查看合批中断点。2. 合并静态UI到最少Canvas。3. 用RectMask2D替代Mask。滚动列表卡顿1. 列表项过多重建开销大。2. 列表项内含复杂布局或子UI。3. 使用了ContentSizeFitter等动态布局。1. 实现虚拟化列表见4.1节。2. 简化列表项结构合并纹理。3. 避免在滚动项内使用动态布局预计算尺寸。文字渲染模糊1. 动态字体纹理分辨率不足。2. Canvas的Render Mode为Screen Space - Camera时Canvas Scaler设置不当。3. 设备分辨率与参考分辨率不匹配。1. 增大Font的Font Size和Character集或使用位图字体。2. 调整Canvas Scaler的Match值或使用Scale With Screen Size模式。3. 检查Canvas Scaler的Reference Resolution和Screen Match Mode。5.2 必备调试工具与技巧Frame Debugger (Window Analysis Frame Debugger)这是性能排查的神器。开启后你可以暂停游戏逐一看清每一帧的每一个Draw Call是如何产生的是什么Shader渲染了哪些物体。它能直观地告诉你合批在哪里被打断。Unity Profiler (Window Analysis Profiler)重点关注CPU Usage模块下的Canvas.SendWillRenderCanvases和Canvas.BuildBatch。前者代表重建开销后者代表合批计算开销。如果它们耗时很高就需要按照前面章节的方法进行优化。Editor UI Debugging在Scene视图通过GameObject/UI/Debug菜单可以开启Show Raycast显示可点击区域和Show Mask Graphic Bounds显示遮罩边界对于排查交互和显示问题非常直观。自定义Debug绘制在自定义组件的OnPopulateMesh或Update中可以使用Debug.DrawLine等Gizmos方法在Scene视图绘制出你计算的顶点位置、边界框等对于验证算法逻辑是否正确极其有用。啃源码的过程就像一次探险开始时可能满是荆棘但每理解一个模块就像点亮了一盏灯脚下的路就越发清晰。UGUI的源码并不完美但它提供了一个稳定而强大的框架。通过这次深入分析希望你能获得的不仅是对UGUI运行机制的理解更是一种“源码级”的解决问题思维方式。下次当UI再出现诡异问题时你大可以自信地打开Frame Debugger和Profiler顺着数据流的线索直捣黄龙。

相关新闻

Python文本润色接口开发:从数据清洗到NLP优化

Python文本润色接口开发:从数据清洗到NLP优化

1. 项目背景与需求分析最近在开发一个内容爬取系统时,遇到了一个典型问题:从不同网站抓取的文本内容质量参差不齐,有的包含大量无意义字符,有的语句不通顺,还有的夹杂着广告信息。这种原始数据直接存入数据库不仅影响后…

2026/8/11 3:35:25 阅读更多 →
AI Agent核心架构解析与主流框架实战指南

AI Agent核心架构解析与主流框架实战指南

1. 从工具到伙伴:AI Agent的范式革命 如果你最近关注AI领域,会发现一个词的热度正在急剧攀升,甚至盖过了年初大火的“RAG”(检索增强生成),那就是“AI Agent”。它不再是实验室里的概念,而是正在…

2026/8/11 3:35:25 阅读更多 →
3步解锁弹幕魔法:让视频互动从XML到ASS一键蜕变

3步解锁弹幕魔法:让视频互动从XML到ASS一键蜕变

3步解锁弹幕魔法:让视频互动从XML到ASS一键蜕变 【免费下载链接】DanmakuFactory 支持特殊弹幕的xml转ass格式转换工具 项目地址: https://gitcode.com/gh_mirrors/da/DanmakuFactory 还在为视频弹幕格式不兼容而头疼吗?DanmakuFactory是你的专业…

2026/8/11 3:35:25 阅读更多 →

最新新闻

B站弹幕二进制协议逆向解析:从Protobuf到Frida Hook实战

B站弹幕二进制协议逆向解析:从Protobuf到Frida Hook实战

1. 项目概述:从B站弹幕到二进制解析的探索最近在做一个跟B站视频数据相关的项目,不可避免地要跟它的弹幕系统打交道。我们都知道,B站的弹幕是它的灵魂,但当你真正想从技术层面去“理解”这些弹幕时,会发现它们并非以我…

2026/8/11 5:59:00 阅读更多 →
Linux驱动---Linux 中断系统及其上与下半部的介绍与阻塞IO实现按键检测

Linux驱动---Linux 中断系统及其上与下半部的介绍与阻塞IO实现按键检测

目录 一. Linux 的中断系统 1.1 中断概念 1.2 回顾裸机中中断处理方法 1.3 Linux 中断相关API函数 1.3.1 request_irq 函数 1.3.2 free_irq 函数 1.3.3 中断处理函数 1.3.4 中断使能与禁止函数 二. 中断的上半部与下半部 2.1 简介 2.2 下半部的实现方式 2.2.1 软中断…

2026/8/11 5:59:00 阅读更多 →
云原生 AI 调度开发短记:本地环境如何复现

云原生 AI 调度开发短记:本地环境如何复现

云原生 AI 调度开发短记:本地环境如何复现 对于调度器,任务提交、队列选择和执行状态回写比抽象架构更值得先检查。本文把“本地开发环境与可复现实验脚手架”限定为可由配置、代码和测试记录交叉验证的事项。 云原生 AI 平台搭建与智能调度系统设计&…

2026/8/11 5:59:00 阅读更多 →
AE 3D图层零基础入门:一键打造立体PV画面的核心技法

AE 3D图层零基础入门:一键打造立体PV画面的核心技法

1. 背景与核心概念:为什么需要3D化PV画面?在视频制作和后期特效领域,After Effects(简称AE)是当之无愧的行业标准工具之一。无论是影视包装、广告片头,还是如今流行的短视频和PV(Promotion Vide…

2026/8/11 5:59:00 阅读更多 →
OpenClaw与Nextcloud Talk整合:智能企业通讯解决方案

OpenClaw与Nextcloud Talk整合:智能企业通讯解决方案

1. 项目背景与核心价值OpenClaw人人养虾这个项目名称乍看有些趣味性,实际上揭示了两个关键技术方向:OpenClaw开源框架与Nextcloud Talk的深度整合。作为一款新兴的AI智能体开发平台,OpenClaw正在改变传统企业通讯工具的交互方式。我最近在部署…

2026/8/11 5:59:00 阅读更多 →
按项目阶段选厂:PCB打样、小批量、量产选型差异化策略

按项目阶段选厂:PCB打样、小批量、量产选型差异化策略

研发打样、试产验证、大规模量产三个阶段,对 PCB 厂家的核心诉求截然不同,不少团队全程固定单一供应商,打样阶段嫌大厂起订量高,量产阶段嫌弃小厂产能不足,造成预算浪费、工期延误。本文拆解不同阶段选型侧重点&#x…

2026/8/11 5:58:00 阅读更多 →

日新闻

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…

2026/8/11 0:00:02 阅读更多 →
前后端分离项目中控制台与接口工具数据差异排查指南

前后端分离项目中控制台与接口工具数据差异排查指南

1. 问题现象解析:控制台与Apifox的数据差异 最近在调试一个前后端分离项目时,遇到了一个典型问题:后端服务在本地开发环境控制台能正常输出查询数据,但通过Apifox测试时却返回空结果。这种"控制台有数据,接口工具…

2026/8/11 0:00:03 阅读更多 →
AI编程实战:从Claude Code踩坑到游戏开发入门

AI编程实战:从Claude Code踩坑到游戏开发入门

1. 从“AI能帮我做游戏”到“AI让我重新学编程”最近身边不少朋友,尤其是一些非技术背景、但对游戏开发有浓厚兴趣的朋友,都在问我同一个问题:“听说现在用Claude Code这种AI编程工具,小白也能做游戏了,是真的吗&#…

2026/8/11 0:00:03 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/11 1:08:05 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/11 1:08:05 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/11 1:08:05 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/10 17:07:33 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/11 1:08:06 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/10 17:07:33 阅读更多 →