2. TouchGFX 基础认知

做TouchGFX优化,第一步不是动手改代码,而是先搞清楚——你的系统到底卡在哪?

我见过不少团队,一上来就怼着帧率调,改了一堆代码,结果发现瓶颈压根不在那。说白了,性能优化就像看病,得先诊断,再开药。这一章,我们就来聊聊TouchGFX动画性能的四大瓶颈:CPU负载、内存带宽、DMA传输、GPU渲染管线。

核心观点: 性能瓶颈不是单一的。很多时候,是多个因素交织在一起。你得学会用工具和数据说话,而不是靠感觉。

2.1 CPU负载:别让主核干脏活

CPU负载,是大家最先想到的瓶颈。但问题在于,很多人分不清“CPU忙”和“CPU有效忙”。

我习惯把CPU在TouchGFX里的工作分成两类:

  • 应用逻辑: 处理触摸事件、状态机切换、数据更新。这部分是必须的,没法省。
  • 像素搬运: 把显存里的数据刷到屏幕,或者做软件混合(Alpha Blending)。这部分,能省则省。

你想想看,如果你的MCU主频只有200MHz,还要用CPU去逐像素搬运一个800x480的图层,那帧率能高才怪。我在一个项目里就踩过这个坑——当时用STM32F429,纯CPU刷屏,帧率只有15fps。后来一查,CPU 70%的时间都在干DMA该干的活。

我的经验: 用STM32CubeMonitor或者SystemView抓一下CPU占用率。如果发现CPU在刷屏期间占用率超过60%,而且大部分时间在跑memcpy或者像素混合函数,那基本可以断定——CPU在干脏活。

2.2 内存带宽:被忽视的隐形杀手

内存带宽,这个词听起来有点抽象。我换个说法——你的内存总线,到底能跑多快?

TouchGFX的帧缓冲(Framebuffer)通常放在外部SDRAM里。SDRAM的带宽是有限的。假设你的屏幕分辨率是480x272,颜色深度16位,刷新率60fps,那光是把帧缓冲从SDRAM搬到LCD控制器,就需要:

带宽需求 = 480 × 272 × 2字节 × 60fps = 15.7 MB/s

这还只是单层。如果你用了双缓冲,或者多层混合,带宽需求直接翻倍。我遇到过一个问题:SDRAM的时钟配错了,实际带宽只有理论值的一半,结果动画一复杂就撕裂。

场景 分辨率 色深 帧率 带宽需求
单层显示 480x272 16位 60fps 15.7 MB/s
双缓冲 480x272 16位 60fps 31.4 MB/s
多层混合(2层) 800x480 32位 30fps 92.2 MB/s

注意: SDRAM的实际可用带宽还要减去刷新开销、CPU访问、DMA访问。别只看理论值。我曾经在一个项目里,SDRAM带宽被LTDC和DMA争抢,导致CPU读帧缓冲时频繁等待,动画直接掉到20fps。

2.3 DMA传输:解放CPU的关键

DMA(Direct Memory Access)是TouchGFX性能优化的利器。它的核心作用就是——让CPU歇着,让数据自己跑。

TouchGFX里,DMA主要用于:

  • 帧缓冲拷贝: 从后台缓冲拷贝到前台缓冲。
  • 图像数据搬运: 从Flash或SDRAM搬运到帧缓冲。
  • 硬件加速混合: 利用DMA2D(Chrom-ART Accelerator)做像素混合。

但DMA不是万能的。我见过有人把DMA配置成每次传输一个像素,结果中断开销比CPU直接拷贝还大。DMA适合大块数据传输,小块数据反而效率低。

我的建议: 在TouchGFX的HAL层,把DMA传输的最小粒度设为至少64字节。小于这个尺寸的,直接用CPU拷贝。我在一个项目里这么调过,整体帧率提升了12%。

2.4 GPU渲染管线:硬件加速的真相

很多MCU里集成了2D GPU,比如STM32的DMA2D、NXP的PXP、瑞萨的2D引擎。这些硬件加速器,说白了就是一条简化的渲染管线。

典型的GPU渲染管线包括:

  1. 顶点/坐标处理: 确定图像的位置和大小。
  2. 纹理读取: 从内存中取出像素数据。
  3. 像素混合: 做Alpha混合、颜色格式转换。
  4. 写入帧缓冲: 把结果写回显存。

但这里有个坑——GPU的管线是顺序执行的。如果某个环节慢了,整个管线就卡住。我在一个项目里发现,DMA2D在做32位到16位颜色转换时,性能只有理论值的60%。后来查手册才知道,那个型号的DMA2D对32位输入有额外的时钟周期开销。

关键点: GPU加速不是免费的。它需要配置、需要等待、需要处理中断。如果你的动画很简单(比如只有一个静态背景),用GPU反而可能比CPU慢。别迷信硬件加速,得看场景。

2.5 一张图看懂性能瓶颈

下面这张图,是我自己总结的TouchGFX性能瓶颈分析框架。你可以用它来快速定位问题。

TouchGFX性能瓶颈分析框架 TouchGFX性能瓶颈分析框架 性能瓶颈 CPU负载 内存带宽 DMA传输 GPU渲染管线 应用逻辑 像素搬运 SDRAM带宽 总线争抢 大块传输 中断开销 管线阻塞 配置开销 诊断建议 1. 用性能分析工具抓CPU占用率,区分应用逻辑和像素搬运。 2. 计算实际带宽需求,对比SDRAM规格,检查总线配置。

2.6 实战:如何快速定位瓶颈

说了这么多理论,来点实际的。我一般按这个步骤来定位瓶颈:

  1. 第一步:看帧率。 如果帧率低于目标值,先别急着优化。用TouchGFX自带的Performance Monitor,看看每一帧的渲染时间分布。
  2. 第二步:看CPU占用。 如果CPU在渲染期间占用率超过50%,大概率是CPU在干脏活。检查是不是用了软件混合。
  3. 第三步:看DMA。 如果CPU占用不高但帧率还是低,检查DMA传输是否阻塞。用逻辑分析仪抓一下DMA完成中断的间隔。
  4. 第四步:看内存带宽。 如果以上都正常,那可能是SDRAM带宽不够。试着降低分辨率或色深,看看帧率是否提升。

避坑指南: 我曾经在一个项目里,花了三天时间优化CPU代码,结果发现是SDRAM的时钟相位配错了,导致读写效率只有30%。所以,先检查硬件配置,再动软件。别像我一样走弯路。

好了,这一章的内容就到这里。记住,性能瓶颈分析不是一次性的工作。随着你添加新功能、更换硬件,瓶颈可能会转移。保持诊断的习惯,比任何优化技巧都重要。