Unity2018.4上材质对贴图的冗余引用是否可以不管?
本文目录 3 个章节
Unity2018.4上材质对贴图的冗余引用是否可以不管?
note · 我的 UWA 问答 本文收录我在 UWA 问答发表的公开回答。问题内容归原提问者;回答保留当时语境,技术结论可能受 Unity 版本、平台和项目条件限制。
问题
打包后使用AssetHunter插件分析发现有很多冗余引用,但是在游戏中使用Profiler却没有
打开材质文件发现保存了很多旧的贴图引用信息

如_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调用的是这个接口,所以也会显示旧的引用,如下图:

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

所以使用GetDependencies这个接口实现一些功能的话,可能由于旧引用导致意外的问题。解决方法是,使用EditorUtility.CollectDependencies这个接口可以返回剔除旧引用的结果。
此外,如果Mat和Pic1,Pic2,Pic3分配别单独打了一个AB包,那么打出的mat.manifest文件中会显示旧的Texture引用,这就是AssetBundle打包的一个不太合理的地方了,还没有调研新的Addressable系统是否做了改进。

- 回答时间:2021-05-21 20:01:18
- 最后更新:2021-05-21 20:01:18
- 采纳状态:未采纳
来源与关系
- 上位集合:我的 UWA 问答
- UWA 标签:Shader、资源管理、渲染模块
- 原始问题:Unity2018.4上材质对贴图的冗余引用是否可以不管?
- 源页最后更新:2021-05-23 23:23:03