Unity 增量打包AssetBundle
背景
- 打包太慢了,想要没改动的资源不重新打包浪费时间。
来源
-
官方文章:https://forum.unity.com/threads/about-incremental-build-and-asset-bundle-hashes.1436032/
-
官网AB介绍:https://learn.unity.com/tutorial/assets-resources-and-assetbundles
-
Unity源码部分:BuildAssetBundle.cpp
.manifest文件

增量打包主要流程
-
基于当前输入的打包信息,计算Hash值
-
如果之前存在
.manifest文件,就对比AssetFileHash和TypeTreeHash,如果都一致,则不需要重新打AB。-
ForceRebuildAssetBundle 可以强制重打所有AB
-
或者直接删掉对应
.manifest来针对性重打AB
-
-
重打的AB会重新创建
.manifest文件,反之跳过的AB不会刷新AB和.manifest文件。
Hash的计算内容
AssetFileHash
-
构建平台
-
包含的资源、meta文件信息
-
依赖的AB的名字(不包含绝对路径)
-
网格配置
-
打包配置
-
场景光照配置
-
Shader平台、图形API
TypeTreeHash
-
类名
-
命名空间
-
程序集
源码部分
BuildAssetBundle.cpp
-
CRC:实际打出来AB压缩包的校验码
- BuildAssetBundleArchiveFile
-
CalculateAssetBundlesToBeBuilt
-
AssetBundleHashesEqual
-
AssetFileHash:平台、meta文件、依赖资源、shader管线等
- BuildAssetBundle.AssetBundleHashesEqual
-
TypeTreeHash:代码名称、命名空间、程序集等,相同类型但不同顺序也会影响md4计算
-
BuildAssetBundleHelper.CalculateClassCompatibilityHash
- md4_update :https://codebrowser.dev/qt5/qtbase/src/3rdparty/md4/md4.cpp.html
-
-
-
-
WriteAssetBundleManifestFile:只有打的ab才会重写manifest,跳过的AB不会刷新
- Dependencies:outputPath + ABName
不同机器或路径产生差异可能性
-
官方表示:https://forum.unity.com/threads/about-incremental-build-and-asset-bundle-hashes.1436032/#:~:text=Finally%2C%20you%20mention,script%20or%20package.
- 可能是脚本处理不确定性内容导致差异,可以使用
UnityDataTools来打包,用Visual Diff工具对比差异。
- 可能是脚本处理不确定性内容导致差异,可以使用
-
换行符(LF、CRLF)会导致MD4\MD5计算有差异,git可以设置默认两种不同换行,导致不同工程同个文件会产生差异。

-
可能依赖了绝对路径做一些计算。

-
不同机器可能收集依赖代码程序集顺序有差异。比如下图同个
.manifest文件,在不同机器上,依赖的类是一样的,但顺序不一致,导致计算TypeTreeHash的MD4不一致。

测试耗时
-
在机器只打一个包的环境下,30193个ab,刷新两次增量缓存,第二次打AB时间只要近两分钟。

-
可以通过全局搜索日志文本
Bundle Name:,来观察这次打了哪些AB:

其他
使用BuildReport工具
-
https://forum.unity.com/threads/about-incremental-build-and-asset-bundle-hashes.1436032/#:~:text=%C2%A0%20%C2%A0%20public%20void-,DetectBuildResults,-()
-
可以统计打包过程耗时,每个ab耗时等
多个unity进程打AB
- https://github.com/jiangzhhhh/Unity-MultiProcess-BuildPipeline
SBP 的增量
-
https://docs.unity3d.com/Packages/com.unity.scriptablebuildpipeline@2.1/manual/UpgradeGuide.html#:~:text=Incremental%20Building
-
看BuildCache.cs
相关文章:
Unity 增量打包AssetBundle
背景 打包太慢了,想要没改动的资源不重新打包浪费时间。 来源 官方文章:https://forum.unity.com/threads/about-incremental-build-and-asset-bundle-hashes.1436032/ 官网AB介绍:https://learn.unity.com/tutorial/assets-resources-and…...
嵌入式八股文面试题(二)C语言算法
相关概念请查看文章:C语言概念。 1. 如何实现一个简单的内存池? 简单实现: #include <stdio.h> #include <stdlib.h>//内存块 typedef struct MemoryBlock {void *data; // 内存块起始地址struct MemoryBlock *next; // 下一个内…...
尚硅谷爬虫note005
一、编解码 1.get请求的quote方法 将汉字转为Unicode字符 # _*_ coding : utf-8 _*_ # Time : 2025/2/12 16:33 # Author : 20250206-里奥 # File : demo19_get请求的quote方法 # Project : PythonProject10-14# 景甜page # https://www.baidu.com/s?ieutf-8&f8&rsv…...
xml 和json互转工具
工具1 有个问题会导致springboot返回捕获的异常编程xml格式 import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import org.json.JSONObject; import org.json.XML; import org.w3c.dom.Document;import javax.xm…...
ElementUI 抽屉组件高度封装
在前端开发中,ElementUI 的el-drawer组件虽实用,但为满足复杂业务需求,如统一样式、特定交互和灵活使用,常需二次封装。下面将带你实现一个高度封装的 ElementUI 抽屉组件。 创建基础封装组件 创建MyDrawer.vue,引入e…...
深入解析:如何在C#和C/C++之间安全高效地通过P/Invoke传递多维数组
在工业控制、机器人编程和物联网等领域,我们经常需要让C#这样的托管语言与C/C编写的底层库进行交互。在这个过程中,遇到需要传递多维数组的场景时,许多开发者会意外遭遇System.Runtime.InteropServices.MarshalDirectiveException异常。本文将…...
轻量级在线ETL数据集成工具架构设计与技术实现深度剖析
在当今数字化时代,企业面临着海量异构数据的整合挑战。ETL(Extract, Transform, Load)工具作为数据集成的核心,负责将分散在不同数据源中的数据进行抽取、转换和加载,以构建统一的数据视图。本文将深入剖析一款基于诺依框架开发的在线ETL数据集成工具,重点阐述其架构设计…...
二、k8s项目的生命周期
项目的生命周期 创建-----------》发布-----------》更新--------》回滚----------》删除 kubectl create deployment nginx1 --imagenginx:1.22 --replicas3 基于deployment控制器创建pod 控制器的名称是nginx1 pod使用的镜像:nginx:1.22 --replicas3 pod的数量有多少 3个…...
GPT 系列模型发展史:从 GPT 到 ChatGPT 的演进与技术细节
从 GPT 到 ChatGPT,OpenAI 用短短几年时间,彻底改变了自然语言处理(NLP)的格局。让我们一起回顾这段激动人心的技术演进史!🚀 🔹 GPT(2018): 划时代的起点&a…...
C#语言的云计算
C#语言在云计算中的应用 引言 随着信息技术的飞速发展,云计算已经成为了现代计算架构的重要组成部分。传统的本地计算方式逐渐被云计算所取代,使得企业与开发者能够更高效地处理数据、部署应用程序以及进行资源管理。在众多编程语言中,C#以…...
金仓数据库-KingbaseES-学习-01-单机部署(非图形化安装)
目录 一、环境信息 二、介绍 三、下载地址 四、安装步骤 1、配置内核参数 (1)文件系统相关 (2)共享内存与信号量(IPC) (3)网络与端口配置 (4)关键场…...
海外服务器都有什么作用?
海外服务器具体就是指部署在中国大陆以外地区的服务器,企业选择租用海外服务器能够显著提高不同国家和地区用户的访问速度,当网站的服务器部署在目标用户所在地附近时,数据信息所传输的距离就会缩短,大大降低了网络访问的延迟度&a…...
git bash在github的库中上传或更新本地文件
一、将本地文件上传到 GitHub 仓库 1. 创建 GitHub 仓库 如果你还没有在 GitHub 上创建仓库,首先需要创建一个新的仓库: 登录到 GitHub。点击右上角的 按钮,选择 New repository。给你的仓库起个名字,并选择 Public 或 Privat…...
vue2中 computed 计算属性
文章目录 vue2中 computed 计算属性1. 什么是计算属性?2. 基本用法1. 定义计算属性2. 计算属性的缓存特性 3. 计算属性的高级用法1. 计算属性的 Getter 和 Setter 方法2. 计算属性的依赖追踪 4. 计算属性与方法的区别5. 实际应用案例1. 格式化数据2. 计算总价3. 动态…...
自定义基座实时采集uniapp日志
自定义基座实时采集uniapp日志 打测试包给远端现场(测试/客户)实际测试时也能实时看到日志了,也有代码行数显示。 流程设计 #mermaid-svg-1I5W9r1DU4xUsaTF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid…...
基于YALMIP和cplex工具箱的微电网最优调度算法matlab仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 系统建模 4.2 YALMIP工具箱 4.3 CPLEX工具箱 5.完整工程文件 1.课题概述 基于YALMIP和cplex工具箱的微电网最优调度算法matlab仿真。通过YALMIP和cplex这两个工具箱,完成微电网的最优调…...
Effective Objective-C 2.0 读书笔记——内存管理(上)
Effective Objective-C 2.0 读书笔记——内存管理(上) 文章目录 Effective Objective-C 2.0 读书笔记——内存管理(上)引用计数属性存取方法中的内存管理autorelease保留环 ARCARC必须遵循的方法命名原则ARC 的自动优化࿱…...
蓝桥杯-洛谷刷题-day5(C++)(为未完成)
1.P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布 i.题目 ii.代码 #include <iostream> #include <string> using namespace std;int N, Na, Nb; //0-"剪刀", 1-"石头", 2-"布", 3-"蜥", 4-"斯"࿱…...
conda 修复 libstdc++.so.6: version `GLIBCXX_3.4.30‘ not found 简便方法
ImportError: /data/home/hum/anaconda3/envs/ipc/bin/../lib/libstdc.so.6: version GLIBCXX_3.4.30 not found (required by /home/hum/anaconda3/envs/ipc/lib/python3.11/site-packages/paddle/base/libpaddle.so) 1. 检查版本 strings /data/home/hum/anaconda3/envs/ipc/…...
数据结构之队列,哈希表
一 队列(先进先出) 1.定义:从一端进行数据插入,另一端进行删除的线性存储结构 队列类型 常见操作 - 入队(Enqueue):将新元素添加到队列的尾部。若队列有空间,新元素会成为队列的新尾部元素;若…...
3步完成PlayCover多语言界面配置:从零到精通的全栈指南
3步完成PlayCover多语言界面配置:从零到精通的全栈指南 【免费下载链接】PlayCover Community fork of PlayCover 项目地址: https://gitcode.com/gh_mirrors/pl/PlayCover PlayCover作为iOS应用兼容性工具,其多语言界面支持让全球用户都能获得本…...
Adobe-GenP:探索Adobe全家桶功能解锁的智能解决方案
Adobe-GenP:探索Adobe全家桶功能解锁的智能解决方案 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP是一款专为Adobe Creative Cloud用户设计…...
通过审计日志追溯团队内每个API Key的详细使用记录
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过审计日志追溯团队内每个API Key的详细使用记录 在团队协作使用大模型API时,一个常见的管理难题是:如何…...
CANN算子库幂运算API文档
aclnnPowTensorScalar&aclnnInplacePowTensorScalar 【免费下载链接】ops-math 本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-math 📄 查看源码 产品支持情况 产品是否支持A…...
OpenMCP:一站式MCP开发调试套件,从调试到部署的完整解决方案
1. 项目概述:OpenMCP,一个为MCP开发者打造的“瑞士军刀”如果你正在或打算开发基于Model Context Protocol(MCP)的AI应用,那你一定遇到过这样的困境:好不容易写好了MCP Server,却不知道如何高效…...
基于Neo4j与G6构建技能图谱:从图数据库原理到开源项目实战
1. 项目概述:一个技能图谱的构建与探索工具最近在整理个人知识体系时,我一直在寻找一个能帮我将零散技能点串联起来,形成可视化“技能树”的工具。市面上很多笔记软件要么太重,要么太轻,要么就是纯粹的文档管理&#x…...
DBeaver驱动管理进阶:从手动维护到自动化脚本的优雅实践
DBeaver驱动管理进阶:从手动维护到自动化脚本的优雅实践 在数据库开发领域,DBeaver凭借其强大的跨数据库支持和开源特性,已成为众多开发者的首选工具。然而,随着团队规模扩大和项目复杂度提升,驱动管理这一看似简单的任…...
SITS2026到底是什么?3类企业已紧急升级AI部署栈,第4类正在掉队(附Gartner未公开验证数据)
更多请点击: https://intelliparadigm.com 第一章:SITS2026的定义与演进逻辑 SITS2026(Semantic Integration and Trustable Systems 2026)是新一代面向语义互操作与可信协同的系统架构规范,由国际开放系统联盟&…...
在Taotoken模型广场根据任务需求挑选合适模型的实践心得
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Taotoken模型广场根据任务需求挑选合适模型的实践心得 作为一名开发者,在构建应用时,选择合适的模型是项…...
Java——继承实现的基本原理
继承实现的基本原理1、示例2、类加载过程3、对象创建的过程4、方法调用的过程5、变量访问的过程6、继承是把双刃剑6.1、继承破坏封装6.2、封装是如何被破坏的6.3、继承没有反映is-a关系6.4、如何应对继承的双面性1、示例 Base类: public class Base {public stati…...
