着色器编译卡顿的成因
当游戏引擎需要在使用着色器之前即时编译一个新的着色器时,就会出现着色器编译卡顿。这种卡顿是由于驱动程序完成编译过程所需的时间导致的延迟。着色器是运行在GPU上用于渲染3D图像的程序,通常使用高级语言(如HLSL)编写。与只有少数通用指令集的CPU不同,GPU有多种不同的指令集,因此着色器会被编译成一种通用字节码,然后在运行时由驱动程序转换为特定的机器码。
PSO预缓存系统的引入
当着色器较为简单时,这种编译过程还算可行。但随着游戏变得越来越复杂,游戏过程中编译着色器所花费的时间变得愈发明显,从而导致卡顿。为了解决这一问题,现代API(如Direct3D 12和Vulkan)引入了管线状态对象(PSO),以避免运行时着色器编译,从而减少卡顿。
API现在要求开发者将一个绘制请求的所有着色器和设置打包成一个管线状态对象(PSO),并将其作为一个整体设置。PSO的关键优势在于,它们可以在任何时间创建,允许引擎提前准备好一切(例如在加载过程中),并确保在渲染开始之前完成着色器编译。
Unreal Engine 5.2的改进
在Unreal Engine 5.2之前,推荐的方法是使用打包的PSO缓存,将常用的PSO在游戏启动时或加载存档/关卡时进行缓存。然而,这种方法资源密集且需要频繁更新,尤其是在内容动态变化的游戏中。为了支持大型动态游戏世界和用户生成内容,Unreal Engine 5.2引入了PSO预缓存,以解决打包缓存资源占用过高的问题。不过,该系统也并非完美无缺:全局着色器(用于运动模糊等效果)无法以相同的方式完全预缓存。虽然计算着色器可以预缓存,但图形着色器则不能。
PSO缓存的存储与优化
GPU驱动程序会将编译后的PSO存储在你的固态硬盘或硬盘上,以便更快地重用,或者存储在系统内存中。然而,PSO缓存可能会变得非常庞大,因此这种做法只应在内存充足的机器上进行。目前,Epic Games正在开发解决方案,以减少内存占用,并自动决定何时保留预缓存的PSO。
总结与建议
简而言之,Epic Games承认Unreal Engine 5游戏中的着色器编译卡顿是一个问题,并正在努力解决。它还建议开发者使用最新版本的引擎,定期分析PSO卡顿问题,在测试前清除驱动程序缓存,并留意其他类型的遍历卡顿。
评论留言