https://api.unrealengine.com/udk/Three/ContentCooking.html
https://gameinstitute.qq.com/community/detail/112526
1. 概述
cook的过程就是将content转化为平台能使用的格式, 只有cook了的数据能在 xbox360 和 ps3 上运行。
pc上可以不用 cook 的数据,但是使用 cook 数据会加载更快。
cook 工具其实就是一条 命令行,可以直接调用进行 cook
也可以使用 Unreal Frontend tool 可以自动执行 cook 命令行。
Cooked过的packages保存在 XXXGame\CookedYYY
XXX 游戏名字
YYY 平台名字 比如 CookedPC
2.cook做的事:
1) 去掉不必要的数据,减小文件大小。比如editor only data。
2) Byte-swappping数据使之可以被big-endian架构读取
3) 使一些资源可以以他们的nativeformat保存,可以直接读取不需要更多的处理。
4) 创建 SeekfreePackage,self-contained packages,获得最优的loading时间
SeekFreePackage 表示可以动态被任意 level 读取的 standalone seekfree package
可以设置一些包为cook为seekfree包。否则在对于外部包加载是阻塞加载,会引发卡顿。
3.命令行执行cook
比如执行下面这个命令:
.\Binaries\Win32\XXXGame.exe CookPackages -platform=pc -log -Processes=1 -multilanguagecook=int+chn -EnableWriteEncrypted
参数含义:
-platform=pc
pc - cook PC with editor support
pcserver - cook PC for dedicated server (no editor support, lots of data stripped)
pcconsole - cook PC like console (no editor support, extraneous data stripped)
ps3, xbox360, xenon - console platforms
tegra, iphone - mobile platforms
-Processes=1
Uses N processes in a multithreaded cook
在多线程cook中使用几个进程
-multilanguagecook=int+chn
英语和中文, -LANG3 前面加个-代表的是 只 cook text
multilanguagecook= <LANG1<+LANG2<-LANG3...>>>
-EnableWriteEncrypted
另外还有:
-full : 全部package都重新 cook (所有 cooked packages 都先删除)
-recookseekfree : maps startup script以及 standlone seekfree packages 都会重新cook
4.配置文件设置package的cook属性
cook的文件列表 哪里设置
加载packages的顺序由命令行和ini配置文件(DefaultEngine.ini)决定
1) [Engine.PackagesToAlwaysCook]
+Package=map名字 ——表示你确定需要cooked的package
+SeekFreePackage=seekfree packages名字——表示cook成 seekfreepackage
[Engine.PackagesToAlwaysCook]
+Package=XXXEntry
cook工作初始化的时候 会从这里得到AlwaysCookPackages(不包括SeekFreePackage),并做出分类,分别放入不同的列表
1.TokenMaps(地图包)
2.TokenScriptPackages(Script包)
3.TokenContentPackages(资源包)
TArray<FString> TokenMaps;
TArray<FString> TokenScriptPackages;
TArray<FString> TokenContentPackages;
后续可以看下代码如何分类的。
2)[Engine.StartupPackages]
表示被所有level使用的数据,会放到startuppackage,启动被读取,会一直放在内存中
【 startup.upk ? 】
所以这些 package 里面不要放没有必要的 objects, 避免增加不必要的开销。
这些 package 里面的 objects 不会再被 cook 到其他 package 里面了。
bSerializeStartupPackagesFromMemory=TRUE
什么时候用上面的参数:When you have enough memory that you are able to allocate these large additional chunks of memory, and you want to be able to boot up faste
bFullyCompressStartupPackages=True
什么时候用上面的参数:Enables full-package compression of startup packages. These can be async decompressed in a single operation during load time.
例子:
[Engine.StartupPackages]
bSerializeStartupPackagesFromMemory=TRUE——
bFullyCompressStartupPackages=FALSE
Package=EngineMaterials
Package=EngineDebugMaterials
Package=EngineSounds
Package=EngineFonts
Package=SoundClassesAndModes
Package=JoshContent
Package=SFXCueFight
Package=Expolsion
Package=Fire
3)[Core.System] SeekFreePCPaths
在 PC平台 cooked 的时候使用
保留CookedPC目录中的扩展和相对目录结构
[Core.System]
SeekFreePCPaths=..\..\XXXGame\CookedPC
5.Cooked Packages 分类
1. 脚本包scriptpackages :
【seekfree】
一直加载的 启动时会首先被加载 比如 core.u engine.u
By cooking, all directly-referenced (using ' instead of " around their names) content (textures, meshes, etc.) are pulled into the package.
【是说所有直接被脚本引用的其他资源 都会被打进包里面的吗 .u 】
2. 启动包startuppackages:
通常,这些包里面的objects 没有被 脚本 和 map 直接引用, 所以他们需要单独cook 和 加载。
哪些包是启动包,在下面这个section中定义。
[Engine.StartupPackages]
3. 地图包map:
【seekfree】
map 和 map 所包含的内容,除了uc脚本。
如果两个map引用了同一个资源,那么这个资源会被cook进两个包中。也就是增加了一下包的大小。
如果同时加载这两个level,那么当检测到内存中已经有了这个资源,不会再次加载的。
在切换level的时候完全加载包。
4.Texture packages:
Description: Packages that contain high-level mip data for texture streaming. During cooking, all but the high-level mips are removed from the package.
Loading: These are never loaded as a package, they are only used for streaming textures (whose low-level mips are in a cooked package).
5.以下这些懒得看了。待看
https://api.unrealengine.com/udk/Three/ContentCooking.html
中的
Usage
Output
PC and Cooking
Non-seekfree packages (when NOT using .tfc):
Seekfree packages (script, startup, maps)
Standalone seekfree packages(可以被任意level读取的)
https://gameinstitute.qq.com/community/detail/112526
中的cook流程,到时候有空结合看看代码看吧
cook流程:
1.cook init——cook初始化工作
1. 读取命令行参数,看是否有-full 参数,是否进行全量cook
2. 读取 GlobalPersistentCookerData.upk ,检查资源包Version,如Version有变强制执行FullReCook。
没有 GlobalPersistentCookerData.upk 也强制执行FullReCook
3. 对NativeScript包处理
a.加载所有 NativeScriptPackages ,且所有包内object AddToRoot。
b.为 所有Native包对象以及Native包的LinkerLoad对象 设置Flag(RF_MarkedByCooker),打上此Flag的对象不Cook进Seekfree包
c.创建得到GuidCache:保存每个对象唯一的GUID信息,服务器和客户端通过这个其保证双方资源一致
d.创建Container helperPersistentCookerData,用于跟踪Bulk data数据(如贴图的MipData数据)
2.generatePackagelist——生成需要cook的文件列表
a、需要了解若干重要Package列表
b、分析Package是否需要重新Cook,要经过2个Pass
c、分析流程
3.cookpackage流程——cook每个资源包,然后输出到cooked目录下
a、首选需要了解若干包重要属性:
b、Cook之前先执行一次CollectGarbageAndVerify确保环境干净。
a、LoadPackageForCooking,加载并反返回需要Cook的包,并设置PKG_Cooked标记(避免重复Cook)
b、遍历包内所有设置RF_ForceTagExp的对象和包内对象执行CookObject,核心代码
c、遍历所有设置RF_ForceTagExp的对象和包内对象执行PrepareForSaving流程:
d、SaveCookedPackage