构建过程主要包括以下两部分:
由于v3.0的构建机制的调整cocos,不同平台的构建处理以构建扩展的形式注入到构建发布面板中,参与构建过程。 每个平台特有的构建选项也将以扩展选项的形式显示在构建发布面板上。 开发人员可以通过构建扩展在构建发布面板上显示自定义的构建选项。
通用构建处理流程
Cocos Creator 的总体构建流程主要包括以下内容:
构建选项初始化 构建数据组织 将构建的资源写入文件系统 整理 config.json 中的 settings.json/config.json UUID 数据 压缩和文件写入 构建选项初始化
这一步主要是将构建时传递给构建的原始选项初始化为构建内部的选项,完成部分构建选项的格式转换,初始化工程配置,初始化构建的资源库的资源数据,查询和分类最新的资源信息。
构建数据争论
编译时,编辑器首先会整理当前参与构建的场景以及所有Bundle文件夹中的资源,然后通过引擎的反序列化找出这些资源的依赖资源,递归找出所有依赖的资源列表需要打包。 资源列表编译完成后,会根据Bundle配置对资源进行分类,收集脚本编译任务、图片压缩任务、json分组信息等。
注意:
引擎将在反序列化之前加载所有用户脚本。 脚本加载是否成功将直接影响资源反序列化,因此如果脚本编写不合法,构建将直接失败。
如果在资源整理过程中发现缺少任何依赖资源,会直接报错,通常会继续构建。 虽然允许构建成功继续,但这并不意味着问题不需要解决。 如果不解决资源丢失问题,很难保证构建的游戏包不会出现问题。将构建的资源写入文件系统
构建完成的资源会根据配置打包到对应平台发布包目录下的assets/[Bundle name]中。 目录结构如下:
更多关于Asset Bundle配置、构建、文件说明等信息,请参考Asset Bundle文档。
梳理完基本的构建任务后,构建会循环遍历所有Bundle,依次执行每个Bundle需要处理的资源打包任务,生成这些Bundle资源包。
每个Bundle都会经历以下资源处理过程:
自动图集处理:查询项目内的自动图集资源列表,根据自动图集资源的配置,将图集下的SpriteFrame小图打包成大图,生成序列化文件等。 这一步还会根据需要修改json分组信息、asset资源分组信息以及添加纹理压缩任务。
纹理压缩:根据组织好的图像压缩任务,将图像资源压缩并写入build文件夹。
引擎脚本编译:根据顶部菜单栏项目设置->功能剪辑的配置,删除未使用的引擎模块,并将其打包到cocos-js目录中。 勾选sourceMap选项会生成相应的.map文件,并使用debug选项来判断脚本是否被混淆和压缩。
引擎编译的主要步骤包括:
json构建:序列化json时,会根据json组和所属的bundle进行合并并写入文件系统(在assets/xxxBundle/import文件夹中)。 如果是release模式,序列化json中的UUID也会被压缩。
普通资源复制:一些原始资源(rawAssets)会直接从库中复制到构建的assets/xxxBundle/native文件夹中。
md5处理:为assets文件夹下的所有资源、项目脚本、引擎文件添加md5后缀,并将需要记录的数据整理到settings.json中。
Application.js文件生成:根据用户选项动态生成application.js文件,并将其放置在构建后生成的发布包目录的src目录下。
组织设置/配置配置 JSON 数据
主要是根据之前资源整理的数据,准备游戏启动所需的配置信息。
设置.json
settings.json记录了整个游戏包的基本配置信息,会直接影响游戏包的初始化。
settings.json配置说明如下:
{
debug: boolean; // 是否为调试模式,取自构建发布面板
designResolution: ISettingsDesignResolution; // Canvas 分辨率设置,取自项目设置中的数据
jsList: string[]; // 插件脚本信息
launchScene: string; // 初始场景 url
moduleIds: string[]; // 所有用户脚本组件的信息
platform: string;
renderPipeline: string;// renderPipeline 信息,取自项目设置
physics?: IPhysicsConfig;// 物理模块设置(仅在勾选了物理引擎模块时生成)
BundleVers: Record; // Bundle 的 md5 值
subpackages: string[]; // 分包信息
remoteBundles: string[]; // 记录远程包 Bundle 的集合
server: string; // 记录远程服务器地址(注意:v3.4 之前该项存放在 ‘application.js’ 文件中)
hasResourcesBundle: boolean; // 是否含有 resources 内置 Bundle
hasStartSceneBundle: boolean; // 是否含有初始场景内置 Bundle
customJointTextureLayouts?: ICustomJointTextureLayout[];
macros?: Record; // 项目设置面板中的引擎宏配置值
}
配置.json
每个Bundle资源包都有一个config.json,里面记录了整个Bundle的资源、脚本等基本信息,这些信息会直接影响Bundle包的加载。
config.json配置说明如下:
{
importBase: string; // Bundle 中 import 目录的名称,通常是 'import'
nativeBase: string; // native 中 native 目录的名称,通常是 'native'
name: string; // Bundle 的名称,可以通过 Bundle 名称加载 Bundle
deps: string[]; // 该 Bundle 依赖的其他 Bundle 名称
scenes: Array<{url: string, uuid: string}>; // Bundle 内包含的场景信息数组
rawAssets: { [index: string]: { [uuid: string]: string[] } };
// 存储 resources 下加载的资源 url 与类型
// 示例: "bba00d3a-2f17-4511-b47c-0d584b21b763@6c48a": ["test/right/texture", "cc.Texture2D", "bba0...@6c48a"]
// "bba0...@6c48a": ["test/right/texture", 1, 1]
packs: Record; // json 分组信息
versions: {
import: Array;
native: Array;
}; // 勾选 md5Cache 后才有,数组部分以 [uuid_1, md5_1, uuid_2, md5_2, ...] 的格式存储,其中 uuid_1 如果是个简单数字说明存储的是 uuids 数组内的 uuid 索引
uuids: string[]; // uuid 数组,仅 release 模式下
types?: string[]; // 资源类型数组,仅 release 模式下
encrypted?: boolean; // 原生上使用,标记该 Bundle 中的脚本是否加密
isZip?: boolean; // 是否为 ZIP 模式
zipVersion?: string; // ZIP 包的 MD5 Hash 值
}
这里的结构只列出了普通流程下settings.json/config.json的结构。 事实上,不同平台搭建后这些参数会有所不同。
压缩config.json
在生成config.json之前,会根据是否处于release模式游戏动态,对文件中的UUID信息进行压缩。 了解这个规则将有助于资源构建后查找文件位置。
构建时,Bundle中使用的UUID将会被排序。 如果它们出现两次或两次以上,它们将被存储在uuids数组中,并且之前使用的UUID的位置将被索引替换。
所有出现两次或以上的类型也存储在 types 数组中,之前使用的位置由索引替换。
建立资源
这一步是生成除了脚本之外的其他项目资源文件,因为脚本是作为特殊文件单独编译和处理的。 资源在打包过程中被反序列化后,会被重新压缩并序列化,以减少打包后的包体。 多个序列化的 JSON 将根据之前数据编译的 JSON 分组信息合并为一个。 例如,纹理资源的序列化文件将全部打包成一个json文件。
各平台搭建及加工
Build提供了构建生命周期的钩子函数,方便开发者在构建的不同处理周期参与构建过程并影响构建结果。 同时,构建还支持开发者添加自定义构建选项的配置。 通过简单的配置,即可在构建发布面板中直接显示相应的新参数。 详细信息请参考定制构建流程。 构建扩展注入的构建选项将存储在 options.packages[pkgName] 中,因此当前通过命令行构建的选项参数也需要遵循此规则。 可以通过点击构建发布面板右上角的导出构建配置来执行相应参数的规则。 参考。
各平台的编译/生成过程
从 Cocos Creator 3.0 开始3D道具,所有需要支持单独编译和生成的平台的构建过程都被分离了。 一些开发者可能想知道为什么现在的小游戏平台都有新一代按钮。 其实这部分逻辑也是一直存在的,只是合并到了构建中,无法单独控制。
编辑器的构造类似于导出相应平台的游戏包的功能。 主要是完成引擎与各平台的接口,以及使游戏包兼容基本格式。 这并不意味着所有工作都已完成。 每个平台通常都有自己的编译流程,比如微信小游戏平台自带的开发者工具的编译和上传功能,以及每个原生平台相关的IDE的编译、运行和调试功能。 如果开发者需要针对特定平台定制打包,编辑器需要支持进程拆分,以便更好的访问。
常见问题解答指南
整个构建过程是在一个单独的worker内部,所以如果你想查看构建过程的日志信息或者在发生错误时查看完整的调用堆栈,可以点击主菜单上的开发者->打开构建调试工具来查看它。 构建时实际上会输出很多日志信息,但为了不打扰用户,默认情况下只会将错误、警告和一些重要的日志信息打印到编辑器的控制台面板上。 调试工具中的日志信息是最全的。
注意:构建之前,请确保构建涉及的场景可以正常预览。 某些场景中的资源丢失或其他脚本问题可能会在预览阶段暴露出来。 在保证预览正常的情况下进行构建,可以更好地节省时间和排查问题。
资源加载404
此时,请复制资源丢失日志中的UUID,在资源管理器中搜索对应的资源,检查该资源所依赖的资源是否一切正常。 资源加载404通常有以下几种情况:
未放置在 Bundle 中的资源会在脚本中动态加载。
加载的资源导入有问题,无法正常生成数据入库。
资源丢失
脚本资源加载错误
前面介绍的构建数据整理一节提到,构建时需要配置脚本环境。 如果错误信息与脚本相关,请参考错误信息修改脚本。 如果不知道是哪个脚本导致了错误cocos,可以在错误消息调用栈中找到对应脚本的UUID,然后在资源管理器中定位。
小图自动合并后如何找到大图
构建过程中,自动图集会打印出原始小图和合成大图的UUID信息,可以在构建调试工具中找到,然后在XXXBundle/中使用找到的合成大图的UUID打包后生成的,可以在native目录下查看。 如果图片太多,可以打开构建日志文件,搜索UUID。
如何解压UUID
Release模式打包的资源JSON文件和config.json中的UUID都是压缩的,需要解压才能在原项目中找到对应的资源。 在全局变量 Build 上构建过程中内置了一些工具和方法。 只需点击主菜单中的Developer -> Build Debugging Tools,在控制台中输入以下命令即可查询原始UUID:
Build.Utils.decompressUuid('425o80X19KipOK7J1f5hsN');
// 42e68f34-5f5f-4a8a-938a-ec9d5fe61b0d
引擎编译失败
如果引擎编译失败,请检查安装包是否完整、修改后的内置引擎代码是否正确、是否使用自定义引擎、路径是否正确等。
其他错误报告
如果您遇到无法自行解决的错误,请将Creator版本、构建选项配置、构建任务中的构建日志文件以及重现问题的Demo附加到论坛反馈。
文章来源:https://docs.cocos.com/creator/manual/zh/editor/publish/build-guide.html