1. 课程导入
在移动端与嵌入式图形应用中,用户对“流畅”的感知往往先于对“画质”的评价。一次滑动列表的卡顿、一次点击按钮后 300ms 的延迟、一次长时间游戏后机身发烫导致的降频,都会直接转化为差评与流失。性能优化不是“锦上添花”的后期工作,而是贯穿需求、架构、编码、测试、上线全生命周期的工程能力。本课程以“旭日”平台为背景,围绕帧率、延迟、内存、温度四个核心指标,建立一套可测量、可定位、可验证的优化方法论。
一、为什么性能优化如此重要
性能问题具有“木桶效应”:帧率、延迟、内存、温度四者相互耦合。例如,内存分配过多会触发频繁 GC,造成帧率抖动;GPU 负载过高会拉高功耗,进而使 SoC 升温降频,最终表现为延迟增大与掉帧。因此,孤立地优化单一指标往往收效有限,必须建立系统视角。
- 用户体验:60fps 下每帧预算约 16.6ms,120fps 下仅 8.3ms,任何超支都会造成可见卡顿。
- 商业价值:启动时间每减少 100ms,转化率与留存率通常有可观测提升。
- 硬件约束:移动设备散热能力有限,持续高性能输出必然伴随温控策略介入。
- 成本控制:更低的内存占用意味着更少的 OOM 崩溃与更低的设备门槛。
性能优化的本质,是在有限的时间预算与功耗预算内,把计算、渲染、IO 和内存访问安排到最合适的位置。
二、核心概念:四个指标与一条主线
本课程的主线是“测量 → 定位 → 优化 → 验证”。四个核心指标定义如下:
| 指标 | 关注对象 | 典型目标 | 常用工具/信号 |
|---|---|---|---|
| 帧率 FPS | 渲染管线、UI 线程、GPU 提交 | 稳定 60/120fps,帧时间 P95 达标 | FrameTimeline、Choreographer、GPU 计数器 |
| 延迟 Latency | 输入到显示的端到端链路 | 触控响应 < 50ms,首帧 < 1s | InputDispatcher、VSync 偏移、trace 打点 |
| 内存 Memory | 堆、纹理、缓存、泄漏 | 峰值可控、无持续增长、无 OOM | Heap Profiler、Graphics Memory、RSS/PSS |
| 温度 Thermal | SoC、GPU、电池、外壳 | 不触发降频,表面温度舒适 | Thermal Zone、频率统计、功耗轨 |
下图给出四类指标之间的因果与数据流关系,帮助建立整体框架:
三、方法流程:从基线到回归
性能优化最忌讳“凭感觉改代码”。正确流程是先建立可复现的基线,再用工具定位瓶颈,最后用数据验证收益。
- 建立基线:固定设备、系统版本、场景与数据,记录 FPS、帧时间 P95、内存峰值、温度曲线。
- 定位瓶颈:区分 CPU 瓶颈、GPU 瓶颈、IO 瓶颈还是内存瓶颈,避免“优化错对象”。
- 实施优化:按收益/成本排序,优先处理高频路径与长尾帧。
- 回归验证:对比优化前后数据,确认无功能回退与新的性能回退。
例如,采集帧时间分布时,可先通过命令行抓取关键指标:
# 采集 10 秒帧时间与内存快照(示例)
perfetto -c trace_config.pbtx -o trace.perfetto-trace
adb shell dumpsys gfxinfo com.example.app framestats
adb shell dumpsys meminfo com.example.app | head -n 20
建议把“帧时间 P95 / P99”作为核心验收指标,而不是只看平均 FPS。平均值会掩盖长尾卡顿,而用户恰恰对长尾最敏感。
四、案例与场景:一次滑动卡顿的排查
某信息流应用在快速滑动时出现周期性掉帧。初步观察平均 FPS 仍有 55,但 P99 帧时间达到 48ms。排查发现:列表项在滚动中频繁创建 Bitmap 并触发 GC,同时 GPU 纹理上传与主线程解码竞争。优化措施包括:复用 Bitmap 池、将解码移至 IO 线程、预取相邻项、限制同时解码数量。优化后 P99 帧时间降至 18ms,内存峰值下降约 30%,机身温度上升速度明显放缓。
这个案例说明:帧率问题常常根源于内存与调度问题,而温度则是持续高负载的结果而非原因。
五、常见误区与复盘
- 误区一:只盯平均 FPS。 应关注帧时间分布与长尾帧。
- 误区二:过早优化。 没有基线和 profiling 的优化容易引入复杂度却无收益。
- 误区三:忽视温度。 短时跑分正常,长时间运行后降频,体验断崖式下降。
- 误区四:优化后不复测。 性能回退往往在版本迭代中悄悄发生。
不要用“感觉更流畅了”作为验收结论。性能优化必须用可复现的数据说话,否则无法定位回退、无法沉淀经验。
六、学习目标与课程地图
完成本课程后,你将能够:
- 理解帧率、延迟、内存、温度四类指标的测量方法与相互影响;
- 使用主流工具完成性能数据采集、瓶颈定位与归因分析;
- 掌握渲染、内存、调度、功耗等方向的常用优化手段;
- 建立性能回归与监控机制,把优化成果稳定保持到线上。