对于 PC 游戏玩家来说,“虚幻引擎(Unreal Engine)”无疑是一个极具话题性的名词。一方面,它代表着令人惊叹的视觉效果,像《黑神话:悟空(Black Myth: Wukong)》《地狱之刃2:塞娜的史诗(Senua's Saga: Hellblade II)》和《瘟疫传说:安魂曲(A Plague Tale: Requiem)》这些游戏,都凭借虚幻引擎展现出了令人震撼的画面;另一方面,它也常常与“卡顿”联系在一起。如果要问卡顿是怎么回事,以及为什么会出现这种情况,虚幻引擎的开发者 Epic 已经在一篇博客中给出了详细的解释,并且介绍了他们正在采取的解决措施。

b5MtbTPmaejhRTLGTvScdh-1200-80

我们先来了解一下背景知识。在游戏的图形渲染过程中,着色器(shaders)扮演着重要的角色。着色器是一小段代码,用于完成特定的任务,比如在屏幕上移动一个三角形,或者根据多个光源、材质和其他效果来计算一个像素的颜色。

虚幻引擎是一种强大的游戏开发工具,开发者可以通过 C++ 编程,也可以利用其内置的蓝图(blueprints)进行开发。为了简化图形编程,通常会借助像 Direct3D 或 Vulkan 这样的 API(应用程序接口)。通过 API,开发者可以发出一个指令,API 会将其转换为多个其他指令,从而实现复杂的图形效果。

然而,显卡中的 GPU 并不能直接理解 API 输出的内容,这就需要显卡驱动程序将代码转换为 GPU 可以处理的格式,这个过程被称为着色器编译。在现代复杂的 3D 游戏中,需要编译的着色器数量可能高达数万个。

如果游戏在运行过程中尝试进行着色器编译,CPU 就会忙于处理编译任务,无法以全速运行游戏,这会导致游戏的帧率突然下降。虽然这种下降通常是短暂的,但当这种情况反复出现时,玩家就会感受到明显的卡顿。Epic 在博客中详细解释了这一现象:

渲染一个对象通常需要多个着色器协同工作,例如顶点着色器和像素着色器,同时还涉及 GPU 的许多其他设置,如剔除模式、混合模式、深度和模板比较模式等。这些设置共同决定了 GPU 管线的配置状态。某些设置会影响着色器代码的执行,因此在某些情况下,驱动程序只有在处理绘制命令时才能开始编译着色器。对于单个绘制命令,这个过程可能需要数十毫秒甚至更长时间,当某个着色器首次被使用时,就会导致帧时间过长,这就是玩家常说的“卡顿”现象。

在 Unreal Engine 5.2 版本之前,Epic 推荐的解决方案是将最常用的管线状态对象(PSO)“打包”到一个缓存中。这个缓存会在游戏首次启动时,或者加载存档或关卡时创建。不过,这种方法存在一些问题,比如它非常耗费资源,而且在动态内容较多的游戏中,需要不断更新缓存。

为了解决这些问题,虚幻引擎的最新版本引入了一种新的技术——PSO 预缓存(PSO precaching)。当加载一个对象时,系统会根据对象的材质、网格信息(例如静态或动画)以及全局状态(例如视频质量设置)来计算可能使用的 PSO 子集。这个子集虽然比最终实际使用的要大,但比所有可能性的范围要小得多,因此可以在加载阶段完成编译。例如,《堡垒之夜:大逃杀(Fortnite Battle Royale)》在一场游戏中会编译大约 30,000 个 PSO,但实际使用到的只有约 10,000 个。这仅仅是总组合空间中的一小部分,而总组合空间可能包含数百万种可能性。

在地图加载期间创建的对象会在加载屏幕显示时预缓存其 PSO。那些在游戏过程中流式传输或生成的对象可以选择等待其 PSO 准备好后再进行渲染,或者直接使用已经编译好的默认材质。在大多数情况下,这种延迟只会持续几帧,几乎不会被玩家察觉。通过这种方式,PSO 预缓存技术已经有效地解决了材质相关的卡顿问题,并且能够与用户生成的内容无缝协作。

然而,这个系统仍然存在一些局限性。Epic 承认,不与材质直接关联的着色器(例如用于后期处理效果如运动模糊的全局着色器)无法像材质着色器那样完全预缓存。虽然计算着色器可以实现预缓存,但图形着色器目前还做不到。因此,这些类型的 PSO 在首次使用时仍然可能会导致偶尔的一次性卡顿。Epic 表示,他们正在努力进一步完善预缓存机制,以填补这一空白。

此外,GPU 驱动程序通常会将编译好的 PSO 保存在 SSD 或硬盘上,以便下次快速使用,但它们也可以存储在系统内存中。不过,PSO 缓存可能会变得非常庞大,这也会带来一些问题。Epic 正在研究解决方案,以减少内存占用,并自动决定何时可以保留预缓存的 PSO。

总的来说,Epic 明确表示,他们深知虚幻引擎游戏中着色器编译卡顿是一个亟待解决的问题,并且正在积极寻找解决方案。不过,对于普通玩家来说,可能更关心的是如何避免卡顿现象。毕竟,玩家无法直接干预着色器的编译过程。

为此,Epic 也为开发者提供了一些实用的建议,以减少卡顿现象的发生。例如,开发者应使用最新版本的虚幻引擎,并在开发过程中定期分析 PSO 卡顿问题。同时,开发者还需要注意,除了着色器编译之外,其他因素也可能导致卡顿。玩家可能无法区分卡顿的具体原因,但他们往往会将其归咎于游戏本身。

Epic 还建议开发者避免使用 DirectX 11,因为即使使用该 API,着色器编译卡顿问题依然存在,而且在较旧的技术中,减少卡顿的方法相对较少。Epic 指出,解决这一问题的答案在于未来的技术发展,而不是回到过去。例如,Vulkan 扩展中的图形管线库就是一个很好的改进方向。

虽然 Epic 认识到 PSO 编译卡顿是一个严重的问题,并且通过博客详细介绍了相关情况,但这种补救措施似乎来得有些晚。毕竟,目前已经有大量虚幻引擎游戏存在卡顿问题,给玩家带来了不好的体验。

不过,如果未来的大预算游戏能够以无卡顿的状态发布,那么这无疑是一个巨大的进步。届时,《星球大战绝地:幸存者(Star Wars Jedi: Survivor)》等游戏的卡顿问题也将成为历史。


文章标签: #虚幻引擎 #卡顿问题 #PSO预缓存 #游戏优化 #技术发展

负责编辑

  菠萝老师先生 

  让你的每一个瞬间都充满意义地生活,因为在生命的尽头,衡量的不是你活了多少年,而是你如何度过这些年。