这次的UE5售后,我打90分~
1770 0
实名

通过了实名认证的内容创造者

发布于 2025-2-13 15:16:06

您需要 登录 才可以下载或查看,没有账号?注册

x
点击上方蓝字CG世界关注我们再点右上角···设为星标★
给大家看了几天的《哪吒2》图文,今天我们换换,聊聊UE5。Epic Games旗下第五代游戏引擎,UE5自发布以来就受到了广泛的关注和如潮水般的好评。
565fde6037e66b5ca65c310ad3a23108.jpg
作为强大且潜力无限的游戏开发平台,UE5提供了前所未有的创作自由和技术支持,因着高品质视觉效果和沉浸式的体验而备受赞誉。但也并不是说它就没有短板,比如···新的着色器编译策略可能会引发的卡顿问题,尤其是在游戏加载时更为明显。
18db597140c76d1283e06a98fe030c4f.gif
不过大家也不用过于忧愁,Epic Games家大业大,售后自然是十分完备。最近,参与开发虚拟引擎 PSO预缓存系统的几位工程师,在最新的博文中,深入解析了着色器编译卡顿问题的成因,以及如何利用PSO预缓存系统来巧妙解决这一问题。
↓推广↓



01背景解析
着色器编译卡顿,通常发生在渲染引擎发现需要即时编译新着色器时,GPU驱动编译过程,会导致一切暂停,等待驱动程序完成编译。在分析出现着色器编译卡顿的原因之前,咱们先来了解下GPU程序的编译机制:



着色器的本质是在GPU上运行的程序,用于执行渲染3D图像所设计的各种步骤,通常使用如HLSL等高级语言编写,必须编译为GPU能运行的机器码;
然而,与CPU程序直接编译为机器码不同,不仅不同厂商的GPU之间指令集不相同,甚至同一厂商不同代产品之间也可能存在差异;因此,开发者不能直接将着色器编译为针对特定GPU的机器码,而是先将其编译为中间字节码,使用由3D图形API定义的标准格式,可以创建一个通用的着色器库。当游戏运行时,驱动程序会根据当前系统中安装的具体GPU型号,将这些字节码实时转换为该GPU能执行的机器码。



传统图形API(如Direct3D 11)的状态设置方式,导致驱动程序只能在绘制指令发出时才开始编译而造成卡顿;因此,Direct3D 12和Vulkan等现代API开始通过引入管线状态对象 (PSO)的概念,来优化这一流程。
02Pipeline State Objects

渲染一个物体通常涉及到多个着色器,以及为GPU设置的其他渲染选项。在较旧的图形API中,允许开发者在任意时刻单独更改部分状态。由于一些设置会影响最终生成的着色器代码,驱动程序只能在接收到绘制命令时才开始编译着色器。因此,每次使用新的着色器时,都需要花费一定时间进行编译,导致“卡顿”,影响玩家游戏体验。现代API引入了管线状态对象(PSO)的概念,允许开发者提前将所有相关的着色器和设置打包成单一对象,一次性应用到绘制请求上。最重要的是,PSO可以在任何时间构建,理论上引擎可以在游戏加载阶段就做好准备,确保在实际渲染前完成所有必要的编译工作,不会因为即时编译而产生延迟或卡顿,为玩家提供更加流畅的游戏体验。
03理论与实践

虚拟引擎提供了一个强大的材质创作系统,协助艺术家创建视觉丰富且吸引人的游戏世界。然而每种材质可能对应多个着色器组合,加上不同的渲染设置,理论上需要预先编译数百万个不同的PSO来覆盖所有可能性,这在实际操作中会导致巨大的时间和内存开销。尽管“捆绑式PSO缓存”可以在一定程度上减少运行时的PSO编译需求,提高性能,但仍然面临资源消耗高、维护成本大以及难以适应动态内容等问题。

为了解决上述问题,UE5.2引入了PSO预缓存技术,采用了更加灵活和高效的方式来管理和优化PSO的使用。在加载一个对象时,系统会根据该对象的材质、网格类型(静态或动画)以及全局状态来计算一个可能使用的PSO子集,并在此时进行编译。目的是尽量缩小需要预先编译的PSO数量,以减少资源消耗和加载时间。虽然子集仍然大于实际使用到的数量,但也大大减少了即时编译的需求,从而避免运行时的卡顿现象。例如,《堡垒之夜》大逃杀模式在一场比赛中可能会编译大约30,000个PSO,但实际上只使用其中的大约10,000个。

对于那些在游戏中流式传输进入场景或动态生成的对象,如果PSO尚未准备好,可以选择等待这些PSO编译完成再渲染,或者临时使用默认材质。团队正在开发一种API,允许游戏代码和蓝图提前向系统提供提示,以便额外的PSO也可以被预缓存;同时计划让引擎在新材质编译期间继续渲染之前的材质,进一步减少因编译导致的视觉中断。当前的UE版本,已经能够预缓存全局计算着色器(但对于全局图形着色器的支持仍在开发中)。
04驱动程序缓存

驱动程序会将已经编译好的PSO保存到硬盘上,当玩家在后续的游戏过程中再次需要相同的PSO时,可以直接从硬盘加载,而不需要重新编译(这种方法对所有游戏都有帮助,不论它们使用的是哪种引擎或PSO编译策略)。一旦这些PSO被编译并保存到硬盘上,下次启动游戏时,加载时间就会显著缩短。UE通过“预缓存”的技术来利用驱动程序缓存。具体来说,在游戏加载期间引擎会创建所需的PSO,并在它们编译完成后立即丢弃。之后,当实际渲染需要某个PSO时引擎会发出一个编译请求,但实际上驱动程序只需从缓存中提取已有的PSO即可。一旦某个PSO被用于绘制操作,它会在内存中保持加载状态,直到所有使用它的图形元素从场景中移除。通过驱动程序缓存和预缓存技术,游戏可以在首次加载时编译必要的PSO,并将其保存以供后续使用。
05移动平台和主机

移动平台:在移动平台上,尽管使用的着色器数量比桌面端少,但由于移动设备的CPU速度较慢,PSO编译所需的时间往往要更长。为了应对这种情况,UE对移动端的预缓存流程进行了调整:跳过不常用的排列组合:缩小预缓存集的范围,从而减少了不必要的编译工作(但如果游戏中出现了不太常见的渲染状态,可能会导致短暂的卡顿)。设置预缓存时间限制:在地图加载期间设置预缓存的时间限制,游戏可以在某些PSO编译任务尚未完成时就开始运行;同时引入了一个优先级提升系统,当某个PSO被需要时,相应的编译任务会被提到队列前端,尽量减少卡顿的发生。主机平台:主机平台由于针对单一目标GPU设计,因此不存在同样的问题:主机平台上的单个着色器可以直接编译为可执行代码,并与游戏一起发布。在使用相同的顶点着色器配合多个像素着色器或处理不同的管线状态时,不需要重新编译。着色器和渲染状态可以在游戏运行时快速组合成PSO,而不需要花费大量的额外时间和资源。



UE作为一款被广泛使用的通用型引擎,必须能够支持各种不同类型的内容和工作流程,同时确保任何情况下都能提供最佳性能。经过一段时间的发展,UE找到了可行的解决方案,能够有效地弥补API的缺陷,进一步优化渲染流程,减少卡顿现象。


自从在UE5.2中作为实验性功能引入以来,预缓存系统已经能够有效防止绝大多数类型的着色器编译卡顿;但依然存在覆盖不足和其他限制问题。开发团队的最终目标是实现预缓存的自动化和最优化,在系统完全成熟之前,授权用户可以采用以下措施来确保流畅的游戏体验:



1.使用最新版本,确保获得最佳性能和效果。如果暂时无法全面升级,可以考虑将最新的改进继承到当前的自定义版本中;2.启用r.PSOPrecache.Validation=2命令来检测游戏中缺失或导致卡顿的PSO,并分析其成因;3.在测试游戏前,通过命令行参数-clearPSODriverCache清空驱动缓存,模拟首次运行游戏或更新驱动程序后的体验,使用第2项中的分析调试工具,尝试解决问题;4.将监控PSO状态纳入自动化测试流程中,定期检查以确保新变更不会对性能造成影响。




虽然PSO编译是导致卡顿的一个重要原因,但并非唯一的原因。在开发和测试期间,还是应该定期进行全面分析,找出所有可能导致性能下降的因素,并加以优化。相信随着技术的不断进步,未来的新版本会进一步减少甚至完全消除这些问题,让开发者能更轻松地制作出运行流畅又高质量的游戏~end




“肝”一把!万一成了呢,名利双收!


《哪吒2》票房涨速忒快!饺子导演手速赶不上啊!56张亲笔手绘图都在这了!


《哪吒2》票房破50亿!幕后制作公司名单大起底!

本帖被以下画板推荐:

内容主要涵盖影视特效,CG动国,前沿CG技术,作品欣賞
使用道具 <
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表