问答 AssetBundle 如何计算可靠的 Hash 值

侑虎科技 · 2020年05月26日 · 959 次阅读

1)AssetBundle 如何计算可靠的 Hash 值
2)升级后的物理开销问题
3)UWA GOT 支持 iOS 后无法出包问题
4)如何释放 Live2D new 的 Mesh
5)雾效 Fog 在手机上失效的问题


UWA 问答社区:answer.uwa4d.com
UWA QQ 群 2:793972859(原群已满员)

AssetBundle

Q:项目之前是使用建置出来的 AssetBundle 档案,自己算 MD5 当作用户端更新比对项目。但因为 AssetBundle 建置的不稳定性,常常 Asset 没有改变但是 AssetBundle 变了,导致用户端下载到不必要的 AssetBundle。所以后来开始试着从 Asset 算一个 Version Hash 值。目前引入的参数有:

  • AssetBundleName
  • 有依赖但不在这个 AssetBundleName 下的 Asset 的路径与其 AssetBundleName (跨 AssetBundle 引用实验出来是看 AssetBundleName,当有依赖的 Asset AssetBundleName 改变则必须替换 AssetBundle 否则依赖加载会失效)
  • 所有这个 AssetBundleName 下 Asset 档案的 MD5
  • 所有这个 AssetBundleName 下 Asset 档案的.meta 的 MD5
  • 所有跟这个 AssetBundleName 下的 Sprite 共用同一个 Atlas,但不在这个 AssetBundle 的 Sprite Asset 与其.meta 的 MD5

但是这个方案实际应用还是有很多问题:

  • Version Hash 计算很久(有想过直接重复利用 Unity AssetDatabase 里的 Hash128,但是貌似很多人都遇到 Hash128 也不稳定的问题)
  • AssetBundleName 如果在建置时修改则不一定会写到.meta,造成.meta 的档案 MD5 是错的。除非 Reimport,但是 Reimport 就会造成建置时间暴涨(如果是把 AssetBundleName commit 进 Repo 建置时不设定,则有可能有忘记 commit 的问题)
  • ScriptableObject .asset 没有 commit 却在 Build machine 自行变化,有的时候是 SerializeFile 触发升级 Migration(但是升级时间点非常谜,有时候本地用相同版本 Reimport All 也不升级,在 Build machine 却又有升级),有的时候是清单项目顺序调换

感觉自己 Version Hash 好像也没有完全解决问题又造成建置时间增加,所以想问在运营大项目的大佬们有什么建议,谢谢。

A1:个人还是投票给构建完毕之后的 AssetBundle 的 Hash 值。

一方面担心自己构建的不能覆盖所有更改的情况(题主考虑的已经挺全面),另外一方面是.meta 文件本身就不是为构建唯一性设计的,比如它混合了各个平台的参数,任何一个平台的参数修改都会导致其内容的更改,因此我们必须参考 meta,而它的修改又不一定意味着资源的修改,这样就很尴尬。

在这个前提下,可以做的事情是尽量发现和解决资源相同但是 AssetBundle 的文件 Hash 值却不同的情况。
感谢贾伟昊@UWA问答社区提供了回答

A2:我们是这样做的:
AssetBundleHash 结合 AssetFileHash,在 Bundle 对应的 manifest 文件中可以取到 AssetFileHash 值。

ManifestFileVersion: 0
CRC: 3889896754
Hashes:
  AssetFileHash:
    serializedVersion: 2
    Hash: 7a90127ef724ff63cb40874dc69929b8
  TypeTreeHash:
    serializedVersion: 2
    Hash: 0d46a8251e1e96cd839078edaf4c28a3

对于 AssetBundleHash 不同但 AssetFileHash 相同的,按未变化处理。

感谢 littlesome@UWA 问答社区提供了回答


Physics

Q:一个项目场景里只有静态碰撞盒, 用于玩家点击选中。Unity 5.6 之前,物理开销基本没有。 升级到 Unity 2018 后,分析报告里的物理开销 2ms 不到,虽然不多,但是很奇怪。

后来发现 Project Settings 里把 Physics.autoSimulation 关了之后开销就下去很多了, Physics2D.autoSimulation 关了之后会再下去了一点点。这个参数好像是 Unity 2017 之后新加的参数。

看介绍,关了这个参数之后每次 LateUpdate 的时间里就不会自动处理物理方面的计算, 可以手动调用 Physics.Simulate 来手动控制物理计算。

A:物理系统不会自己去运行了。在 5.4~2017.2 版本中,Unity 引擎可以根据你们项目中 Rigidbody 的使用情况来自己决定是否开启物理引擎,如果没有使用,则它会自动关闭。但是,在 2017.4 版本以后,物理引擎会自动开启,Unity 引擎推出 API 由开发团队自己去控制是否开启和关闭。所以,一般在最新的版本中,UWA 都建议大家看看你们的物理模块开销,是否在自动空转,如果耗时较高,则可以尝试自己去关闭 Auto Simulation 选项。

但是,需要说明的是,如果场景中含有 Trigger、布料模拟等,则关闭 Auto Simulation 后则不起作用了,这个时候研发团队需要根据自身情况来决定该选项的开启和关闭。

该回答由 UWA 提供


SDK

Q:最近有看到UWA GOT 工具新增了 iOS 版本的支持,于是下载了最新的工具包进行了接入测试。是按照文档直接将 UWA_GOTv2.0.1_iOS.unitypackage 导入进了 Unity 项目内,并且做了配置。

但是发现添加了 UWA GOT 插件以后 iOS 上不能正常出包,总是卡在 xcodebuild archive 这一步,报错信息如下:

** ARCHIVE FAILED **


The following build commands failed:
  Check dependencies

我们打的是 Distribution 包,是否跟这个有关系?已经确认就是添加了 UWA_GOT 插件以后引起无法打包的问题,因为在移除了 SDK 以后可以顺利出包了,麻烦各位前辈帮忙解答下。
(版本:Unity 2018.3.4f1)

A:目前已经解决,是被上面的报错信息混淆了视听。

之前因为打包环境比较复杂,有的时候不能得到真正的报错位置,而且同时还要不停地有出包任务,不好做调试。所以今天单独在一台纯净的 Mac 上面模拟了打包环境,并接入 UWA GOT 的 iOS 版 SDK,测试了以后有以下发现:
1、导出 xcode 工程并且在 xcode 中直接 build 不会报错。
2、导出 xode 工程,然后在 xcode 中执行 Build Archive 会报错。

报错信息类似于下面这样:

ld: bitcode bundle could not be generated because
 '/xx/libuwa.a' was built without full bitcode. All object files and libraries for bitcode must be generated from Xcode Archive or Install build for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这样就比较好解决了,原因是如果一个工程里面有静态库的引用,那么所有的静态库也需要打开 Bitcode 后重新编译。这一切在直接 Build 的时候都没有问题,但是在 “Archive” 的时候就会报错。

我们在出 iOS 包的流程是先 Build Archive 然后在 export Archive 导出 ipa,因此就会出现问题了。

解决方法比较简单,我是直接在执行 xcodebuild 命令的时候把 EnableBitcode 设置为 NO 了,类似于下面的命令:

xcodebuild -target <your target> -configuration <your configuration> **ENABLE_BITCODE=NO**

看网上还有一种解决办法是不关闭 bitcode,然后在执行 xcode build 命令的时候带上参数。

OTHER_CFLAGS="-fembed-bitcode"

后面这种没有试过不知是否奏效,希望可以帮助到大家。

感谢题主马三小伙儿@UWA问答社区提供了回答


Loading

Q:项目用的 Live2D,创建后其框架会动态 new 大量 Mesh,想求教下除了用 Resources.UnloadUnusedAssets() 接口外,有没有方法能指定只释放这部分 Mesh?

A:Live2D 有两个大坑:
(1)CubismRenderer 初始化 new Mesh[2],并没有销毁代码

代码修改如下:

(2)MeshRenderer.material 实例化独立材质

代码修改如下,运行时还需要把所有 MeshRender 的材质设置成同一个材质:

感谢晨星@UWA问答社区提供了回答


Rendering

Q:在 PC 上面,整个场景中有雾效,单独对这个场景打包 AssetBundle,那么在手机上面没有雾效。如果是直接将该场景丢在 Hierarchy 上 build,在手机上面可以看见雾效。请教下,这个是哪里出了问题?都是在同样的手机上面测试的。

A:可能是 graphics 里的雾选项没勾 Shader 裁剪了。

感谢关@UWA问答社区提供了回答


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在 UWA 问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之 “石”,也能攻你之 “玉”。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册