Version: Unity 6.0 (6000.0)
语言 : 中文
Web 中的 AssetBundle
优化 Web 构建

分发大小和代码剥离

以 Web 为目标进行发布时,必须保持较低的构建大小,让用户在内容启动之前等待合理的下载时间,这一点很重要。有关减小资产大小的一般提示,请参阅减小构建文件大小相关文档。

Web 特有的提示和技巧

  • 纹理导入器 (Texture Importer) 中为所有压缩纹理指定__紧缩 (Crunch)__ 纹理压缩格式。

  • 不要部署开发构建;它们不会经过压缩或缩小,因此文件大小要大得多。

  • 在__播放器 (Player)__ 设置窗口,(点击编辑 (Edit) > 项目设置 (Project Settings) > Web),展开__发布设置 (Publishing Settings),并将__启用异常 (Enable Exceptions) 设为__无 (None)__。(如果在构建中不要异常)

  • 在__播放器 (Player)__ 设置 > 其他设置 (Other Settings) 面板中,启用__剥离引擎代码 (Strip Engine Code)__ 以确保高效构建。

  • 使用第三方托管的 dll 时,请注意,这可能会带来依赖项,从而增加生成的代码大小。

如果要构建发布构建,Unity 将根据在 Web __播放器__设置__发布设置__面板中选择的__压缩格式__来压缩构建输出文件。

请参阅部署压缩构建以详细了解如何发布压缩构建。

代码剥离

默认情况下,Unity 会从构建中删除所有未使用的代码。可通过__播放器__设置进行更改(菜单:__编辑 (Edit)__ > 项目设置 (Project Settings),然后选择__播放器 (Player)__ 类别):选择__其他设置 (Other Settings)__ 面板访问__剥离引擎代码 (Strip Engine Code)__ 选项。最好在启用剥离的情况下进行构建。

启用代码剥离后,Unity 扫描会项目以查找是否使用了 UnityObject 派生的任何类(通过在脚本代码中或在场景中序列化的数据中引用)。然后从构建中删除所有未使用这些类的 Unity 子系统。这样可减少构建代码,从而减小下载和要解析的代码(因此代码运行速度更快,且占用的内存更少)。

代码剥离的问题

如果代码剥离时剥离了实际需要的代码,可能会导致项目出现问题。例如,如果在运行时加载的 AssetBundle 所包含的类未包括在主构建中,因此从项目中删除了这些 AssetBundle,这种情况下就可能出问题。发生这种情况时,浏览器的 JavaScript 控制台中会显示错误消息(随后可能会显示更多错误)。例如:

Could not produce class with ID XXX

要针对这些错误进行故障排除,请在类 ID 参考中查找该 ID(例如上例中的 XXX),查看哪个类正尝试创建实例。在这种情况下,可强制 Unity 在构建中包含该类的代码,方法是向脚本或向场景添加对该类的引用,或者在项目中添加 link.xml 文件。

下面的示例确保了 Collider 类和 Physics 模块在项目中得到保留。可将此 XML 代码添加到名为 link.xml 的文件,然后将该文件放入 Assets 文件夹。

<linker>
    <assembly fullname="UnityEngine">
        <type fullname="UnityEngine.Collider" preserve="all"/>
    </assembly>
</linker>

如果怀疑剥离导致构建出现问题,还可尝试在测试期间禁用__剥离引擎代码 (Strip Engine Code)__ 选项。

通过查看构建中包含哪些模块和类可以优化项目的剥离功能,但 Unity 未提供方便的方法来进行此操作。不过,若要了解包含的类和模块的概况,可在进行构建之后查看生成的文件 Temp/StagingArea/Data/il2cppOutput/UnityClassRegistration.cpp

请注意,__剥离引擎代码 (Strip Engine Code)__ 选项仅影响 Unity 引擎代码。IL2CPP 始终会从托管的 dll 和脚本中剥离字节代码。需要通过反射(而不是通过代码中的静态引用)来动态引用托管的类型时,这可能会导致问题。如果需要通过反射来访问类型,可能还需要设置 link.xml 文件才能保留这些类型。请参阅有关 iOS 构建大小优化的文档页面以了解关于 link.xml 文件的更多信息。

移动构建输出文件

要更改 Build 文件夹的位置,请修改 Web 模板 index.html 文件中的 buildUrl 变量。

要更改 Build 文件夹内的文件的位置,请在 index.html 文件中更改它们的 URL(即 dataUrlwasmCodeUrlwasmMemoryUrlwasmFrameworkUrl)。

如果要在内容分发网络 (CDN) 上托管文件,可指定位于外部服务器上的 URL,但需要确保托管服务器已启用跨源资源共享 (CORS) 才能保证正常工作。有关 CORS 的更多信息,请参阅手册中的 Web 联网页面。

增量构建

IL2CPP 为项目生成的 C++ 代码采用增量编译方式;也就是说,只有自上次构建以来生成的已更改的 C++ 代码才会再次编译。未更改的源代码将重复使用先前构建所生成的相同目标文件。用于增量式 C++ 构建的目标文件存储在 Unity 项目的 Library/il2cpp_cache 目录中。

要对生成的 C++ 代码执行从头开始的全新构建而不使用增量编译,请删除 Unity 项目中的 Library/il2cpp_cache 目录。请注意,如果 Unity 编辑版本与以前的 Web 构建不同,Unity 会自动从头开始执行全新的构建。


  • 在 Unity 2017.3 中添加了 Full Without Stacktrace
Web 中的 AssetBundle
优化 Web 构建