中EN
概念页

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 部分。

  1. realtime_rendering_4ed.pdf 第 23 章 Graphics Hardware
  2. Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
  3. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 11 章 11.3.1.1、11.3.4、11.4.4 节

相关页面

图形学合并阶段与帧缓冲Merging & Framebuffer合并阶段把像素着色算出的片元颜色和缓冲区里已有的颜色结合起来,同时负责深度测试、模板测试和混合。它通常不可编程但高度可配置,也叫 ROP(光栅操作或渲染输出单元)。帧缓冲是系统中所有缓冲区的总称。图形学像素与帧缓冲优化Pixel & Framebuffer Optimization需要着色的像素通常远多于顶点,所以像素处理优化往往最划算。核心手段:保证占用率以隐藏纹理延迟、按距离切换着色器 LOD、利用 early-z 并通过从前往后排序或 z-prepass 减少过度绘制、缩小帧缓冲每像素存储(色度子采样、YCoCg 棋盘),以及只在需要时开启混合、避免 GPU 回读。几何与光栅化阶段的常用优化也一并列出。图形学硬件深度剔除与纹理单元Hardware Depth Culling & Texture UnitsGPU 的深度管线先在瓦片级用 HiZ 单元做 zmax/zmin 粗剔除,再逐采样做 early-z 深度测试以免执行被遮挡片元的像素着色器,必要时退回到着色后的 late depth test;深度缓冲同样有瓦片压缩与快速清除。纹理单元以固定功能硬件完成寻址、过滤、钳位与解压(比软件快可达 40 倍),按 quad 有限差分求导数以选择 LOD,并依靠瓦片化/Morton 交织存储和纹理缓存提高局部性。图形学GPU 架构案例GPU Architecture Case StudiesRTR4 第 23.10 节剖析三种架构:面向移动设备、以能效为先的 sort-middle 分块架构 ARM Mali G71 Bifrost;NVIDIA Pascal(GTX 1080)的 SM/TPC/GPC 层级与介于 sort-middle 和 sort-last fragment 之间的 tiled caching;AMD GCN Vega 的计算单元、异步计算引擎、DSBR 与 HBCC。硬件厂商通过对尚未制造的 GPU 做大量参数化仿真来决定 MP 数量、缓存、光栅引擎、ROP 数等——各种单元数量的原因归根结底是"这样效果最好"。图形学显示编码与 sRGBDisplay Encoding & sRGB光照、纹理等计算假设数值是线性的,但显示缓冲和纹理使用非线性编码。简短的回答是:着色器输出 [0,1] 的颜色要取 1/2.2 次幂(gamma 校正),读入的纹理和颜色做相反的变换,多数情况下可以让 GPU 自动完成。忽略它会导致画面偏暗、色相偏移、光照叠加错误和抗锯齿边缘"绳索化"。图形学VR 与 AR 显示基础VR & AR Display Fundamentals虚拟现实 (VR) 完全替换用户所见的世界,增强现实 (AR) 把合成物体融入真实世界,二者常合称 XR。本页介绍与渲染相关的硬件与物理要素:追踪与显示设备、"动作到光子"延迟及其导致的模拟器晕动症、姿态预测、镜头光学畸变与色差的软件补偿、滚动与全局显示,以及立体视觉中的辐辏-调节冲突与瞳距。这些约束决定了 VR 渲染为何必须高帧率、低延迟并严格依赖厂商 SDK。图形学渲染瓶颈定位与性能度量Bottleneck Location & Performance Measurement渲染管线中最慢的阶段(瓶颈)决定整体吞吐量。优化就是"找到瓶颈 → 优化到瓶颈转移 → 重复",并让非瓶颈阶段做到与瓶颈同样多的工作以换取画质。定位靠逐阶段增减负载的实验和性能工具;度量要用毫秒帧时间而不是 FPS。两条箴言:了解你的架构 (KNOW YOUR ARCHITECTURE);测量、测量、再测量。综合帧时间预算与渲染性能Frame Budget & Rendering Performance本页把 wiki 中分散在 RTR4 第 18~23 章的性能知识串成一条线:一帧的时间预算由最慢的管线阶段决定,先用毫秒帧时间度量并定位瓶颈,再按瓶颈所在位置——CPU/驱动、几何、像素、带宽/内存——选用对应手段;最后从 GPU 硬件机制(占用率、HiZ/early-z、压缩、分块架构)理解这些手段为何有效。各结论的细节与出处见所链接的概念页。游戏开发双缓冲Double Buffer双缓冲 (Double Buffer) 让一系列按顺序执行的修改,在外界看来像是瞬间、同时完成的:类内部保留“当前缓冲”和“下一缓冲”两份状态,读取总是读当前缓冲,写入总是写下一缓冲,改完后用一次原子交换让新状态整体生效。图形里的前后缓冲是最经典的例子;同样的思路也能让一帧内依次更新的游戏对象互相看到的都是上一帧的一致状态。游戏开发计算机硬件与内存层次Computer Hardware & Memory Hierarchy从冯·诺依曼结构讲起,依次是 CPU 的组成(ALU、VPU、寄存器、控制单元、时钟)、总线与字长、机器语言、汇编和寻址方式,再到内存体系:内存映射、虚拟内存和 TLB,以及为了缩小“内存鸿沟”而设计的寄存器文件、多级缓存(缓存行、标签、组相联、替换和写策略、一致性协议)和 NUMA(PS3 的 SPU 本地存储、PS2 的 scratchpad)。对游戏程序员最重要的结论是:数据要连续、紧凑、顺序访问;热循环的代码要小。图形学色调映射Tone Mapping色调映射把场景参考的辐射亮度转换为显示参考的辐射亮度,目标不是恒等复现、也不是把所有信息"挤进"显示范围,而是在显示条件下尽量复现观看原场景时的感知印象。它通常是曝光缩放加一条 S 形曲线(全局映射),之后可做调色;最后由显示编码输出到 SDR 或 HDR 显示器。图形学图形栈与渲染引擎架构Graphics Stack & Rendering Engine Architecture渲染引擎要解决的"渲染问题"是:给定由场景元素、虚拟光源和虚拟相机组成的虚拟世界,生成相机看到的二维彩色图像。GEA 把它拆成可见性问题和光照问题,按解法把引擎分为光线追踪、深度缓冲光栅化、辐射度和混合四类;光栅化引擎通常采用立即模式的两层结构:下层是图形管线,上层是负责剔除、提交几何和设置着色器参数的应用层。本页讲这套整体架构,管线内部见 渲染管线。综合角色渲染Character Rendering角色是游戏中最受关注、技术最集中的资产。本页按"动起来 → 表面细节 → 材质着色 → 特殊材质(皮肤、毛发、布料)→ 光照与阴影 → 性能"的顺序,把 wiki 中相关概念页串成一套角色渲染方案的地图。每一层只给出要点与取舍,细节见链接页。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原