很多时候,您会在要从中删除的临时文件中看到 Windows 或者为了获得空间使用所谓的 DirectX 着色器缓存或 Shader Cache。 如果您曾经想知道它是什么以及为什么删除它时游戏的性能会直线下降,那么您只需阅读本文即可。
GPU 与 CPU 一样是处理器,但它们的不同之处在于它们的并行性是面向线程的。 这就是为什么说图形处理器属于 TLP 类型而中央处理器属于 ILP 类型的原因。 为此,我们必须补充一点,虽然图中的执行线程不是面向进程,而是面向图形基元或数据。
换句话说,每个三角形、像素或片段对于 3D 管道的每个阶段都有自己的着色器程序。 它是用高级语言编写的,例如 HLSL 如果我们谈论 DirectX 或 GLSL 如果我们谈论 OpenGL 或 Vulkan。 虽然也有一些是某些系统独有的,比如 SONY 的 PSGL 的PlayStation 控制台。 好吧,这些程序需要编译,因此需要从源代码传递到二进制文件。
什么是着色器缓存?
问题来了,与 CPU 都是 x86 的情况相反,在 GPU 的情况下,寄存器和指令集不常见,在品牌之间不常见,但在同一品牌的架构之间也不常见。 这意味着我们必须在玩游戏时编译着色器的代码,从而导致卡顿和性能问题。 因此,生成的二进制文件存储在一个文件中,当再次加载游戏时,该文件将重新加载到显卡的显存中,我们称之为着色器缓存或着色器缓存。
因此,如果我们更新我们的显卡,如果我们从硬盘驱动器或 SSD 也是。 而且,这也是我们第一次玩游戏时,不好判断显卡的原因之一。 特别是如果我们想衡量他们的常规表现。
VRAM 也占用空间
- GPU 你的显卡只能访问系统 内存 通过 PCI Express 接口并使用其 DMA 单元,因此着色器缓存将与组成场景所需的视觉信息一起从存储单元加载到 RAM 以及从 RAM 到视频内存。 尽管使用 DirectStorage,预计图形硬件将能够直接访问 SSD,从而减少访问延迟和必须依赖于 中央处理器.
许多游戏开发得很好,着色器缓存占用的空间很小,但其他游戏则不然,最终会占用大量图形内存。 什么意思,如果驱动有关联的限制或者游戏本身,我们突然发现新的编译替换了旧的编译,最初的性能问题又回来了。
无论如何,我们必须记住,如果我们正在玩的游戏需要显存中的空间,它将优先渲染当前帧。 因此它会寻求检索临时存储在系统内存中的着色器缓存。 还要记住,存储单元的转储是连续进行的,因为一旦生成了图形基元的着色器,就没有必要再做一次了。
光线追踪和着色器缓存
在光线追踪中,GPU 最常被问到的问题是布尔类型。 这条射线是否与这个图元相交? 答案并不总是肯定的,因此,根据情况会发生或不发生情况。 因此,当第一次执行这个着色器时,有必要为所有可能的结果编译和生成缓存着色器。
控制台上的着色器缓存
视频游戏机将始终具有相同的组件,从出厂的第一个模型到最后一个模型。 虽然几年过去了,但它的规格不会改变。 例如,今天您可以找到比最旧的显卡更旧的型号。 利用其硬件不变性的一种方法是利用已编译到游戏安装中的所谓着色器。 这使得没有必要为每个游戏生成着色器缓存,但这也是一把双刃剑。
例如,如果您想制作更强大且向后兼容的控制台,您有以下选项:
- 将 ISA 导出到新系统的 GPU,使其成为旧系统的超集。 这就是 AMD 在具有 RDNA 5 架构的 PlayStation 2 和 Xbox 系列中所做的,以顺利运行为 GCN 设计的上一代游戏。
- 将旧系统的所有图形电路集成到新系统中。 这是任天堂在其 3DS 和索尼的第二台 PlayStation 和第三台的某些型号上所做的事情。
在模拟器级别,在很多情况下所做的是获取已编译的着色器并执行相反的过程,生成一个中间代码,该代码可以生成一个与您的显卡一起使用的着色器缓存。 但是,这不是一门精确的科学,您在运行游戏时可能会遇到某些图形故障。
针对 GPU 制造商的优化
以上皆是 NVIDIA公司 和 AMD 通常包括对最新驱动程序的优化,以实现最先进的边缘 游戏。 这些不仅包括更高性能的最佳设置,还包括已经为每个游戏优化的着色器缓存以及比基础游戏更好的规格。 正是这两家制造商都对他们最先进的显卡在当今最强大的游戏中具有最大可能的性能感兴趣。
所以这些把钱留给了不同的开发工作室,他们为某些图形架构优化着色器程序,并生成一个比基础游戏附带的更好的着色器缓存。 这样做是为了鼓励购买新车型并创建一个过时的程序,这是维持该行业的消费流所必需的。 这就是为什么许多对前几期几乎没有任何视觉变化的游戏最终表现更差。