GPU 如何知道屏幕上每个像素的地址?如果知道,它如何处理高分辨率图像?

GPU 如何知道屏幕上每个像素的地址?如果知道,它如何处理高分辨率图像?

我知道位图的工作原理以及像素的使用方式(二进制 0 或 1)。我也知道 RGB,但我想知道的是 GPU 如何知道高分辨率屏幕上每个像素的地址以及 GPU 如何将信息发送到像素。有人能回答这个问题吗?

答案1

GPU 有一块专用于视频输出的内存。每个像素都有精确的地址。GPU 渲染图像并将其放入此视频缓冲区。然后,专用硬件块“扫描”此内存并将内容流式传输到视频端口(VGA、HDMI、DVI 等)。显示器接收并显示此信息。但这些信息不是可以在某些 wiki 上免费获取的吗?

答案2

这很简单,只需按照刷新率将整个内存缓冲区复制到输出连接器即可。也就是说,在标准的 DVI 连接显示器上,它将每秒发送 60 次 1920x1080 像素的全帧,每像素 24 位(8 位 RGB 深度)。这是大量的数据,需要高质量的短电缆。

从内部来看,它可能变得更加复杂。通常,视频 RAM 会保存 2 或 3 个图像数据缓冲区(双缓冲或三缓冲,以减少撕裂,这实质上意味着发送到输出连接器的缓冲区不会被 OS 驱动程序修改)。

而且它可能会变得更加复杂:输出连接器可能是模拟的,这意味着将有一个 DAC 将每个信号转换为模拟信号。或者,RAM 可能使用比显示器更高的位深度(每色 10 位 = 每像素 30 位),当输出设备的位深度较低时,显卡可能会使用时间抖动(因此 2 位的误差会分布到下一帧,这可能会导致可见的轻微噪音,但可以提供更好的色彩阴影)。

甚至更加复杂:一些 GPU 并不按照其在显示器上的显示方式排列内存(从左上角到右下角的像素线),而是将其内存排列成单元(图像数据的矩形)——这必须进行转换,但可以提高 VRAM 访问的性能,因为 GPU、CPU 和信号处理器的并发访问可以更好地相互分配。

因此,从根本上讲,这非常简单:数据只是逐个像素地从 RAM 缓冲区复制到输出连接器,大多数时候,每次发送完整帧时都会在两次复制之间更改图像缓冲区。显示器遵循相同的计时模式并绘制像素。每一帧,计时器都会重新同步,因此显示器会从左上角重新开始。

相关内容