异步关卡加载
启用异步加载以改善打开关卡时的加载时间。
注意:异步(async)加载是实验性功能。使用此功能时可能会遇到竞态条件和其他问题。
为了改善在编辑器中打开关卡时的加载时间,虚幻引擎支持异步(async)加载。
在虚幻引擎中,默认情况下加载在称为游戏线程的单个线程上同步进行。加载涉及反序列化资产、创建 UObject 以及应用变换,直到世界加载完成并准备好显示。
使用异步关卡加载时,加载过程的部分内容会委托给与工作线程异步运行的工作线程。异步加载过程还会跨多个 CPU 核心分配,以便具有更多核心的计算机可以更快地加载世界。
有关异步加载在虚幻引擎中如何工作的更多详细信息,以及此功能的实现方式,请参阅 Mastering Async Loading in Unreal Engine。
设置异步加载
为了检测异步加载工具的竞态条件,我们建议您的系统在编辑器运行且地图加载后具有 24 到 32GB 的可用内存。
异步加载工具包括插桩编译器和运行时竞态检测。请按照以下步骤设置该工具:
-
要激活编译器,请在您正在使用的分支中的
BuildConfiguration.xml文件中将bEnableInstrumentation设置为true,然后编译您的项目:<?xml version="1.0" encoding="utf-8" ?> <Configuration xmlns="https://www.unrealengine.com/BuildConfiguration"> <BuildConfiguration> <bEnableInstrumentation>true</bEnableInstrumentation> </BuildConfiguration> </Configuration> -
在启用插桩功能编译项目后,运行以下命令行以激活竞态检测:
-asyncloadingthread -dpcvars=s.DetectRaceDuringLoading=1编译器基于 Clang,因此如果您之前仅使用 MSVC 编译,可能需要修复一些编译错误。
此命令仅在异步加载处于活动状态时运行竞态检测,以提高编辑器性能。在竞态检测处于活动状态时运行插桩构建通常比正常构建慢 10 到 20 倍。当竞态检测未处于活动状态时,插桩构建仅慢 1.5 到 3 倍。
运行竞态检测不是强制性的,但如果您的项目中有大量修改的引擎或 C++ 代码,则被认为是最佳实践,因为它可以检测可能难以复现的线程错误。
默认启用异步加载
在使用控制台测试异步加载后,您可以通过编辑 DefaultEngine.ini 并添加以下内容来将项目设置为默认使用异步加载:
[/Script/Engine.EditorStreamingSettings]
s.AsyncLoadingThreadEnabled=True
s.AllowMultithreadedLoading=True
异步加载最佳实践
使用异步加载时,请遵循以下最佳实践:
-
尽可能避免刷新加载管道。每次刷新都需要工作线程与游戏线程同步,这会暂时阻止它们与游戏线程并行运行。
-
在加载期间将委托注册延迟到 Postload 或更晚。
-
在加载期间将全局系统交互延迟到 Postload 或更晚。
-
避免从加载器调用的函数中进行 UI 交互。
-
避免从加载器调用的函数中进行事务系统交互。
-
自定义序列化代码应仅接触正在序列化的对象。
-
在加载期间将同步加载延迟到 Postload 或更晚。
-
避免从加载器调用的函数中基于全局变量做出决策。