UE3 Cook

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...>>>

扫描二维码关注公众号,回复: 10241740 查看本文章

-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

发布了104 篇原创文章 · 获赞 44 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/u012138730/article/details/99300202
今日推荐