与 Unity 之前版本相比,多进程 AssetBundle 构建是对 AssetBundle 构建方式的一项重大改进。此功能(于 2023.1 引入)最初与现有的构建代码并行提供,默认情况下处于禁用状态。新功能仅适用于使用 BuildPipeline.BuildAssetBundles() 构建的 AssetBundle,不适用于使用 Addressables 构建的 AssetBundle。
此功能可提高构建性能,并解决 AssetBundle 的一些长期存在的问题。为了促进采用,它在输出方面提供了高度的兼容性,并且可以通过现有的 API 使用。
新机制利用 Asset Database 执行多个并行导入,以及缓存中间文件。在许多情况下,启用此功能后,干净构建的速度会更快,增量构建的速度和准确性也会大大提高。此外,您可以使用加速器Unity 加速器是一个外部工具,它提供了一个资源缓存,用于保存团队导入资源的副本。加速器的目标是通过协调资源共享来加快团队合作速度并减少迭代时间,从而避免您需要重新导入项目的部分内容。 更多信息
请参阅 词汇表在机器之间共享构建工件,从而使来自一台机器的构建能够加快其他机器上的类似构建的速度。有关更多信息,另请参阅 并行导入。
启用多进程构建后,它还会将着色器在 GPU 上运行的程序。 更多信息
请参阅 词汇表编译工作移至其自己的专用构建步骤,这可以使您更清楚地了解与构建的其他步骤相比,编译着色器花费了多少时间。
要在用户界面中启用新功能
该设置通过 EditorBuildSettings.UseParallelAssetBundleBuilding 公开给脚本。
如果您正在调整现有项目,该项目使用构建回调来处理多进程 AssetBundle 构建,则可能需要对构建回调代码进行代码更改。
在构建期间,场景场景包含游戏的环境和菜单。可以将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您放置环境、障碍物和装饰,从本质上讲是分段设计和构建您的游戏。 更多信息
请参阅 词汇表文件将加载并重新保存到输出格式。在此期间可能会执行脚本代码,例如通过 IProcessSceneWithReport.OnProcessScene 构建回调。使用多进程 AssetBundle 构建时,此脚本代码将在 AssetDatabase 工作进程内的导入作业的上下文中执行,类似于 ScriptedImporter 的运行方式。
对于完全使用加载场景的状态工作的场景回调,在作为 AssetDatabase 导入程序的一部分运行时不会出现任何问题。但某些情况可能会导致麻烦
更改资源。您永远不应该从构建回调中创建、删除或修改外部资源。现在有一些特定的保护措施可以防止对更改资源的 AssetDatabase API 的调用。如果进行这些调用,则会引发脚本异常并显示清晰的错误消息。
依赖项跟踪。在某些情况下,构建回调需要读取场景外部的其他资源的内容。如果场景也显式引用该资源,则此操作可以正常工作,无需任何其他更改。如果不是,则需要更新构建回调实现以使用新的 BuildPipelineContext.DependOnAsset 调用,以便跟踪依赖项。否则,未来的增量构建可能会重新使用过时的缓存工件,并且不会调用回调脚本。
单例和全局状态。新构建系统多进程的特性意味着场景和其他资源加载在不同的工作进程中,而不是全部按顺序加载在主 Unity 进程中。这意味着使用共享访问全局数据(例如单例)的代码可能会停止工作。可能需要修改任何依赖于共享内存的代码,以使用直接存储在场景中、资源内部或可能临时文件中的数据。
由于缓存的存在,增量构建仅在场景或其他依赖项自上次构建以来发生更改时才调用构建回调。如果脚本回调已更改并且必须再次运行,则可以通过递增回调上的 BuildCallbackVersion 属性来强制执行此操作。对于未指定该属性的回调,默认版本号为 1。
注意:在构建期间可能会在其他情况下调用脚本代码,例如 Awake 方法在具有 ExecuteInEditMode 属性的 MonoBehaviour 派生类上。如果您有代码正在执行在 AssetDatabase 导入期间不允许的操作,则可能需要更改该代码。提示:BuildPipeline.isBuildingPlayer API 在 AssetBundle 构建期间返回 true,因此您可以使用它来添加条件逻辑,例如避免在构建期间执行有问题的代码,但在进入播放模式时仍允许执行该代码。
除了 AssetBundle 故障排除 主题中提到的通用技术和工具外,首选项窗口中还提供了一些 诊断标志,可帮助收集有关 AssetBundle 构建的详细信息。这些标志旨在用于高级用途,将来可能会更改或删除。
BuildPipelineBinaryBackwardCompatibilityMode
诊断标志特定于多进程 AssetBundle 构建。启用后,某些行为会更改为更接近现有 AssetBundle 构建逻辑的行为。在某些情况下,启用此标志会导致 AssetBundle 具有与关闭多进程项目设置执行的构建完全匹配的二进制内容。此标志默认情况下处于关闭状态,因为 AssetBundle 内容中的大多数差异都是有意改进的结果,并且将来可能会删除兼容模式。但是,此标志在现有项目中可能很有用,在这些项目中,保持 AssetBundle 内容的最小变化非常重要。
当启用BuildPipelineTEPCapture
诊断标志时,对BuildPipeline.BuildAssetBundles
的调用将生成一个“跟踪事件”格式的性能分析器一个帮助您优化游戏的窗口。它显示了在游戏各个方面花费了多少时间。例如,它可以报告渲染、动画或游戏逻辑中花费的时间百分比。更多信息
参见术语表文件。您可以使用此文件详细了解构建执行的步骤,包括每个 AssetDatabase 工作进程中执行的步骤。
此文件在每次构建时都会被覆盖,并且可以在路径Logs/BuildAssetBundlesTEP.json
中找到。这是 Chrome 跟踪支持的文件格式,有关详细信息,请参阅跟踪事件格式。查看内容的一种方法是在 Google Chrome 或其他基于 Chromium 的浏览器中使用 chrome://tracing 工具打开它。
BuildPipelineWriteDebugFiles
标志特定于多进程 AssetBundle 构建。启用后,构建会将额外的 JSON 格式文件写入Temp/BuildInstructions
文件夹。这些文件仅用于测试和调试目的,构建本身不需要也不使用它们。在向 Unity 发送错误报告时,提供这些文件可能会有用,尤其是在无法提交完整项目的情况下。