Vulkan 磁盘着色器缓存如何消除卡顿
传统模拟器的 stutter 怎么来的
每次启动一款 3DS 游戏,模拟器都要「翻译」数以万计的着色器——把 3DS 的 GPU 指令转换成你电脑显卡能执行的着色器。翻译是即时的,所以游戏前几秒(甚至几分钟)会出现明显的帧率抖动和短暂暂停。模拟器社区把这叫「shader stutter」。
之前的方案
Citra / Lime3DS 用了两个办法缓解:
- 异步编译:游戏运行时在后台编译着色器,界面不卡但画面可能闪
- 着色器预热:打开游戏的 shader cache 菜单,让它在进入游戏前预编译
两者都不能彻底解决问题——异步编译仍然会在游戏过程中出现短暂卡帧;预热需要等很久。
Azahar 2126 的磁盘缓存
Azahar 2126 引入了 Vulkan 原生的磁盘着色器缓存:编译一次,写入磁盘,下次直接加载。
缓存文件放在模拟器用户数据目录的 cache/shaders/ 下。首次玩某款游戏时,你仍然会看到短暂的卡顿(第一次编译),但第二次启动同款游戏时,游戏立刻顺畅,完全没有 stutter。
缓存怎么管
- 自动管理:默认开启,不需要额外设置
- 清理缓存:在模拟器「清理缓存」菜单项里一键清掉
- 跨游戏独立:每款游戏的着色器缓存是分开的,不会互相污染
- 升级影响:Vulkan 驱动升级后缓存可能失效,模拟器会自动重新编译
实测效果
有玩家反馈马里奥赛车 7、宝可梦 X、塞尔达时之笛 3D 等大作,首次启动 30 秒后进入游戏,第二次启动只需等加载条消失——游戏内完全没有卡顿。这对 Radeon 老卡和 Intel 集显用户尤其重要。