UE5 增量 Cook

news/2025/9/19 13:21:44/文章来源:https://www.cnblogs.com/icewalnut/p/19100712

UE5 增量 Cook

UE 版本 5.5.4

  • 关键
    • -iterativecooking

添加了之后的 log 如下

image-20250815202658904

这部分 log 比较重要

cs 中

image-20250818120051662

image-20250818120010488

-iterativecooking 等同于 -iterate

数据结构

1. FAssetPackageData

image-20250815213552276

image-20250815213619730

简单来说根据 GetPackageSavedHash() 判断包是否修改

根据 DiskSize 判断包修改的状态

  • 状态

    image-20250815213816678

  • 包类型分类:

    • 包分为 已 Cook未 Cook占位包 (NeverCookPlaceholder)和 脚本包 Script
    • 每种类型有 Identical 相同Modified 修改Removed 删除 状态。

2. ICookedPackageWriter

2. FCookSavePackageContext 烘焙保存包上下文

对一个给定的平台,传递给 SavePackage 的上下文数据。

image-20250818142743787

实际上就是存储了

函数逻辑

1. LoadBeginCookIterativeFlags

image-20250815202936321

image-20250815202855644

image-20250815202805085

这里的 CookWorkerRequests 是在 COTFS 的 Intialize 函数中初始化的

image-20250815204603008

这个函数的目的也只是遍历传进来的 FBeginCookContext ,设置其中的 PlatformContext 的 相关 flag,如不是 FullBuild,允许 IterativeResults 等,以及

bPopulateMemoryResultsFromDiskResults 是否允许从磁盘的结果填充记忆结果。

2. PopulateCookedPackages

StartCookByTheBookLoadBeginCookIterativeFlags 结束之后,走到 BeginCookSandbox

image-20250815205226180

这里会根据 LoadBeginCookIterativeFlags 中指定的 bPopulateMemoryResultsFromDiskResults 执行后续逻辑,添加目标平台,执行 PopulateCookedPackages

image-20250815205342465

这是进行差异化判断的核心函数

image-20250815204801832

image-20250815214139990

ComputePackageDifferences 是另一个核心函数

3. ComputePackageDifferences

这个函数很长,但是逻辑是比较清晰的

前面先调用

image-20250815214717880

根据 FAssetPackageData 中的 Hash 值直接判断是否发生变化

image-20250815214912756

如果没有变化,就根据 DiskSize 进行状态的变更,添加到 OutDifference.Packages 数组中,记录状态

这里用 Mermaid 画一个流程图

graph TDA[Start ComputePackageDifferences] --> B[Initialize: Reserve OutDifference.Packages]B --> C[Loop through Current State's Packages]C --> D{Is Package in Previous State?}D -->|No| E[Skip: New Package, No Action]D -->|Yes| F[Check if Package is Unchanged]F -->|Yes| G{Is DiskSize < 0?}G -->|Yes| H{Is NeverCookPlaceholder?}H -->|Yes| I[Add to Packages: IdenticalNeverCookPlaceholder]H -->|No| J[Add to Packages: IdenticalUncooked]G -->|No| K{Is Script Package?}K -->|Yes| L[Add to Packages: IdenticalScript]K -->|No| M[Add to Packages: IdenticalCooked]F -->|No| N{Is DiskSize < 0?}N -->|Yes| O{Is NeverCookPlaceholder?}O -->|Yes| P[Add to Packages: ModifiedNeverCookPlaceholder]O -->|No| Q[Add to Packages: ModifiedUncooked]N -->|No| R{Is Script Package?}R -->|Yes| S[Add to Packages: ModifiedScript]R -->|No| T[Add to Packages: ModifiedCooked]E --> U[Loop through Previous State's Packages]U --> V{Is Package in Current State?}V -->|Yes| W[No Action: Already Processed]V -->|No| X{Is Generated Package?}X -->|Yes| Y{Is Generator in Current State?}Y -->|No| Z[Add to Packages: RemovedCooked]Y -->|Yes| AA[Add to GeneratorPackages]X -->|No| AB{Is DiskSize < 0?}AB -->|Yes| AC{Is NeverCookPlaceholder?}AC -->|Yes| AD[Add to Packages: RemovedNeverCookPlaceholder]AC -->|No| AE[Add to Packages: RemovedUncooked]AB -->|No| AF{Is Script Package?}AF -->|Yes| AG[Add to Packages: RemovedScript]AF -->|No| AH[Add to Packages: RemovedCooked]W --> AI[Loop through GeneratorPackages]AI --> AJ{Is Generator RemovedCooked?}AJ -->|Yes| AK[Mark All Generated Packages as RemovedCooked]AJ -->|No| AL[Keep GeneratorPackages Entry]AK --> AM{Check Options.bRecurseModifications?}AL --> AMAM -->|No| AN[End]AM -->|Yes| AO[Collect Modified Packages to VisitStack]AO --> AP[Loop through VisitStack]AP --> AQ{Stack Empty?}AQ -->|Yes| ANAQ -->|No| AR[Pop Package from VisitStack]AR --> AS[Get Referencers: Hard and Build Dependencies]AS --> AT[Loop through Referencers]AT --> AU{Is External Actor Package?}AU -->|Yes| AV{Refers to Modified Package's Map?}AV -->|Yes| AW[Skip Referencer]AV -->|No| AX{Already Visited?}AU -->|No| AXAX -->|Yes| AY[Skip Referencer]AX -->|No| AZ{Is Referencer in Packages?}AZ -->|No| BA[Skip Referencer]AZ -->|Yes| BB[Convert Identical to Modified]BB --> BC[Add Referencer to VisitStack]BC --> ATAW --> ATAY --> ATBA --> AT

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/907798.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oxygen Forensic Detective 18.0 发布,新增功能简介

Oxygen Forensic Detective 18.0 发布,新增功能简介Oxygen Forensic Detective 18 Windows Multilingual - 领先的一体化数字取证软件 digital forensic software 请访问原文链接:https://sysin.org/blog/oxygen-for…

Windows如何美化cmd窗口

一、下载Windows Terminal 方法一:Microsoft store搜索 方法二:GitHub 1、GitHub搜索Terminal,选择下图所示 2、下载双击安装 3、安装完毕后,启动效果如下:二、替换默认的cmd窗口 打开原来的cmd窗口,右键属性,选…

MX Round 7 解题报告

T1 其实条件就是 \(a_i-i \le a_j-j,i-b_i \le j-b_j\),因此我们记 \(x_i=a_i-i,y_i=i-b_i\)。 显然,同一个 \(x_i\) 的点都在一个连通块内,因为它们都可以被 \(y_i\) 最大的点连起来;依照这个思路,我们记 \(mx_i…

【数据库强大的系统Trip 第1站】总概

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【完整源码+数据集+部署教程】机器人足球场景分割环境: yolov8-seg-C2f-DCNV2

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

RenderPass与 SubPass 理论

一、 1.1 基础概念说明 RenderPass: 每次提交Draw call命令之后,到输出一张或多张图片结果,这个过程称为RenderPass,在Vulkan中可以创建其对象,主要描述了Pass当中的输入输出相关信息。 SubPass:存在很多渲染方式,…

信号处理相关

一、信噪比(SNR)计算​为什么要选”选波段都选择其附近的一个平坦区来计算其SNR“?不能直接计算每一个吸收波段的SNR吗? 这是一个非常棒的问题,直指光谱处理中的一个关键细节。您提出的“直接计算每一个吸收波段的…

k8s系列--组件说明

服务分类: 有状态服务:数据库DBMS,就是抽调到其他服务,再回来会有数据缺失的服务,数据需要持久化 无状态服务:LVS APACHE,docker更适用于无状态服务 pod控制器: 服务发现: 存储: 调度器: 准入控制(安全策略…

实用指南:售价3499美元,英伟达Jetson Thor实现机器人与物理世界的实时智能交互

实用指南:售价3499美元,英伟达Jetson Thor实现机器人与物理世界的实时智能交互2025-09-19 13:03 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overfl…

详细介绍:AWS WAF 防护敏感配置文件泄露完整指南

详细介绍:AWS WAF 防护敏感配置文件泄露完整指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

详细介绍:html让该元素忽略所有鼠标事件,例如点击、悬停、拖拽都无效。

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

梗棋

\(\mathtt{Master\_Xie}\) 发明了一个叫做「梗棋」的棋类游戏。

逻辑回归 vs 支持向量机 vs 随机森林:哪个更适合小数据集? - 指南

逻辑回归 vs 支持向量机 vs 随机森林:哪个更适合小数据集? - 指南2025-09-19 12:52 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !…

javax.imageio.IIOException: Cant create output stream! 解决方法 验证码出不来

javax.imageio.IIOException: Cant create output stream! 解决方法 验证码出不来百度其它帖子说设置temp权限,但我这边还是不行。 通过下面关闭缓存可以解决,如果不关就会向tomcat/temp/ 目录下写东西但好像写不了就…

【转载】在Vue3中引用Vue2组件

同事以为要重写,我用 8 行代码让 Vue3 跑起已打包的 Vue2 组件 - 前后端小能手的文章 - 知乎 https://zhuanlan.zhihu.com/p/1951345700597138301

JUC 学习笔记

并发与并行 并发:多个线程轮流使用CPU执行任务,将CPU的时间分割成合适大小的时间片,每一个线程拿到时间片之后就会利用CPU资源执行任务,当时间到了之后就会把CPU资源释放,并且保存线程的上下文,比如程序计数器,…

pytorch读书报告

PyTorch作为开源深度学习框架,以动态计算图、简洁API和强大生态深受开发者青睐。 通过学习相关资料,我了解到其核心优势在于“即插即用”的动态图机制——代码编写与调试时可实时修改计算流程,无需提前定义静态图,…

券多多系统-开发记录

项目整体分为后管模块、分发模块、引擎模块、结算模块。 后管模块:面向商家,负责优惠券的创建、以及目标用户的优惠券分发任务 分发模块:面向商家,负责执行百万级别优惠券的分发任务 引擎模块:面向用户,为用户提…

分布式 笔记

1、分布式锁的实现方式: 1、数据库 基于数据库表: 创建一张锁表:id、方法名称(唯一索引)、备注信息、参数信息(对应重载方法)、更新时间 锁住一个方法等价于往锁表里插入一行数据,通过方法名称字段的唯一性把其…

Windows Server 2019 中文版、英文版下载 (2025 年 9 月更新)

Windows Server 2019 中文版、英文版下载 (2025 年 9 月更新)Windows Server 2019 中文版、英文版下载 (2025 年 9 月更新) Windows Server 2019 x64 Version 1809 (updated Sep 2025) 请访问原文链接:https://sysin.…