一个 TouchGFX 图片压缩导致显示丢失的问题
关键字:TouchGFX,图片压缩
1. 引言
在使用 TouchGFX 生成代码时,像图片、文本和字体这样的资源会被转换成 C++文件,然后与
TouchGFX 应用程序代码、用户代码和 TouchGFX 库一起编译后存储在 Flash 中。 这意味着具有许
多资源的大型或复杂项目会需要使用更多的 Flash 存储空间。
由于大多数应用中的存储器资源都是有限的,因此有几种方法可以减少应用对 Flash 存储器容量
的需求。TouchGFX 提供四项内置功能,可以帮助显著减少应用程序的 Flash 存储器需求。 这四项功
能分别是 L8 图片格式、图片压缩、可缩放矢量图形(SVG)和矢量字体。
本文只涉及图片压缩并会先介绍 TouchGFX 支持的图片压缩功能,然后结合客户使用 TouchGFX
图形压缩功能出现图片显示丢失的问题进行分析。
2. TouchGFX 的图片压缩功能
2.1. TouchGFX 图片压缩功能简介
TouchGFX 从 4.22 版开始支持图片压缩。4.22 to 4.23 只支持 L8 格式的图片压缩。从
4.24 版本开始,支持 RGB565, RGB888, 以及 ARGB8888 压缩。
图片压缩通常有两种风格:无损或有损。 有损图片压缩通过去除图片的微小细节来实
现。 这样通常会得到最大的缩减图片,但原始图片无法准确再现。 无损压缩总是无任何差
异地再现原始图片,无损压缩的尺寸缩减通常较小。对于图形,通常要求 UI 元素完全按照
其设计来绘制。 因此,TouchGFX 只支持无损压缩。
图片压缩的优点是存储空间需求减少,但也有缺点,因为图片在绘制到帧缓存时必须解
压缩。 与绘制未压缩的图片相比,这种解压缩在许多情况下需要 CPU 做更多的工作。 结果
可能是性能下降。这意味着必须将 Flash 减少带来的优势与 CPU 使用率增加带来的劣势进
行权衡。STM32 中的图形加速器 DMA2D 和 GPU2D(ChromART and NeoChrom
GPU)不能直接绘制压缩图片。压缩图片使用软件和硬件渲染的混合方式进行绘制,即压缩
数据由软件分块解压缩,然后在适用的情况下将这些分块委托给 DMA2D 处理。许多应用
中,不建议压缩所有图片,而是只压缩那些性能不受影响且与减少 Flash 相关的图片。