返回「计算机、信息技术与工程」

Unity2018.4上材质对贴图的冗余引用是否可以不管?

更多
Markdown 结构化数据
本文目录 3 个章节

Unity2018.4上材质对贴图的冗余引用是否可以不管?

note · 我的 UWA 问答 本文收录我在 UWA 问答发表的公开回答。问题内容归原提问者;回答保留当时语境,技术结论可能受 Unity 版本、平台和项目条件限制。

问题

打包后使用AssetHunter插件分析发现有很多冗余引用,但是在游戏中使用Profiler却没有

打开材质文件发现保存了很多旧的贴图引用信息

image.png

如_CloudTex这个,是旧版本使用过的,新的Shader里都没有这个属性了

一般的查找引用的方法是找到所有关联的GUID,那就会找到这些旧的引用

但在手机上使用Profiler看内存时却没有相关引用的贴图被加载

所以是否是因为Unity打包时会自动把这些旧引用筛除?尽管在Editor上还是找得到这些冗余引用,是否可以不用理会?

  • 提问者:wenzhao
  • 提问时间:2021-05-21 04:49:52

我的回答

旧的Shader使用过的texture引用会被保留在序列化信息中,这是Unity有意的设计,为了避免编辑器下切换Shader再换回来时需要重新配置的麻烦。

而Unity在打包时确实会对材质进行深度检查,把当前Shader没有使用的texture依赖都去除,因此通常情况下打包旧的引用也不会导致包体变大。

但旧的引用在Editor下还存在一个问题,AssetDatabase.GetDependencies接口返回的引用会包括旧的引用,它不会进行深度检测来进行剔除。右键资源Select Dependencies调用的是这个接口,所以也会显示旧的引用,如下图:

image.png

pic2和pic3是当前Shader2没有引用的。

image.png

所以使用GetDependencies这个接口实现一些功能的话,可能由于旧引用导致意外的问题。解决方法是,使用EditorUtility.CollectDependencies这个接口可以返回剔除旧引用的结果。

此外,如果Mat和Pic1,Pic2,Pic3分配别单独打了一个AB包,那么打出的mat.manifest文件中会显示旧的Texture引用,这就是AssetBundle打包的一个不太合理的地方了,还没有调研新的Addressable系统是否做了改进。

image.png

  • 回答时间:2021-05-21 20:01:18
  • 最后更新:2021-05-21 20:01:18
  • 采纳状态:未采纳

来源与关系