背景
- 打包太慢了,想要没改动的资源不重新打包浪费时间。
来源
-
官方文章: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