版本:Unity 6 (6000.0)
语言:English
AssetBundle 下载完整性和安全性
使用资源进行脚本编写

多进程 AssetBundle 构建(实验性)

与 Unity 之前版本相比,多进程 AssetBundle 构建是对 AssetBundle 构建方式的一项重大改进。此功能(于 2023.1 引入)最初与现有的构建代码并行提供,默认情况下处于禁用状态。新功能仅适用于使用 BuildPipeline.BuildAssetBundles() 构建的 AssetBundle,不适用于使用 Addressables 构建的 AssetBundle。

此功能可提高构建性能,并解决 AssetBundle 的一些长期存在的问题。为了促进采用,它在输出方面提供了高度的兼容性,并且可以通过现有的 API 使用。

新机制利用 Asset Database 执行多个并行导入,以及缓存中间文件。在许多情况下,启用此功能后,干净构建的速度会更快,增量构建的速度和准确性也会大大提高。此外,您可以使用加速器Unity 加速器是一个外部工具,它提供了一个资源缓存,用于保存团队导入资源的副本。加速器的目标是通过协调资源共享来加快团队合作速度并减少迭代时间,从而避免您需要重新导入项目的部分内容。 更多信息
请参阅 词汇表
在机器之间共享构建工件,从而使来自一台机器的构建能够加快其他机器上的类似构建的速度。有关更多信息,另请参阅 并行导入

启用多进程构建后,它还会将着色器在 GPU 上运行的程序。 更多信息
请参阅 词汇表
编译工作移至其自己的专用构建步骤,这可以使您更清楚地了解与构建的其他步骤相比,编译着色器花费了多少时间。

启用多进程 AssetBundle 构建

要在用户界面中启用新功能

  1. 打开 编辑器设置(顶部菜单:编辑 > 项目设置,然后选择编辑器类别)。
  2. 单击多进程 AssetBundle 构建的复选框。

该设置通过 EditorBuildSettings.UseParallelAssetBundleBuilding 公开给脚本。

差异和已知限制

  • 使用多进程 AssetBundle 构建时,不会启用网格Unity 的主要图形基元。网格构成了 3D 世界的大部分内容。Unity 支持三角形或四边形多边形网格。NURBS、NURMS、细分曲面必须转换为多边形。 更多信息
    请参阅 词汇表
    优化。在构建过程中,它会静默强制为“关闭”。注意:在实践中,网格优化会给构建过程带来很高的成本和复杂性,并且通常在运行时不会带来太多收益。
  • 精灵2D 图形对象。如果您习惯于使用 3D,那么精灵本质上只是标准纹理,但有一些特殊的技术可以组合和管理精灵纹理,以便在开发过程中提高效率和便利性。 更多信息
    请参阅 词汇表
    图集 V1 不受支持。检测到此旧格式时会打印错误。您应将 V1 资源更新到 SpriteAtlasV2 以便成功构建。
  • 对象相互影响的方式现在是在所有 AssetBundle 中计算的,而不是在每个单独的 AssetBundle 的范围内计算的。例如,如果材质需要启用某个着色器功能,则即使该着色器是另一个 AssetBundle 的一部分,也会启用该着色器功能。这给出了更接近预期结果的结果,但可能会导致一些更长的着色器编译时间,尤其是在多个 AssetBundle 中重复使用着色器时。另请参阅 着色器关键字
  • 在输入相同的情况下,多进程构建的输出与非多进程构建的输出在二进制上不完全相同。但是,输出在功能上应该相同。这意味着,如果您已将 AssetBundle 发布给用户,则将项目更新为使用多进程构建可能会导致所有 AssetBundle 文件发生更改。当您推送下一个版本时,这可能会触发对您的实时用户的下载。二进制差异来自改进和错误修复,这些改进和错误修复可能导致 AssetBundle 内部对象的命名或排序略有不同。
  • 项目 Library 文件夹使用的磁盘空间可能会变大,因为我们使用 AssetDatabase 缓存中间构建工件。当指定 BuildAssetBundleOptions.ForceRebuildAssetBundle 标志时,这些工件会在构建开始时完全刷新。
  • 启用多进程后,AssetBundle 哈希是 AssetBundle 未压缩内容的哈希值。它用作与压缩一种存储数据的方法,可以减少其所需的存储空间。请参阅 纹理压缩动画压缩音频压缩构建压缩
    请参阅 词汇表
    无关的文件版本标识符,并且不包含 AssetBundle 标头的内容。提示:BuildAssetBundleOptions.AssetBundleStripUnityVersion 标志可用于从 AssetBundle 内容(以及哈希)中排除 Unity 版本。
  • 使用这种新的哈希计算方式,只能通过运行完整构建来确定哈希。因此,当使用 BuildAssetBundleOptions.DryRunBuild 调用 BuildPipeline.BuildAssetBundles 时,AssetBundleManifest.GetAssetBundleHash 返回 0。

构建回调

如果您正在调整现有项目,该项目使用构建回调来处理多进程 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 发送错误报告时,提供这些文件可能会有用,尤其是在无法提交完整项目的情况下。

AssetBundle 下载完整性和安全性
使用资源进行脚本编写