前言

UE4引擎通过editor来创建和管理uasset,但是当游戏发布到不同的平台时需要根据平台转换为不同的格式。而这样的转换过程就叫作烘焙。

分为三个步骤

  1. 加载包至内存;
  2. 为包中的每个对象生成目标平台特定数据 (Derived Data);
  3. 把含有平台特定数据的包另存到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


告知烘焙器压缩烘焙过的数据包。