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