UE材质数据流深度解析:从Uniform Buffer到ActorPosition节点
1. 项目概述一次对UE材质数据流的深度“解剖”在虚幻引擎UE的材质编辑中ActorPosition节点是一个看似简单、实则蕴含着引擎底层数据流复杂性的绝佳案例。很多开发者包括我自己在早期都习惯性地把它拖进材质图用它来驱动一些基于物体位置的效果比如让物体边缘发光、或者根据距离渐变颜色。但你是否想过这个节点返回的“世界空间位置”数据究竟是如何从CPU端的游戏逻辑跨越到GPU端的着色器程序中的这中间经过了怎样的封装、传递和解析今天我们就抛开表面的材质连线深入到Shader源码和Uniform Buffer的层面完整地拆解一遍ActorPosition节点的数据传递链路。这不仅是为了满足技术好奇心更是为了让你在优化材质性能、调试复杂着色效果甚至编写自定义材质节点时能够做到心中有数知其然更知其所以然。简单来说这个过程可以概括为游戏逻辑CPU计算每个Actor的变换矩阵 - 引擎渲染模块将矩阵等数据打包进特定的Uniform Buffer - HLSL Shader通过预定义的常量缓冲区结构体读取数据 -ActorPosition节点背后的HLSL函数从这些常量中解算出世界坐标并输出。我们将沿着这条链路一步步揭开其神秘面纱。无论你是想深入理解UE渲染管线的材质艺术家还是致力于图形性能优化的TA或程序员这次“解剖”之旅都将让你获益匪浅。2. 核心概念与链路总览在深入代码之前我们必须先建立几个关键概念它们是理解整个传递链路的基石。2.1 关键角色定义Uniform Buffer (常量缓冲区)这是GPU编程中的核心概念。你可以把它想象成GPU显存中的一小块“公告板”或“参数表”。CPU将一批相关的、在本批次绘制中保持“恒定Uniform”的数据如视图矩阵、投影矩阵、灯光参数、物体变换矩阵等一次性写入这块缓冲区。然后在绘制调用Draw Call发生时整个着色器程序Vertex Shader, Pixel Shader等都可以高效地读取这块缓冲区里的数据而无需CPU与GPU之间为每个顶点或像素频繁通信。在UE中Uniform Buffer被大量用于组织渲染参数是实现高效数据传递的关键机制。Primitive Uniform Buffer (图元常量缓冲区)这是UE中一个特定的Uniform Buffer它包含了与当前正在渲染的“图元”Primitive通常对应一个Actor或静态网格体组件密切相关的数据。最重要的数据之一就是LocalToWorld矩阵。这个4x4矩阵定义了该图元从自身局部坐标系Local Space到世界坐标系World Space的变换关系。ActorPosition节点所需的数据源头正是来自于此。Material Template (材质模板)UE的材质系统并非直接编译你连的节点图成为最终的HLSL代码。相反它采用了一种“模板”机制。引擎内置了一个庞大的HLSL文件如MaterialTemplate.ush其中包含了各种材质节点可能对应的HLSL函数实现和通用的数据处理流程。当你在材质编辑器中创建节点并连线时材质编译器会解析你的图表然后像“填空”一样将对应的函数调用、参数计算逻辑“注入”到这个模板的特定位置最终生成一份为该材质量身定制的HLSL Shader源码。GetPrimitiveData函数这是UE材质Shader中一个至关重要的内部函数。它的职责就是从Primitive Uniform Buffer中安全地读取数据。由于渲染状态复杂比如是否在深度预通道、阴影通道中直接访问缓冲区可能不安全或获取不到正确数据。GetPrimitiveData封装了这些细节提供了统一的访问接口。2.2 数据传递链路全景图整个链路是一个清晰的单向数据流CPU端游戏线程/渲染线程每个可渲染的UPrimitiveComponent如StaticMeshComponent都会在渲染前更新其渲染代理FPrimitiveSceneProxy中的数据。其中FPrimitiveSceneProxy::GetLocalToWorld()函数提供了该组件当前的LocalToWorld矩阵。在渲染器构建绘制列表时这个矩阵连同其他图元数据如自定义数据、光照映射数据等会被打包准备填入GPU端的Primitive Uniform Buffer。GPU端Shader执行材质系统生成的Shader代码中会包含对Primitive Uniform Buffer的定义和引用。当需要ActorPosition时材质编译器会在模板中插入调用GetPrimitiveData函数的代码。GetPrimitiveData函数从缓冲区中取出LocalToWorld矩阵。对于一个通常被认为是“点”的图元其局部空间原点为(0,0,0)其世界空间位置可以通过LocalToWorld矩阵的第四列或通过变换零向量float4(0,0,0,1)直接取得。这就是ActorPosition节点的输出值。注意这里有一个极其重要的细节。ActorPosition返回的实际上是当前渲染图元Primitive的局部坐标系原点在世界空间中的位置。对于大多数简单的静态网格体Actor这个位置就是Actor的根组件位置。但对于骨骼网格体、或者有复杂层级关系的Actor它指的是该特定网格体组件的原点位置而非整个Actor的GetActorLocation()。理解这一点对实现精准的效果至关重要。3. 从源码层面追踪数据流理论说再多不如直接看代码来得实在。让我们打开UE的引擎源码这里以某个版本为例核心逻辑长期稳定扮演一次“数据侦探”。3.1 起点材质节点与HLSL代码生成首先我们找到ActorPosition节点的实现类通常是UMaterialExpressionActorPositionWS。在其Compile函数中我们可以看到它如何告诉材质编译器生成什么样的代码。// 伪代码示意核心逻辑 int32 UMaterialExpressionActorPositionWS::Compile(FMaterialCompiler* Compiler, int32 OutputIndex) { // 调用编译器接口请求生成获取Primitive世界位置的代码。 // FMaterialCompiler 是一个抽象层将材质节点图转化为中间表示。 return Compiler-PrimitiveWorldPosition(ExpressionGUID); }编译器收到这个请求后会在处理材质模板时在相应的位置通常是顶点着色器或像素着色器计算初始位置数据的地方插入一个特定的函数调用标记。最终在生成的HLSL代码中你会看到类似这样的语句// 在MaterialTemplate.ush中对应位置生成的代码 float3 WorldPosition GetPrimitiveWorldPosition(Parameters);这里的Parameters是一个包含了所有材质输入参数的结构体而GetPrimitiveWorldPosition是一个在模板中定义的辅助函数。3.2 核心GetPrimitiveWorldPosition 的实现让我们追踪这个函数。在MaterialTemplate.ush或其包含的文件中如BasePassCommon.ush我们可以找到它的定义// 伪代码展示核心逻辑 float3 GetPrimitiveWorldPosition(FMaterialPixelParameters Parameters) { // 通过GetPrimitiveData获取图元数据 FPrimitiveData PrimitiveData GetPrimitiveData(Parameters.PrimitiveId); // PrimitiveData.LocalToWorld 是一个float4x4矩阵 // 物体的世界位置通常可以通过矩阵的第四列m[3]获取因为局部空间原点(0,0,0,1)经过矩阵变换后坐标就在这一列。 // 更严谨的做法是变换零向量mul(float4(0,0,0,1), PrimitiveData.LocalToWorld).xyz // 但UE内部常直接取平移分量。 float3 WorldPos PrimitiveData.LocalToWorld[3].xyz; return WorldPos; }3.3 关键GetPrimitiveData 与 Uniform Buffer 的绑定现在到了最关键的环节GetPrimitiveData函数和Primitive Uniform Buffer是如何关联的我们查看GetPrimitiveData的实现// 在PrimitiveSceneShaderData.ush等文件中 FPrimitiveData GetPrimitiveData(uint PrimitiveId) { // 通过PrimitiveId索引到对应的Primitive Uniform Buffer PrimitiveUniformShaderParametersStruct UniformBuffer GetPrimitiveUniformShaderParameters(PrimitiveId); FPrimitiveData Data; // 从UniformBuffer中解包数据 Data.LocalToWorld UniformBuffer.LocalToWorld; Data.WorldToLocal UniformBuffer.WorldToLocal; // ... 可能还有其他数据如ObjectBounds, CustomData等 return Data; }而GetPrimitiveUniformShaderParameters这个函数则是由引擎在渲染时通过Shader参数映射将CPU端设置好的PrimitiveUniformBuffer资源绑定到HLSL代码中的一个特定寄存器如t0,b0等。这个绑定关系是在Shader编译时就确定好的。3.4 源头CPU端数据的填充最后我们看向CPU端。在渲染线程中FScene管理者所有图元。当图元被添加到场景或更新时其FPrimitiveSceneProxy会调用UpdateUniformBuffer之类的函数来填充一个FPrimitiveUniformShaderParameters结构体。这个结构体就是GPU端PrimitiveUniformShaderParametersStruct的CPU镜像。// 伪代码展示数据填充 void FPrimitiveSceneProxy::UpdateUniformBuffer() { FPrimitiveUniformShaderParameters Parameters; // 计算当前帧的LocalToWorld矩阵 FMatrix LocalToWorld GetLocalToWorld(); Parameters.LocalToWorld LocalToWorld; Parameters.WorldToLocal LocalToWorld.Inverse(); // ... 填充其他参数 // 将Parameters数据上传到GPU对应的Uniform Buffer资源中 PrimitiveUniformBuffer.UpdateContents(Parameters); }至此一条从CPU逻辑Actor变换到GPU着色器ActorPosition节点输出的完整数据传递链路就清晰地呈现出来了CPU计算矩阵 - 填入Uniform Buffer - Shader通过固定接口读取 - 节点函数解算并输出。4. 实践启示与性能调优理解了链路我们就能在实战中解决具体问题和进行优化。4.1 常见问题诊断问题1ActorPosition在某些通道如深度预通道、阴影通道返回零向量或错误值。诊断这是因为在这些特殊的渲染通道中引擎可能为了性能没有完整地设置Primitive Uniform Buffer或者GetPrimitiveData函数针对这些通道返回了简化数据。解决检查你的材质是否在“材质域”设置正确例如表面材质不应在延迟贴花域中使用。对于必须在多通道中使用的复杂材质可能需要通过自定义节点和BranchOnPass表达式来区分不同通道的逻辑。问题2使用ActorPosition驱动的效果在Instanced Static Mesh (ISM) 或 Hierarchical Instanced Static Mesh (HISM) 上所有实例位置都一样。诊断ActorPosition节点获取的是**图元Primitive**的原点位置。对于一个ISM组件整个组件是一个图元其LocalToWorld是组件的变换矩阵。组件内每个实例的位置偏移是通过额外的Instance Local To World矩阵数组存储在InstanceUniformBuffer中来传递的。ActorPosition节点默认不感知这个数组。解决要获取每个实例独有的世界位置需要使用InstanceLocalPosition或ObjectPosition节点后者在某些上下文中会自动处理实例化。更高级的做法是使用Custom Primitive Data或PerInstanceRandom等通道将计算好的世界位置从Gameplay代码端传递进来。问题3材质中大量使用ActorPosition进行每像素计算导致Shader指令数激增性能下降。诊断ActorPosition的计算虽然最终只是从Uniform Buffer中读取但如果它在像素着色器中被复杂函数频繁调用或者用于驱动诸如WorldPositionOffset这样需要逐顶点计算的内容但实际在像素着色器求值都会增加GPU负担。优化移至顶点着色器如果效果允许尝试将基于位置的计算移到WorldPositionOffset或自定义顶点插值器中在顶点阶段计算一次然后通过插值传递给像素着色器。预计算与简化考虑是否可以用物体空间坐标ObjectPosition或纹理坐标UV来近似模拟效果减少对世界位置的依赖。使用材质参数集合对于多个材质共享的、基于少数Actor位置的计算如到某个目标点的距离场可以在CPU端计算好通过Material Parameter Collection传递一个全局参数避免每个材质各自重复计算。4.2 高级应用自定义数据传递理解了Uniform Buffer机制我们就可以超越内置节点传递自定义数据。方法一使用Custom Primitive DataUE为每个图元提供了最多8个float4的“自定义图元数据”通道。你可以在C端通过PrimitiveComponent-SetCustomPrimitiveData()设置数据在材质端通过CustomPrimitiveData节点读取。这是传递简单标量或向量信息如生命值、状态标志、自定义时间的最高效方式之一因为它直接走我们刚才分析的Primitive Uniform Buffer链路。方法二创建自定义Uniform Buffer对于更复杂、结构化的数据高级开发者可以定义自己的Uniform Buffer结构体在C端继承TUniformBuffer在HLSL端定义对应的cbuffer。然后在渲染线程中填充数据并绑定到Shader。这给了你最大的灵活性但实现复杂度也最高通常用于渲染器模块开发或极其特殊的游戏功能。实操心得在大多数游戏逻辑向材质传参的场景下优先考虑Custom Primitive Data。它简单、高效且与引擎的图元批处理、合批优化兼容性好。只有在Custom Primitive Data的8个float4容量不够或者数据需要在不同材质类型间以复杂结构共享时才需要考虑材质参数集合或自定义Uniform Buffer。盲目使用最复杂的方法往往会引入不必要的维护成本和性能隐患。5. 调试技巧与工具使用当基于ActorPosition的效果不如预期时掌握正确的调试工具至关重要。5.1 使用Shader调试器现代图形调试器如RenderDoc、PIX可以捕获一帧的GPU调用。你可以捕获绘制了你问题材质的Draw Call。在捕获的帧中找到对应的像素着色器或顶点着色器实例。检查其绑定的Constant Buffers即Uniform Buffers。通常你能找到一个名为Primitive或类似名称的缓冲区。展开这个缓冲区直接查看其中LocalToWorld矩阵的值。对比你期望的Actor世界变换看是否一致。这是验证数据源是否正确的终极手段。5.2 利用材质预览与节点探查在UE编辑器内材质预览窗口将材质应用到一个预览模型上在细节面板中实时调整模型位置观察材质效果变化。这是最直接的验证。材质节点“预览”功能对于大多数材质表达式节点你可以右键点击它选择“开始预览”。然后在材质预览窗口中你会看到该节点输出值的可视化通常是灰度图或颜色图。对于ActorPosition你可以通过一个简单的Component Mask和LinearInterpolate节点将位置向量的X、Y、Z分量映射到RGB颜色上直观地看到不同位置输出的颜色变化。5.3 编写诊断性材质创建一个专门的“诊断材质”可以快速定位问题。位置可视化材质用ActorPosition减去一个固定原点然后除以一个范围再通过Fresnel或Dot Product节点转换成颜色可以直接在场景中看到物体世界位置的梯度变化。Custom Primitive Data调试材质创建一个材质用8个CustomPrimitiveData节点分别驱动自发光颜色然后在C端设置不同的数据立刻就能在场景中看到哪个通道被正确设置了。6. 总结与延伸思考这次从ActorPosition节点出发深入Uniform Buffer和Shader源码的探索本质上是一次对UE材质系统数据流管道的“血管造影”。我们清晰地看到了数据从游戏逻辑的“心脏”CPU泵出经由“血管”渲染管线与Uniform Buffer最终到达“末梢组织”像素着色器的全过程。对于日常开发我的体会是不必畏惧底层复杂但要建立正确的心智模型。当你把ActorPosition、ObjectPosition、CameraPosition等节点不再看作黑盒而是看作某个特定Uniform Buffer数据的便捷访问器时很多疑难杂症就都有了排查的思路。当效果出错时你的排查路径将从“材质图连错了线”这种表面层深入到“数据源是否正确填充”、“Shader通道是否支持”、“实例化如何处理”等更本质的层面。最后一个小技巧分享当你需要非常精确的控制且发现内置节点无法满足需求时比如需要获取上一帧的Actor位置做运动模糊不要死磕材质图表。最稳健的方案往往是在C端将计算好的结果通过Custom Primitive Data或动态材质参数传递到材质中。让CPU做它擅长的逻辑计算让GPU做它擅长的并行渲染通过清晰的数据接口连接两者这才是高效利用UE渲染框架的正道。

相关新闻

OpenCV C++实现交互式ROI选择:从鼠标回调到图像提取完整指南

OpenCV C++实现交互式ROI选择:从鼠标回调到图像提取完整指南

1. 项目概述:为什么需要手动框选ROI? 在图像处理和计算机视觉项目中,ROI(Region of Interest,感兴趣区域)是一个基础但至关重要的概念。无论是做目标追踪、图像分割,还是简单的图像裁剪&#x…

2026/8/5 1:22:37 阅读更多 →
Linux系统root密码丢失的三种恢复方法:单用户模式、GRUB参数与Live环境

Linux系统root密码丢失的三种恢复方法:单用户模式、GRUB参数与Live环境

1. 项目概述:当“钥匙”丢失时,我们如何重获系统最高权限 在Linux系统运维和管理的日常工作中,最让人头疼的突发状况之一,莫过于忘记了 root 用户的密码。这就像你拥有一座功能齐全的城堡,却把唯一一把能打开所有房…

2026/8/5 1:22:37 阅读更多 →
Linux系统root密码丢失的三种恢复方案:从GRUB单用户到Live环境实战

Linux系统root密码丢失的三种恢复方案:从GRUB单用户到Live环境实战

1. 项目概述:当“钥匙”丢失时,我们如何重获系统控制权在Linux系统运维和日常管理中,最令人头疼的突发状况之一,莫过于忘记了root用户的密码。这就像把自家大门的唯一钥匙弄丢了,虽然家(系统)就…

2026/8/5 1:22:37 阅读更多 →

最新新闻

TeeTeePor:Python开发者的智能依赖补全工具,告别ModuleNotFoundError

TeeTeePor:Python开发者的智能依赖补全工具,告别ModuleNotFoundError

最近在开源社区里,一个名为“TeeTeePor”的项目突然火了起来。如果你在GitHub上搜索,会发现它并非一个传统的、功能庞大的框架或库,而是一个小巧、有趣,甚至名字都带着一丝俏皮的项目。很多开发者第一眼看到这个名字和简介&#x…

2026/8/5 2:09:58 阅读更多 →
软件架构设计实战指南:从核心目标到主流模式解析

软件架构设计实战指南:从核心目标到主流模式解析

1. 项目概述:从“码农”到“架构师”的思维跃迁“软件架构设计”这六个字,听起来既宏大又抽象,似乎是那些资深技术专家才需要关心的高深话题。但如果你写过超过三个模块需要交互的代码,或者经历过一次因为需求变更导致整个系统推倒…

2026/8/5 2:09:58 阅读更多 →
AI攻击已成数据泄露主力军:四大核心手法与智能防御体系构建

AI攻击已成数据泄露主力军:四大核心手法与智能防御体系构建

1. 先看数据:AI攻击已成数据泄露的“主力军”,损失远超想象最近一份来自IBM的调查报告,给所有关注网络安全和数据安全的人提了个醒。报告里有个数字非常扎眼:在所有由恶意攻击导致的数据泄露事件中,由AI驱动的攻击已经…

2026/8/5 2:09:58 阅读更多 →
2026值得长期使用的八字排盘软件怎么选:案例沉淀、复盘能力与数据边界

2026值得长期使用的八字排盘软件怎么选:案例沉淀、复盘能力与数据边界

选择八字排盘软件,如果只是偶尔起一个盘,重点可能是界面是否顺手、结果是否容易看懂;但如果准备在 2026 年长期学习、记录命例、复盘思路或用于教学研究,就要把判断标准往后延伸一步:它能不能让案例持续沉淀&#xff0…

2026/8/5 2:09:58 阅读更多 →
野火i.MX嵌入式Linux开发实战:从环境搭建到Yocto构建

野火i.MX嵌入式Linux开发实战:从环境搭建到Yocto构建

1. 项目概述:为什么我们需要一本“实战指南”?如果你是一名嵌入式Linux开发者,或者正打算从单片机、RTOS转向更复杂的应用处理器平台,那么“i.MX”这个名字你一定不陌生。作为业界广泛采用的ARM Cortex-A系列处理器,NX…

2026/8/5 2:09:58 阅读更多 →
2026年出差做客户访谈攒了8小时录音 录音文件转文字实测高效解决方案

2026年出差做客户访谈攒了8小时录音 录音文件转文字实测高效解决方案

简短结论 针对8小时客户访谈录音转文字需求,当前主流工具各有适配场景:只需要纯逐字稿可以选专业转写工具,在飞书生态内协作可以选生态自带工具,需要把录音整理成结构化跟进纪要、提炼客户需求或者整理话术知识卡片,听…

2026/8/5 2:08:57 阅读更多 →

日新闻

Java缓存框架:JetCache

Java缓存框架:JetCache

TOC 一、简介 JetCache 是一个 Java 缓存抽象框架,为不同的缓存解决方案提供了统一的使用方式。 它提供的注解比 Spring Cache 更加强大。 JetCache 的注解支持原生 TTL、两级缓存以及在分布式环境中的自动刷新功能,同时你也可以通过代码直接操作 Cach…

2026/8/5 0:00:43 阅读更多 →
AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

需求:通孔焊盘 十字花;过孔 Via 实心直连;贴片焊盘按需设置 AD 测试版本AD24 很多工程师踩坑:全部统一十字,导致接地过孔阻抗高、大电流发热! 一、快捷键打开规则 PCB 界面按下:D R 展开…

2026/8/5 0:00:43 阅读更多 →
AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

更多请点击: https://kaifayun.com 第一章:AI生成素描效果 AI生成素描效果是计算机视觉与风格迁移技术融合的典型应用,其核心在于将彩色照片或RGB图像转换为具有手绘质感、明暗对比强烈、边缘清晰的单色素描图像。该过程通常依赖于深度学习模…

2026/8/5 0:00:43 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/4 11:09:16 阅读更多 →
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/4 13:38:40 阅读更多 →