1. 性能调优总览:为什么 TouchGFX 会卡顿?

大家好,我是你们的老朋友。做嵌入式 UI 这么多年,我见过太多项目在最后关头被卡顿问题拖垮。明明功能都写好了,一跑动画就掉帧,客户那边脸色比屏幕还难看。说实话,TouchGFX 本身是个好框架,但用好它和用对它,中间差着十万八千里。

这一章,我们先从全局视角看看——卡顿到底从哪来? 我个人习惯,遇到问题先别急着动手改代码,先把瓶颈类型摸清楚。你想想看,连敌人是谁都不知道,你怎么打?

1.1 卡顿的本质:帧率没守住

TouchGFX 的动画流畅度,核心指标就是 帧率(FPS)。理想情况下,60 FPS 意味着每帧只有 16.67 ms 的处理时间。一旦某帧超时,下一帧就得等,人眼就感觉到了「卡」。

关键公式:

帧预算 = 1000 ms / 目标帧率

60 FPS → 16.67 ms/帧
30 FPS → 33.33 ms/帧

你的所有渲染、逻辑、内存操作,都得挤在这个时间窗口里完成。

我在项目中遇到过,有人把帧预算全花在软件渲染上,结果 CPU 跑满,GPU 闲着。嗯,这就是典型的资源错配。

1.2 性能瓶颈的四大类型

根据我的经验,TouchGFX 的性能瓶颈可以归为四类。我习惯把它们画成一张图,方便团队一眼看懂。

TouchGFX 性能瓶颈四象限 TouchGFX 性能瓶颈四象限 CPU 瓶颈 逻辑计算、事件处理 软件渲染、帧缓冲区操作 触摸响应、业务逻辑 典型:CPU 占用 > 80% GPU 瓶颈 像素填充率不足 混合模式过多 纹理过大、片段着色器重 典型:GPU 渲染时间 > 10ms 内存瓶颈 帧缓冲区分配失败 动态内存碎片化 缓存未命中、页面交换 典型:malloc 返回 NULL 带宽瓶颈 DMA 传输阻塞 显示接口速率不足 外部存储器访问延迟 典型:LTDC FIFO 欠载 瓶颈可能叠加出现

这张图我每次做项目评审都会贴出来。你看,四个象限之间还有连线——瓶颈往往不是孤立的。比如 CPU 太忙,可能导致 DMA 请求排队,进而引发带宽瓶颈。我曾经在一个项目里追了三天,最后发现是内存碎片导致帧缓冲区分配变慢,间接拖垮了 GPU 渲染。

1.3 各瓶颈的典型症状

光知道分类还不够,你得能快速识别。我整理了一个对照表,平时调试时直接对着看:

瓶颈类型 典型症状 常用检测手段 我踩过的坑
CPU 瓶颈 CPU 占用 > 70%,帧率波动大 HAL_GetTick() 打点、RTOS 任务统计 曾经在回调里做了大量字符串拼接,一帧花了 40ms
GPU 瓶颈 渲染时间 > 10ms,混合模式越多越卡 TouchGFX 内置帧率监视器、DMA2D 计数器 用了 5 层半透明叠加,GPU 直接罢工
内存瓶颈 malloc 失败、屏幕闪烁、随机崩溃 内存池统计、MPU 保护检查 动态分配太多小对象,堆碎片化到无法分配一帧
带宽瓶颈 屏幕撕裂、LTDC 报 FIFO 错误 逻辑分析仪抓 SDRAM 时序、DMA 传输时间测量 SDRAM 时钟配低了,带宽只有理论值的一半

我的小技巧: 调试时先看 CPU 占用。如果 CPU 空闲但帧率低,大概率是 GPU 或带宽问题。如果 CPU 跑满,先优化逻辑,别急着动渲染。

1.4 调优的整体方法论

做性能调优,最忌讳「头痛医头,脚痛医脚」。我总结了一套工作流,每次按这个步骤走,基本不会跑偏:

  1. 建立基线 —— 先跑一遍基准测试,记录当前帧率、CPU 占用、渲染时间、内存使用。没有基线,你都不知道优化有没有效果。
  2. 定位瓶颈 —— 用工具(TouchGFX Designer 的帧率监视器、STM32CubeMonitor、逻辑分析仪)找到最慢的环节。我习惯先看渲染时间,再看 CPU 时间。
  3. 分析根因 —— 瓶颈是表象,根因才是关键。比如渲染时间长,是因为纹理太大?还是混合模式太多?还是 DMA 配置不对?
  4. 制定方案 —— 针对根因,选择优化手段。优先级:算法优化 > 内存优化 > 硬件加速。别一上来就开 DMA2D,先看看能不能少画几层。
  5. 实施并验证 —— 每次只改一个变量,改完重新跑基线。我曾经一次性改了三个地方,结果帧率没变,根本不知道哪个有效。
  6. 回归测试 —— 确保优化没有引入新问题。比如减少了纹理大小,但图片模糊了,用户不买账。

调优黄金法则:

不要优化你不知道的东西。
不要优化你测量不了的东西。
不要优化你不需要的东西。

1.5 工作流中的避坑指南

做这行久了,有些坑我闭着眼都能绕过去。分享几个最常见的:

  • 别信直觉,信数据。 我曾经觉得某个图片是瓶颈,优化了半天,结果发现是定时器中断太频繁。嗯,白忙活一场。
  • 优化要渐进。 一次改太多,出了问题你都不知道是哪个改动导致的。我习惯每次只改一个参数,跑一次测试,记录一次。
  • 别忘了硬件限制。 有些瓶颈是硬件天花板,比如 SDRAM 带宽上限。这时候软件优化只能改善,不能根治。该换芯片就换芯片,别死磕。
  • 帧率不是唯一指标。 有时候 30 FPS 比 60 FPS 更流畅,因为帧时间更稳定。我见过 60 FPS 但每帧时间波动 10ms 的项目,用户照样说卡。

警告: 不要在 Release 版本里做性能调试。优化开关、日志打印、调试断言都会影响性能。所有测量必须在 Release 配置下进行,否则你优化的都是「调试模式下的假象」。

1.6 本章小结

好了,这一章我们聊了卡顿的本质、四大瓶颈类型、以及一套可落地的工作流。说白了,性能调优就是 测量 → 分析 → 优化 → 验证 的循环。没有捷径,但有方法。