1. TouchGFX性能调优概述:为什么需要性能调优、性能瓶颈的常见类型、调优的核心原则
各位做嵌入式UI的同行,咱们开门见山。TouchGFX确实是个好东西,界面漂亮、开发效率高。但说实话,我见过太多项目在原型阶段跑得飞起,一到真机量产就卡成PPT。为什么会这样?说白了,就是没把性能调优当回事。
我个人习惯是,项目一开始就把性能指标写进需求文档里。别等到客户拿着秒表来测帧率,那时候再改就晚了。今天这第一讲,咱们先把调优这件事的来龙去脉理清楚。
1.1 为什么需要性能调优
先问个问题:你的MCU主频多少?200MHz?400MHz?跟手机动不动2GHz、3GHz比,差了整整一个数量级。TouchGFX再高效,它也是跑在资源受限的嵌入式平台上。
我在项目中遇到过最典型的情况:客户要求60fps的动画流畅度,结果实际跑出来只有20fps。触摸滑动像在泥巴里拖拽,按钮点击要等半秒才有反馈。这种体验,用户直接摔手机你信不信?
性能调优要解决的核心问题就三个:
- 帧率达标:保证UI动画在目标帧率下稳定运行
- 响应及时:触摸操作、外部事件能在可接受时间内反馈
- 资源可控:CPU、内存、显存占用不超标,不给其他任务留隐患
一句话总结:调优不是炫技,是让UI在硬件限制下跑出最好的效果。你想想看,一个医疗监护仪的界面如果卡顿,医生误判了怎么办?这不是开玩笑的事。
1.2 性能瓶颈的常见类型
做调优的第一步,是知道瓶颈在哪。我根据这些年踩过的坑,把常见瓶颈分成四大类。嗯,这里我画了张图,方便你对照着看。
咱们逐个拆开来看:
渲染瓶颈
这是最直观的。屏幕刷新不过来,帧率直接往下掉。我在一个智能家居面板项目里遇到过,用了太多半透明图层叠加,结果LTDC每帧要混合6层,像素填充率直接爆了。后来把不必要的透明层合并,帧率从18fps拉回到55fps。
内存瓶颈
TouchGFX默认用双缓冲,一个屏幕分辨率800×480、32位色深,光帧缓冲区就要占用800×480×4×2 ≈ 3MB。如果你的MCU只有8MB RAM,三分之一就没了。再加上纹理缓存、字体缓存,内存很容易吃紧。
CPU瓶颈
有时候帧率没问题,但触摸响应慢。我排查过一个问题,发现是某个定时器回调里做了大量字符串格式化操作,占用了CPU时间,导致TouchGFX的tick任务被延迟。嗯,这种问题用RTOS的线程分析工具一抓一个准。
总线瓶颈
这个比较隐蔽。LTDC从SDRAM读数据,DMA在搬运纹理,CPU在刷代码,三条线抢一条AHB总线。我曾经在STM32F769上遇到过,LTDC的优先级设低了,结果画面出现撕裂。调高LTDC的DMA优先级后问题解决。
1.3 调优的核心原则
做调优这么多年,我总结出三条铁律。你记好了,以后遇到性能问题,先拿这三条对照一遍。
| 原则 | 核心思想 | 我的经验 |
|---|---|---|
| 先测量,后优化 | 不要凭感觉猜瓶颈,用工具量化数据 | 我曾经凭经验觉得是渲染慢,结果一测发现是内存分配耗时占了60% |
| 二八定律 | 80%的性能问题集中在20%的代码上 | 找到那20%的热点代码,优化收益最大 |
| 不做过度优化 | 性能达标即可,不要为了省1%的CPU去改架构 | 有个同事为了省几个字节,把代码改成位操作,结果维护成本翻倍 |
我的调优工作流:
- 用TouchGFX Profiler跑一遍,拿到帧率曲线和CPU占用
- 定位最耗时的模块(渲染?内存?逻辑?)
- 针对瓶颈做一次改动,重新测量
- 重复步骤2-3,直到性能达标
记住:一次只改一个变量。我见过有人同时改了纹理格式、图层数量和刷新策略,结果性能变好了但不知道是哪个改动起了作用。
避坑指南:我曾经在一个项目里,为了追求极致帧率,把所有的Widget都改成了直接绘制。结果代码量暴增,后期加一个新功能要改三天。后来我学乖了——先保证架构清晰,再在热点路径上做局部优化。你想想看,一个维护成本高到没人敢改的代码,性能再好又有什么用?