SuperAPI AI 工具集

makepad-2.0-performance

编程与开发

查看项目

更新于 10-16 02:15

技能介绍

用途

Makepad 2.0 Performance & Debugging Skill 用于 Makepad 2.0 的性能优化与调试。Makepad 采用独特的渲染管线并结合 Splash 脚本虚拟机,其性能表现取决于对三类关键子系统的理解:Draw Batching(绘制批处理)、Garbage Collection(垃圾回收)与 Render Triggers(渲染触发)。与传统的保留模式 UI 框架不同,Makepad 使用受即时模式启发的绘制管线,控件将绘制命令写入一个排序后的批处理列表。理解该管线对于诊断文本不可见、闪烁和性能回退至关重要。

主要能力

绘制批处理系统

Makepad 会自动把使用同一着色器的连续绘制调用合并为单个 GPU 绘制调用。这带来显著性能优化,但也导致绘制顺序可能出乎意料。当 View 设置了 show_bg: true 且包含文本子元素时,文本可能被背景遮住。资料提供简化的绘制管线示意:默认情况下,所有背景着色器先绘制,所有文本着色器随后绘制。

new_batch: true 用于在某处强制开启新的绘制批次,内部会创建 ViewOptimize::DrawList,确保该 View 子树内的绘制顺序正确。资料列出需要 new_batch: true 的场景:包含文本的 show_bg: true View(需要)、带悬停动画且有文本子元素的 View(需要)、包含重复项且带背景的容器(需要)、无 show_bg 的透明 View 与文本(不需要)、仅含非文本子元素的 View(不需要)、多层嵌套且各带背景的 View(每层需要)。

资料还说明 ViewOptimize 的内部映射:new_batch 对应 ViewOptimize::DrawList,texture_caching 对应 ViewOptimize::Texture,若两者同时设置则 texture_caching 优先。

纹理缓存

在 View 上设置 texture_caching: true 会把整个子控件树渲染到离屏 GPU 纹理;后续帧若子树未变化,可跳过重新渲染并直接绘制缓存纹理。资料提供 CachedView 与 CachedRoundedView 两个预置缓存视图,并说明适合与不适合使用的场景及收益/成本权衡。

垃圾回收

Splash VM 使用标记-清除垃圾回收器,并为不同值类型划分独立堆:Objects、Arrays、Strings、Pods、Handles、Regexes。GC 采用类似 Lua 与 V8 的基于增长的启发式策略:增长因子为 2 倍,并设有最小阈值(Objects 1024、Strings 256、Arrays 128、Pods 128、Handles 64)。触发条件为 current_count >= MIN_THRESHOLD 且 current_count >= last_gc_count * 2。

脚本 API 包括:mod.gc.run()(立即强制 GC,无日志输出)、mod.gc.run_status()(强制 GC 并打印统计)、mod.gc.set_static(value)(将值及其可达对象图标记为静态,永不被回收,标记阶段跳过,且在 VM 生命周期内不可撤销)、mod.gc.dump_tag(value)(打印对象的内部 tag 信息,如类型索引、静态标志、原型链)。资料还给出静态 UI 树、动态内容、长运行应用定期手动 GC 三种模式,以及标记阶段根对象与线程栈等细节。

渲染优化

Makepad 2.0 使用基于拉取的渲染模型。View 上的 on_render 回调仅在该 View 调用 .render() 时执行。资料给出高效渲染规则:不要无谓调用 .render();只渲染受影响的子树;避免在紧凑循环中渲染;使用 on_startup 进行首次渲染。并说明渲染作用域:调用某 View 的 .render() 只执行该 View 的 on_render 回调,拥有自身 on_render 的子 View 不会自动重新渲染。

调试日志

Rust 侧可使用 makepad_widgets 的 log! 宏。Splash 脚本侧可使用 log() 或字符串插值进行调试。GC 状态日志方面,mod.gc.run_status() 输出各堆的 S(static 永久)、A(alive 存活)、R(removed 已释放)统计。

常见性能问题与修复

资料列出常见问题、成因与修复方式,包括:文本不可见(缺少 new_batch)、悬停时文本消失、UI 冻结/卡顿(过度调用 .render())、内存无界增长、初始加载缓慢、滚动卡顿(使用 PortalList 虚拟化)、悬停无响应(View 缺少 show_bg: true)、运行时找不到控件(命名运算符使用 := 而非 :)、样式覆盖未生效(缺少合并运算符 +:)、布局塌缩为零(缺少 height: Fit)。

PortalList 大型列表

PortalList 对渲染进行虚拟化,只绘制视口内可见项,对 100 项以上的列表是必需的。资料给出脚本侧(配合 on_render)与 Rust 侧(实现 Widget trait)的用法,并对比 FlatList 与 PortalList 在虚拟化、适用项数、内存使用和滚动性能上的差异。

ViewOptimize 选项与调试清单

资料汇总 ViewOptimize 选项:默认 None、new_batch: true 对应 DrawList、texture_caching: true 对应 Texture、visible: false 则完全跳过渲染,并指出 texture_caching 优先于 new_batch。最后提供 UI 不显示、文本不可见等场景的调试检查清单。

使用方式

资料中未提供该技能的具体安装命令或调用步骤,仅以技能名称与来源形式呈现。缺失信息暂未提供。

适用场景

使用 Makepad 2.0 构建 UI 的开发者,在遇到渲染顺序错误、文本被遮挡、悬停动画覆盖文字、渲染卡顿、内存回收异常、长列表滚动性能问题等场景时可参考本技能。

限制

该技能内容针对 Makepad 2.0 与 Splash VM,不适用于其他 UI 框架。资料中对工具、收费、价格或平台支持等信息暂未提供。