GPU 内存、缓冲压缩与多重缓冲
GPU Memory, Buffer Compression & Multiple Buffering
带宽是稀缺资源。GPU 通过独立显存或统一内存架构 (UMA)、多级缓存与按瓦片存储提高局部性,并用基于瓦片表的无损压缩和快速清除减少渲染目标的带宽(注意:无损压缩只省带宽,不省内存)。颜色缓冲有高彩、真彩、深色三种模式;显示控制器以固定刷新率或 FreeSync/G-sync 自适应同步把颜色缓冲送到显示器;单/双/三缓冲在撕裂、等待与延迟之间取舍。
总线与内存架构(23.4 节)
- 端口连接两个设备,总线是多设备共享通道,带宽以 B/s 计。
- 独立 GPU 常有专用显存,比通过总线访问系统内存快得多:16 通道 PCIe v3 双向各 15.75 GB/s、v4 为 31.51 GB/s,而 GTX 1080 的显存达 320 GB/s。
- 纹理和渲染目标放显存;只由模型矩阵和顶点着色器动画的数据(包括用 GPU 顶点混合的角色网格)用静态顶点/索引缓冲放显存;CPU 每帧更新的顶点用动态缓冲放在可经 PCIe 访问的系统内存。PCIe 的请求可流水化。
- UMA:多数游戏主机(所有 Xbox、PS4)的 CPU 与 GPU 共用同一内存和总线;Intel Gen9 也共享内存,但 GPU 自有 L1/L2/L3,末级缓存 (LLC) 才是层次中第一个共享资源。
缓存与压缩(23.5 节)
缓存层次利用访问局部性降低延迟和带宽。缓冲和纹理按瓦片存储:例如缓存行 64 B、颜色 4 B/像素时,可把 4×4 像素瓦片存成 64 B。
瓦片表为每个瓦片记录状态:压缩(可能有多种压缩等级)、未压缩或已清除。可压到的等级取决于最小内存传输粒度:若最小传输 32 B,64 B 瓦片只能压到 50%;128 B 瓦片则可压到 75%、50%、25%。深度、颜色、模板都可用类似结构。
- 快速清除:清除时只把所有瓦片状态设为已清除而不碰帧缓冲;读取时发现已清除就直接在缓存中填入清除值,无需读取和解压。
- 写回:瓦片被逐出缓存时送入压缩器,可尝试多种模式取位数最少者;API 要求无损,全部失败就退回未压缩。因此无损渲染目标压缩永远不能减少内存占用,只减少带宽。
- 缓存前/后压缩:压缩器放在缓存之后(post-cache)或之前(pre-cache);后者能大幅增加有效缓存容量但系统更复杂。
- 算法多为存一个代表整个瓦片的锚值,再以不同方式编码相对差值;深度在屏幕空间是线性的,常用平面方程或差分的差分。有损颜色压缩仍在研究,作者所知尚无硬件支持。
颜色缓冲模式(23.6 节)
| 模式 | 每像素 | 说明 |
|---|---|---|
| 高彩 (high color) | 2 字节,15 或 16 位颜色 | 常 5-6-5 分配,多出一位给绿色(对亮度影响最大);更快但如今几乎不用 |
| 真彩 (true color) | 3 或 4 字节,24 位颜色 | 约 1680 万色;常按 32 位存储(内存系统优化 4 字节访问),多出 8 位可作 alpha;PC 上有时为 BGR 顺序 |
| 深色 (deep color) | 每通道 10/12/16 位 | 加 alpha 后 40/48/64 位;HDMI 1.3 起与 DisplayPort 支持 |
每通道只有 32 或 64 级时相邻色阶容易分辨,称为色带 (banding/posterization),马赫带效应会放大差异;抖动用空间分辨率换有效颜色分辨率,24 位显示器上的渐变也可能有色带,可加噪声掩盖。混合由 ROP 单元完成,每个 ROP 通常连到一个内存分区(如广义棋盘格分配)。
显示控制器与刷新
视频显示控制器 (VDC) 支持 HDMI、DisplayPort、DVI、VGA 等接口,还可做缩放、降噪和多图像源合成。刷新率通常 60~144 Hz,多数人在低于 72 Hz 时察觉闪烁;高刷新率下图像常显示多次或插入黑帧,以减少眼睛运动造成的拖影。HDR 显示器每通道 10 位以上;Dolby 用低分辨率 LED 背光阵列增强 LCD,亮度约 10 倍、对比度约 100 倍。FreeSync/G-sync 让显示器刷新跟随 GPU 出帧(一帧 10 ms、下一帧 30 ms 时,各自渲染完立即开始更新),更流畅;图像不变时无需传送颜色缓冲,还能省电。
单、双、三缓冲
- 单缓冲:绘制过程对观众可见,清除或画大三角形时可看到部分更新,即撕裂。如今很少用,可能的例外是 VR 中"追逐光束"以降低延迟。
- 双缓冲:前缓冲显示完成图像,后缓冲绘制,通常在整幅图像传送完后(vsync)交换指针。不等 vsync 立即交换可最大化帧率(也用于基准测试),会撕裂,但两幅都是完整图像,比单缓冲轻。
- 三缓冲:增加一个待定 (pending) 缓冲,等 vsync 时仍可继续绘制;代价是延迟最多增加一整帧,输入响应变迟钝。更多缓冲可平衡帧时间波动但进一步增加延迟;可看作环形结构,渲染指针领先显示指针,二者不能重合。
多 GPU(SLI/CrossFire X):分屏或交替帧渲染 (AFR)。AFR 听起来会增加延迟,但若 GPU 是瓶颈,单 GPU 10 FPS 时两块可达 20 FPS,每块渲染一帧的时间不变,延迟不一定改变。分辨率不断提高,也可在屏幕或表面上自适应改变像素着色率。
flowchart LR
A["瓦片被逐出缓存"] --> B{"尝试压缩模式"}
B -->|"成功"| C["状态=压缩, 传少量字节"]
B -->|"全部失败"| D["状态=未压缩"]
E["清除命令"] --> F["状态=已清除, 不写内存"]
F --> G["读取时直接填清除值"]如上图,瓦片表同时支撑压缩和快速清除。
GEA 的视角:帧缓冲、显存与交换链(卷 II 11.3.1.1、11.3.4、11.4.4)
显存与扫描输出
- PC 上 GPU 有直接访问的显存 (VRAM),物理上在显卡上,CPU 只能经 PCIe 总线间接访问;向 GPU 提供顶点、索引、矩阵、纹理等数据时,要先由 CPU 写进主内存,再经 PCIe 上传到显存(卷 II 11.3.1.1、11.4.4)。
- 显卡上的专用芯片逐行扫描帧缓冲,把像素数据转成信号送给显示器,到底后回到顶部重来,这个频率就是刷新率。GEA 举的是电视制式:北美和日本的 NTSC 为 60 Hz,欧洲等地的 PAL/SECAM 为 50 Hz。
- 显示硬件要求最终图像是它能理解的格式,通常是 RGB 加可选 alpha(alpha 被显示硬件忽略,但合成时有用)。若引擎输出 HDR 格式,就要自己做色调映射转成 sRGB 编码(见 色调映射、显示编码与 sRGB)。
与 RTR4 的分歧:主机内存架构的叫法
| 来源 | 说法 |
|---|---|
| RTR4(本页「总线与内存架构」) | 多数游戏主机采用 UMA(统一内存架构),CPU 与 GPU 共用同一内存和总线 |
| GEA 卷 II 11.3.1.1 | 主机通常采用 NUMA(非一致内存访问) 架构,显存只是主内存中 CPU 和 GPU 都能看到的一部分 |
两书描述的物理事实相同(CPU 与 GPU 共享同一片内存),但用的术语不同,GEA 的 NUMA 与 RTR4 的 UMA 字面意思相反。这里并列记录。
原书问题(11.3.1.1):这里 RTR4 的用词是对的,GEA 的"NUMA"是误用。NUMA(非一致内存访问)指多处理器系统中访存延迟取决于内存相对处理器的位置(本地节点快、远端节点慢),例如多路服务器(Wikipedia "Non-uniform memory access");CPU 与 GPU 共用同一个物理内存池、彼此可见,正是统一内存架构 (UMA),AMD 为 PS4/Xbox One 一代 APU 宣传的也叫 hUMA(heterogeneous Uniform Memory Access,Wikipedia "Heterogeneous System Architecture")。
双缓冲、三缓冲与可变刷新率
- 撕裂:引擎写帧缓冲的同时显示硬件在读,画面下半部分是旧帧、上半部分是新帧。双缓冲用后缓冲绘制、前缓冲显示,扫描完成且绘制完成时翻转 (flip),前后缓冲合称交换链 (swap chain)。
- 三缓冲:一个前缓冲加两个后缓冲 A、B 组成环;每次翻转时前缓冲变成后缓冲 B,B 变成 A,A 变成前缓冲。GEA 强调的好处是:渲染一帧的时间短于显示刷新间隔时,引擎画完 A 可以立即开始画 B,不必等下一次翻转(卷 II 11.3.4.1)。
- 可变刷新率 (VRR):显卡直接控制显示器刷新率,与游戏出帧同步,既消除撕裂,又让引擎不必等显示器下一次刷新才能翻转。
两书对三缓冲的侧重点不同:RTR4(本页「单、双、三缓冲」)强调它最多增加一整帧延迟、输入响应变迟钝;GEA 只讲它免去等待翻转的吞吐好处,没有讨论延迟。两者不矛盾,选用时应同时考虑。
帧缓冲的颜色格式
颜色格式(RGB888、RGB565、RGBA8888、FP16 等)与 HDR 编码见 显示编码与 sRGB 中的 GEA 部分。
出处
- realtime_rendering_4ed.pdf 第 23 章 Graphics Hardware
- Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 11 章 11.3.1.1、11.3.4、11.4.4 节