4. 开发环境与工具链搭建

图像资源是 TouchGFX 项目里最吃内存的环节,没有之一。我见过太多项目,UI 逻辑写得挺漂亮,一跑起来帧率掉到 20fps,查到最后全是图片惹的祸。今天咱们就把这块彻底捋清楚。

核心原则:在保证视觉效果的前提下,让每张图片占用的内存和带宽都降到最低。说白了,就是「够用就好,别浪费」。

4.1 RGB565 vs ARGB8888:选对格式省一半内存

TouchGFX 支持两种主流颜色格式:RGB565 和 ARGB8888。它们的区别,我直接给你列个表:

特性 RGB565 ARGB8888
每像素位数 16 位(2 字节) 32 位(4 字节)
颜色深度 65,536 色 16,777,216 色 + 256 级透明度
透明度支持 不支持(或 1 位透明) 完整 Alpha 通道
内存占用 低(基准) 高(2 倍于 RGB565)
适用场景 图标、按钮、纯色背景 照片、渐变、半透明叠加层

你想想看,一张 480x272 的全屏图片:

  • RGB565:480 × 272 × 2 = 261,120 字节 ≈ 255 KB
  • ARGB8888:480 × 272 × 4 = 522,240 字节 ≈ 510 KB

差了一倍。如果你的 MCU 只有 1MB 内部 RAM,光一张全屏 ARGB8888 就吃掉一半。所以我的习惯是:能用 RGB565 的,绝不用 ARGB8888。

我的经验:在项目中,我会把图片分成两类:需要透明效果的(比如异形按钮、弹出层遮罩)用 ARGB8888,其余全部用 RGB565。曾经有个客户非要把所有图标都做成 ARGB8888,我给他算了一笔账:32 个图标,每个 64x64,ARGB8888 要 512KB,换成 RGB565 只要 256KB。他看完就改了。

4.2 图片压缩策略:别让 Flash 成为瓶颈

内存问题解决了,Flash 空间呢?TouchGFX 支持两种内置压缩:L4 和 RLE。我分别说说。

4.2.1 L4 压缩(适合照片、渐变图)

L4 是 4 位索引色压缩,能把每像素从 16 位降到 4 位,压缩比 4:1。说白了,就是给每个 4x4 像素块选 16 种代表色。效果怎么样?

  • 照片类图片:几乎看不出区别,压缩率 60%-75%
  • 纯色大块:压缩率更高,可能到 80%
  • 精细文字或线条:会有轻微锯齿,慎用

4.2.2 RLE 压缩(适合图标、按钮)

RLE(游程编码)对连续相同颜色的区域特别有效。比如一个蓝色按钮,中间全是纯色,RLE 能压缩到原来的 10% 以下。但如果是噪点多的照片,RLE 反而可能变大。

避坑指南:我曾经在一个项目里对所有图片统一用了 L4 压缩,结果发现一个仪表盘刻度图片出现了明显的色块。后来改成 RLE 就好了。所以我的建议是:每张图单独测试,不要一刀切。

4.3 L8 索引色模式:小内存设备的救星

L8 模式是 TouchGFX 4.18 之后加入的,我觉得这是最实用的功能之一。它用 8 位(256 色)调色板来代表整张图片,每像素只占 1 字节,比 RGB565 还省一半。

什么时候用 L8?

  • 图标集:一套 50 个图标,颜色不超过 256 色
  • 字体纹理:中文字库的位图部分
  • 风格统一的界面:比如只用品牌色系的界面

怎么用?在 TouchGFX Designer 里,选中图片资源,在属性面板把 Format 改成 L8,然后系统会自动生成调色板。你也可以手动编辑调色板,把不用的颜色删掉,进一步压缩。

关键数据:一张 128x128 的图标,RGB565 要 32KB,L8 只要 16KB,而且肉眼几乎看不出区别。如果你的 MCU 只有 512KB Flash,L8 能帮你多放 30-50 张图。

4.4 知识体系总览

下面这张图把图片优化的决策流程串起来了,你可以照着这个思路走:

图片资源优化决策流程 原始图片资源 是否需要透明度? ARGB8888 RGB565 颜色数 < 256? L8 索引色模式 保留 RGB565 选择压缩策略:L4 / RLE / 不压缩 ARGB8888 不压缩

4.5 实战建议:三步走策略

  1. 第一步:分类——把所有图片按「是否需要透明度」「颜色数是否小于 256」「是照片还是图标」分成三类。
  2. 第二步:选格式——透明度图片用 ARGB8888,颜色数少的用 L8,其余用 RGB565。
  3. 第三步:压空间——照片类用 L4,图标按钮用 RLE,每张图在 TouchGFX Designer 里预览效果,确认没问题再定稿。

我的习惯:在项目初期,我会先拿 3-5 张代表性图片做格式和压缩测试,算出内存和 Flash 的预算。这样后期就不会出现「图片放不下」的尴尬。记住,优化不是一次性的,而是贯穿整个开发周期的。