待优化方案¶
本文记录已识别、但不应在缺少基准和目标平台回归时直接修改的优化项。每项均包含问题、解法和验收条件。
渲染与图像¶
GPU 图层合成¶
- 问题:当前图层混合主要在 CPU 完成,随后才上传或提交到图形目标,像素搬运成本较高。
- 解法:先统计各混合模式、图层数量、分辨率和帧耗时;将可表达为 shader 的普通 alpha、加法和常用滤镜迁移到 GPU;保留 CPU 标量路径作为回退,并按混合模式逐像素比对。
- 验收:画面结果与标量路径一致,内存带宽和帧耗时下降,低端设备不出现掉帧或发热恶化。
IOSurface 与 SurfaceTexture 缓冲复用¶
- 问题:回读路径可能产生重复分配和复制,尺寸变化时还存在异步请求竞争。
- 解法:为每个渲染目标维护尺寸、stride、frame serial 和 context generation;使用双缓冲或池化缓冲区;通过递增版本号丢弃过期尺寸请求。
- 验收:旋转、后台恢复、快速调整窗口和渲染路径切换时不会显示旧帧,且无资源泄漏。
纹理缓存¶
- 问题:资源缓存容量、命中率和上下文重建后的失效策略需要量化。
- 解法:增加缓存命中率、淘汰次数和重建次数统计;将 GPU 对象绑定到 context generation;采用按内存预算的 LRU,而不是固定数量。
- 验收:上下文重建后不复用失效 GPU 对象,峰值内存受预算约束,常见场景加载时间不增加。
脚本与数据处理¶
TJS2 热路径¶
- 问题:解释器在属性查找、Variant 转换和函数调用上存在高频开销。
- 解法:先使用采样分析定位热点,再评估 computed-goto、缓存属性槽位和减少临时 Variant;任何优化都必须保留异常、作用域和动态属性语义。
- 验收:脚本基准集结果一致,长时间运行无对象泄漏,解释器在各编译器下可构建。
PSB 与归档解码¶
- 问题:资源解析和图像解码可能重复读取、重复转换或占用过多临时内存。
- 解法:按资源键缓存解析后的元数据;使用流式解码和复用临时缓冲;将压缩格式判断与像素格式转换分开,避免错误格式回退造成重复工作。
- 验收:同一资源只解析一次,解码结果与基准文件一致,峰值内存和加载耗时可量化改善。
Flutter FFI 帧接口¶
- 问题:高频帧描述、像素回读和 Dart 图像创建可能触发重复分配与复制。
- 解法:复用 FFI 描述结构和 native buffer;使用 frame serial 避免重复读取;在尺寸变化时保留一次重试,明确 buffer 所有权后再移除复制。
- 验收:CPU 回读模式的分配次数下降,stride、尺寸变化、dispose 和异常路径均无泄漏。
字体与文本¶
字体缓存与字形降级¶
- 问题:字体面、字号、字形和预渲染位图的生命周期及度量来源不同,可能造成错位或失效对象访问。
- 解法:以字体面、字号、样式和字符集建立明确缓存键;将字形度量与位图来源绑定;为缺字、字体面失效和缓存淘汰分别记录状态;空字形仅作为最后降级。
- 验收:预渲染字体和运行时字体基线一致,缺字不阻断脚本,重启和字体切换不访问已释放对象。
音频与视频¶
视频帧调度¶
- 问题:解码、音视频时钟、丢帧和场景合成之间需要统一时序。
- 解法:建立单调媒体时钟;按显示时间戳选择帧;为暂停、跳转、结束和循环定义队列清理规则;目标 Layer 更新使用明确线程边界。
- 验收:视频连续播放不积压,音画同步,暂停与跳转无旧帧,重复播放不泄漏线程和纹理。
音频混音¶
- 问题:音频通常不是主要瓶颈,但多声道、变速和重启场景需要稳定的缓冲策略。
- 解法:记录混音队列深度和 underrun 次数;仅在数据证明必要时优化缓冲复用或 SIMD;保持音量、循环和停止语义不变。
- 验收:无爆音、断音和重启后残留播放,CPU 占用不升高。
代码结构¶
头文件依赖¶
- 问题:大型头文件和重复 include 会增加编译时间并扩大耦合面。
- 解法:先由编译数据库统计 include 依赖,再用前置声明、私有实现和模块边界逐步收敛;每次只处理一个目标。
- 验收:全平台构建通过,公共 ABI 不变,增量编译时间下降。
平台代码边界¶
- 问题:部分共享目录名称带有平台历史含义,容易诱发错误删除或错误迁移。
- 解法:优先通过文档说明真实共享边界;若要改名,先更新 CMake、include 和脚本引用,再分平台构建验证。
- 验收:iOS、Android、macOS 和 Linux 验证目标均通过,平台守卫行为不变。
通用验收原则¶
- 先建立旧实现基线,再实施单项优化。
- 正确性优先于吞吐量;像素、脚本、音视频和存档行为必须可回归。
- 生命周期优化必须覆盖创建、重启、异常、后台恢复和销毁。
- 诊断探针默认关闭,高频指标使用采样或计数器,避免改变被测时序。