帧缓冲区
帧缓冲是存储器的一部分,图形引擎通过更新帧缓冲,将需要显示的下一帧图像包含进来。
帧缓冲是RAM的一个连续部分,可以根据需要设定合适的大小。
帧缓冲具有相应的宽度和高度。 因此,我们通常将帧缓冲视为存储器的一个二维部分,可通过x、y坐标检索。
帧缓冲具有相应的色彩格式。 帧缓冲中的每个条目都是该色彩格式下的色彩。 我们将帧缓冲中的每一个这样的条目称为像素。
通过计算帧缓冲中像素的存储地址和更新存储的色彩,可以更新帧缓冲中位置 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色彩
每个像素使用的位数越多,帧缓冲能够呈现的颜色就越清晰,此外,每个像素使用的位数越多,帧缓冲消耗的存储空间就越多。
显示屏
帧缓冲的内容最终会被传输到并显示在物理显示屏上。 因此,帧缓冲与显示屏的像素宽度和高度相同是十分常见的。
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) | 计算 | 消耗的存储空间(字节) |
---|---|---|---|
800x480 | 16 bpp | 800 * 480 * 16 / 8 | 768000 B |
480x272 | 24 bpp | 480 * 272 * 24 / 8 | 391680 B |
100x100 | 8 bpp | 100 * 100 * 8 / 8 | 10000 B |
当具有一个以上的帧缓冲时,消耗的存储空间相应地较大。 例如,当使用双重缓冲方案时,使用两个帧缓冲会消耗两倍的存储空间。
当帧缓冲不足一个时,由应用明确地分配和控制存储空间的量。 因此,存储空间的消耗量是完全可定制的,但应注意的是,使用量过少会影响整体图形性能。