跳转到主要内容

帧缓冲区

帧缓冲是存储器的一部分,图形引擎通过更新帧缓冲,将需要显示的下一帧图像包含进来。

帧缓冲是RAM的一个连续部分,可以根据需要设定合适的大小。

帧缓存空间

帧缓冲具有相应的宽度和高度。 因此,我们通常将帧缓冲视为存储器的一个二维部分,可通过x、y坐标检索。

2D帧缓存空间

帧缓冲具有相应的色彩格式。 帧缓冲中的每个条目都是该色彩格式下的色彩。 我们将帧缓冲中的每一个这样的条目称为像素。

通过计算帧缓冲中像素的存储地址和更新存储的色彩,可以更新帧缓冲中位置 x,y 处的像素色彩。

uint32_t pixelAddress = x + y * WIDTH;
framebuffer[ pixelAddress ] = newColor;

同样地,我们可以获取帧缓冲中像素的色彩并用在计算中。 例如,暗化帧缓冲中像素的色彩(假设有暗化函数可用)。

uint32_t pixelAddress = x + y * WIDTH;
framebuffer[ pixelAddress ] = darken( framebuffer[ pixelAddress ] );

对于帧缓冲存储器,通常不会如前文所述逐一读写像素,而是利用系统的底层硬件功能(如Chrom-ART DMA)进行读写。

色彩

在TouchGFX中,帧缓冲的像素色彩格式可以是:

  • 灰度1、2或4位每像素(bpp)灰度,或者
  • 高或真彩16、24或32 bpp色彩

每个像素使用的位数越多,帧缓冲能够呈现的颜色就越清晰,此外,每个像素使用的位数越多,帧缓冲消耗的存储空间就越多。

显示屏

帧缓冲的内容最终会被传输到并显示在物理显示屏上。 因此,帧缓冲与显示屏的像素宽度和高度相同是十分常见的。

24 bpp帧缓冲内容和显示屏显示内容

Further reading
参见关于显示屏技术的部分了解不同显示屏类型。

帧缓冲的位置

下面是一个基于微控制器的绘图系统的极简图。

绘图系统极简图

帧缓冲可以位于MCU内部或外部RAM中。

帧缓冲的可能位置

每个可能位置都具有潜在的优势和不足。

内部RAM

如果帧缓冲位于MCU内部的RAM中,对帧缓冲的读和写访问会尽可能快地完成。 这意味着TouchGFX应用的运行会非常流畅。 反过来,内部RAM是十分稀少的资源,被系统的许多部件使用,因此,帧缓冲大量占用内部RAM也许不可行。

如果可行,由于无需额外的RAM,在内部RAM中提供帧缓冲可以降低系统的总体成本。

外部RAM

如果系统有外部RAM,可以选择在外部RAM而不是内部RAM中提供帧缓冲。 对外部RAM的读和写访问通常会比内部RAM慢,但外部RAM的空间量通常大得多。 因此,有时候这是唯一可行的解决方案。

MCU可能具有一些功能(如缓存),可加快外部RAM的访问速度。 参见关于MCU的部分了解详细信息。

自带RAM的显示屏

显示屏上可能嵌入了存储器,具体取决于系统中显示屏的类型。 这段存储空间用来保存显示屏“实际”像素的内容。 显示屏中保存像素的存储空间,意味着在显示屏仍活动时,MCU可能处于空闲状态。

由于显示屏存储器并非存储器映射,既不打算也不适合用于像素的随机读取或写入,因此不可能将TouchGFX帧缓冲放在在显示屏自带的RAM中。 相反,TouchGFX将帧缓冲置于内部或外部RAM中,并在适当的时候将其传输到显示屏RAM。

帧缓冲的数量

TouchGFX可在应用中使用一个、多个或不足一个的帧缓冲。 帧缓冲的数量会影响应用的视觉表现、性能和存储空间消耗。

一个帧缓冲

一个帧缓冲足以完全容纳要传输到显示屏的所有像素。 当板上的显示屏没有自带RAM时,需要(至少)一个帧缓冲。 在这种情况下,如果所显示图形的复杂度不会产生任何视觉失真,则只需一个帧缓冲。

多于一个的帧缓冲

在TouchGFX中,具有多个帧缓冲表示有两个帧缓冲。 一个帧缓冲用于写入下一幅需要显示的图像,另一个帧缓冲用于将图像传输到显示屏。 这意味着不会发生失真(如撕裂)。

少于一个的帧缓冲

少于一个的帧缓冲通常意味着

  • 消耗的存储空间较少
  • 将执行更多绘制操作
  • 需要向显示屏传输更多内容

在TouchGFX中,不足一个的帧缓冲表示部分帧缓冲。 部分帧缓冲方案只适用于具有自带显示RAM的显示屏。

存储空间消耗

帧缓冲中的色彩数量和像素数量决定了帧缓冲消耗的存储空间。

帧缓冲使用的存储空间通常为 ** 以位数计的色深 / 8 字节数。

分辨率(像素)色彩(bpp)计算消耗的存储空间(字节)
800x48016 bpp800 * 480 * 16 / 8768,000 B
480x27224 bpp480 * 272 * 24 / 8391,680 B
100x1008 bpp100 * 100 * 8 / 810,000 B

当具有一个以上的帧缓冲时,消耗的存储空间相应地较大。 例如,当使用双重缓冲方案时,使用两个帧缓冲会消耗两倍的存储空间。

当帧缓冲不足一个时,由应用明确地分配和控制存储空间的量。 因此,存储空间的消耗量是完全可定制的,但应注意的是,使用量过少会影响整体图形性能。

Further reading
  • STM32 LTDC显示屏控制器文档提供了关于帧缓冲的更多信息