前言
UE4引擎通过editor来创建和管理uasset,但是当游戏发布到不同的平台时需要根据平台转换为不同的格式。而这样的转换过程就叫作烘焙。
分为三个步骤
- 加载包至内存;
- 为包中的每个对象生成目标平台特定数据 (Derived Data);
- 把含有平台特定数据的包另存到cooked目录
Loading Package
类似于DLL中的导入、导出符号表,Unreal的Package也有一个导入(import)、导出(export)表。
Import表示其依赖的在其他包中的对象
Export记录了对其依赖的其他包中的对象。
当Unreal对一个包进行装载的时候,还需要载入依赖树上的所有包。我们也把这种依赖称为强引用(Hard Dependency)。
也有一些依赖的对象不需要提前载入,我们把这种对象称为弱引用(Soft Dependencies)。软依赖的对象可以后期通过在代码中手动载入。
Derived Data Cache
有的对象比如Texture在不同的平台上有不同的压缩格式,因此在烘培的过程中,需要针对特定的平台生成特定的数据,这种数据被称为"Derived Data"。又因为生成"Derived Data"的过程通常需要比较长的时间,Unreal引入了特定数据缓存(Derived Data Cache)。
Derived Data Cache就是一个在工作室中共享的资源仓库,其中保存了各种版本的资源文件在不同平台上对应的Derived Data。这样当工作室有同事进行烘培的时候,Unreal会去设置的Derived Data Cache中去找是否有人已经生成过该文件了,如果没有的话再生成该文件,这样就减少了重复生成的过程,提高了烘培的效率。
Save Package
烘培中保存包的机制其实和在Editor中保存资源的机制相同。唯一的区别就是保存包时的参数设置和要保存的文件路径。也可以通过在代码中修改UPROPERTIES或者重写Serialize函数来为不同的资源类型定制化不同的保存流程。
同时,Unreal中还默认所有定义在#if EDITOR_ONLY_DATA 的属性都不会在烘培的过程中被保存。
从命令行烘焙内容
要为游戏烘焙数据,需要使用Cook commandlet。
基本烘焙通过以下命令执行:
UE4Editor.exe <GameName or uproject> -run=cook -targetplatform=<Plat1>+<Plat2> [-cookonthefly] [-iterate] [-map=<Map1>+<Map2>]
UE4Editor-Cmd.exe <GameName> -run=cook -targetplatform=<Plat1>+<Plat2> [-cookonthefly] [-iterate] [-map=<Map1>+<Map2>]
该commandlet必须通过`-run=cook`指定,还必须指定要烘焙的平台。该命令会为指定的平台生成数据, 并将数据保存在以下位置:
<Game>/Saved/Sandboxes/Cooked-<Platform>
选项
-targetplatform=<Plat1>+<Plat2> | 指定要烘焙的平台。可用平台列表包含WindowsNoEditor、WindowsServer、LinuxServer、PS4, XboxOne、IOS和Android。 |
-iterate | 指定烘焙器仅烘焙过时项目。如果不指定该选项,则沙箱目录将被删除,所有内容将重新烘焙。 |
-Map=<Map1>+<Map2>+... | 指定要构建的贴图。 |
-cookonthefly | 指定以服务器模式启动烘焙器。这样将启动服务器,服务器将等待游戏连接,然后根据需要提供烘焙的数据。使用该选项时,游戏需要在其命令行上指定-filehostip=<Server IP>以便能够连接服务器。 |
-MapIniSection=<ini file section> | 指定ini文件中包含贴图名称的分段。烘焙器将烘焙指定分段中指定的所有贴图。 |
-UnVersioned | 保存所有烘焙的数据包,不含版本。然后这些数据包在加载时会被假定为最新版本。 |
-CookAll | 烘焙所有内容。 |
-Compressed | 告知烘焙器压缩烘焙过的数据包。 |