当前位置: 首页 > news >正文

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文件

在这里插入图片描述

增量打包主要流程

  1. 基于当前输入的打包信息,计算Hash值

  2. 如果之前存在.manifest文件,就对比AssetFileHashTypeTreeHash,如果都一致,则不需要重新打AB。

    • ForceRebuildAssetBundle 可以强制重打所有AB

    • 或者直接删掉对应.manifest来针对性重打AB

  3. 重打的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

不同机器或路径产生差异可能性

  1. 官方表示:https://forum.unity.com/threads/about-incremental-build-and-asset-bundle-hashes.1436032/#:~:text=Finally%2C%20you%20mention,script%20or%20package.

    • 可能是脚本处理不确定性内容导致差异,可以使用UnityDataTools来打包,用Visual Diff工具对比差异。
  2. 换行符(LF、CRLF)会导致MD4\MD5计算有差异,git可以设置默认两种不同换行,导致不同工程同个文件会产生差异。
    在这里插入图片描述

  3. 可能依赖了绝对路径做一些计算。
    在这里插入图片描述

  4. 不同机器可能收集依赖代码程序集顺序有差异。比如下图同个.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

http://www.lryc.cn/news/536530.html

相关文章:

  • 嵌入式八股文面试题(二)C语言算法
  • 尚硅谷爬虫note005
  • xml 和json互转工具
  • ElementUI 抽屉组件高度封装
  • 深入解析:如何在C#和C/C++之间安全高效地通过P/Invoke传递多维数组
  • 轻量级在线ETL数据集成工具架构设计与技术实现深度剖析
  • 二、k8s项目的生命周期
  • GPT 系列模型发展史:从 GPT 到 ChatGPT 的演进与技术细节
  • C#语言的云计算
  • 金仓数据库-KingbaseES-学习-01-单机部署(非图形化安装)
  • 海外服务器都有什么作用?
  • git bash在github的库中上传或更新本地文件
  • vue2中 computed 计算属性
  • 自定义基座实时采集uniapp日志
  • 基于YALMIP和cplex工具箱的微电网最优调度算法matlab仿真
  • Effective Objective-C 2.0 读书笔记——内存管理(上)
  • 蓝桥杯-洛谷刷题-day5(C++)(为未完成)
  • conda 修复 libstdc++.so.6: version `GLIBCXX_3.4.30‘ not found 简便方法
  • 数据结构之队列,哈希表
  • 讯方·智汇云校华为授权培训机构的介绍
  • 【16届蓝桥杯寒假刷题营】第1期DAY4
  • 【Linux】cron计划任务定时执行命令
  • rdian是一个结构体,pdian=^Rdian,list泛型做什么用?
  • 【05】RUST错误处理
  • WinForm 防破解、反编译设计文档
  • 1 推荐系统概述
  • Redis初阶笔记
  • electron.vite 项目创建以及better-sqlite3数据库使用
  • 【新品解读】AI 应用场景全覆盖!解码超高端 VU+ FPGA 开发平台 AXVU13F
  • Proxmox VE 8.3 qm 方式导入ESXi Linux OVA UEFI模式虚拟机