卡顿到底从何而来
游戏发行时,着色器以可移植的中间代码——比如 DXIL 字节码——的形式存在,而不是某款 GPU 的机器语言,因为 PC 世界就是一个由三家厂商、十代架构组成的“动物园”。当游戏第一次请求某个特定的管线状态——顶点着色器、像素着色器、几何着色器与混合模式、渲染目标格式的某种具体组合——显卡驱动就会把这一组合编译成你的显卡能理解的本地代码。编译在 CPU 上进行,通常只用一个线程,而需要它的那一帧只能干等;可见的结果,就是玩家口中的“着色器卡顿”:零点几秒的冻结。
主机靠“平台固定”绕开了这个问题:开发者把每个着色器都针对那块 GPU 编译好,成品直接放进光盘。PC 开发者则依赖预编译界面——那条“正在编译着色器,18,207 个中的 4,312 个”的进度条——把最重的活儿提前打包干完;再依靠管线状态对象(PSO)缓存,把每条编译好的管线存进磁盘,让二周目流畅运行。两种机制都没有的游戏,就是那些一卡卡好几个小时的游戏。
救你的缓存,和毁掉它的“清理”
有两层缓存在吸收这份痛苦:游戏自己的 PSO 缓存,以及驱动的着色器缓存——NVIDIA、AMD 和 Intel 各自把编译好的着色器存放在 AppData 下 DXCache、GLCache 之类的文件夹里。那些顺手抹掉这些文件夹的“激进系统清理”,只会悄悄把你已经用耐心付过款的每一次卡顿,原样退回给你。
- 让预编译界面跑完:那条进度条就是开发者在替你“卡顿”——打包提前、在游戏启动之前完成
- 别动驱动的着色器缓存——%LOCALAPPDATA% 下的 NVIDIA DXCache、AMD DxCache 和 Intel 文件夹,就是为了让第二次相遇秒开而存在的;清掉它们,初次相遇的卡顿全部回归
- 大作发售前更新显卡驱动,而不是发售当天:新驱动往往带来新版本的编译器,会让现有缓存整体失效
- 把头一个小时当作最难受的时段:每个新关卡、新枪械、新天气效果都会触发还没人编译过的管线;缓存填满之后,卡顿自然消退
- 别在这里相信“游戏加速器”和进程清理工具——编译是单线程的 CPU 工作,腾出内存对它毫无影响
- 一款游戏既没有预编译也没有 PSO 缓存,那是开发者的决定,不是你电脑的错——该做的是提交 bug 报告,而不是重装 Windows
那些没用的办法
网上流行的着色器卡顿偏方,大多治错了病。调低画质没有用:该编译的管线一条不少,只是编译完之后渲染更便宜。把清空着色器缓存当“修复”,在所有带本地缓存的游戏里都是雪上加霜——唯一合理的场景是缓存损坏导致游戏启动即崩溃,而这正是游戏自带清缓存选项的用途。帧生成也盖不住编译卡顿,因为插值帧本身源自卡住的那一帧。诚实的答案是耐心加上完好无损的缓存:让游戏热身一次,把驱动缓存留在原地,到了第二遍,这个问题基本就不存在了。
常见问题与解答
为什么刚发售的游戏在高端 PC 上也卡?
初次相遇时的着色器编译:那一帧在等待时,驱动正在把着色器翻译成你这块 GPU 的代码。随着游戏和驱动的缓存填满,卡顿会逐渐消失。
清理着色器缓存能提高 FPS 吗?
不能——它只会把你已经熬过去的编译卡顿请回来。只有缓存损坏导致游戏崩溃时才该清,而且优先用游戏自带的选项。
联系我们: [email protected]