乐趣区

关于memory:Addressable-RemoteBuildPath下部分资源更新上传问题

1)Addressable RemoteBuildPath 下局部资源更新上传问题
​2)Shader 内存占用忽然变大
3)Unity 2018.4 上材质对贴图的冗余援用
4)编辑器中呈现大量 GC 操作导致卡顿
5)JsonUtility.ToJson 浮点型保留小数问题


这是第 251 篇 UWA 技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫 10 分钟,认真读完必有播种。

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

Addressable

Q:Addressable 设置好 RemoteBuildPath 门路后,Remote_Group(该 Group 下有多个资源包)下批改了一个资源包,Build->Update a previous build 完结后,RemoteBuildPath 门路下将 Remote_Group 的所有资源包都从新生成了一遍(将所有的资源包从该门路下删除,再执行时还是会全副生成)。因为要将 Remote_Group 下的资源包上传到服务器,只心愿上传产生扭转的 Remote 资源,不心愿反复上传所有的资源包,该怎么操作呢?

A:尽管全副从新生成,然而应该只有批改了的那份是不一样的,能够比照一下看看 hash 文件里记录的 hash 有没有变动。其实在服务器上间接都上传就行了,客户端会依据 hash 的不同下载变动了的 Bundle。这种模式能保障服务器上的是最新的,客户端不论哪个版本都只有下载差别 Bundle 就行了。

感激黄程 @UWA 问答社区提供了答复

A2:用了一个折中的方法,每次上传前计算已存在文件的 md5,新的文件和 md5 值发生变化的文件上传至服务器。

感激题主猴小样 2016@UWA 问答社区提供了答复

Memory

Q:我的项目 Unity 版本升级后,Shader 内存占用变为原先的 100 倍,请问是什么起因导致的?

A:这个应该是因为 Unity 2019.4.20 这个版本当前批改了 Shader 内存占用的统计形式。Unity 这样改,不便大家间接看到是哪个 Shader 占用高,从而更好地定位问题。

能够看到在版本升级后,Shader 占用 120 多 MB,ShaderLab 变成了 92KB。


2019.4.20f1 Release Notes

感激芭妮妮 @UWA 问答社区提供了答复

Material

Q:打包后应用 AssetHunter 插件剖析发现有很多冗余援用,然而在游戏中应用 Profiler 却没有。

关上材质文件发现保留了很多旧的贴图援用信息:

如_CloudTex 这个,是旧版本应用过的,新的 Shader 里都没有这个属性了。个别的查找援用的办法是找到所有关联的 GUID,那就会找到这些旧的援用,但在手机上应用 Profiler 看内存时却没有相干援用的贴图被加载。是否是因为 Unity 打包时会主动把这些旧援用筛除?只管在 Editor 上还是找失去这些冗余援用,是否能够不必理睬?

A1:旧的 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 零碎是否做了改良。

感激 Prin@UWA 问答社区提供了答复

A2:参考这个帖子:
https://forum.unity.com/threads/material-asset-keeps-references-to-assets-that-are-not-used.523192/

能够间接用外面的 CleanUpMaterials 来清理材质。

感激小埃拉 @UWA 问答社区提供了答复

Editor

Q:编辑器下 AssetDatabase.GetAllAssetBundleNamesWithoutVariant()呈现大量 GC 操作导致卡顿。

复现步骤:
1. 游戏外面抉择一个材质,或者其余对象。
2. 把 Unity 编辑器切换到后盾再切回来,我这里是间接点开 Sublime 再切回 Unity
做完下面两步后,Unity 就会变的很卡很卡,通过 Profiler 剖析 EditorLoop 能够看到 AssetDatabase.GetAllAssetBundleNamesWithoutVariant 有大量的 GC 操作,如下图:

用的是 Unity 2019.4.15f1,上面是我尝试过的解决方案:
1. 狐疑 Unity 版本问题,可是笔记本外面装置的同版本 Unity 新建工程是复现不了。
2. 狐疑 OnInspectorGUI 有问题,而后把代码外面的所有 OnInspectorGUI 正文了,也还是能复现。
3. 狐疑 ShaderGUI 有问题,把所有 ShaderGUI 相干代码删了,一样能复现。

有大佬能够提供其余思路去排查这个问题吗?咱们当初长期解决办法是,切换一下选中对象就不卡了。

A:我的项目中是通过设置 AssetImporter 的 bundleName 来标记 Bundle 的吗?

importer.assetBundleName = bundleName;
importer.assetBundleVariant = variant;


查看了一下编辑器局部的源码,发现 AssetDatabase.GetAllAssetBundleNamesWithoutVariant(); 这个 API 是在绘制上面这部分的时候调用的。

猜想如果 BundleName 和 BundleVariant 较多,会不会引起卡顿?

Q:咱们我的项目导入资源的时候是有只设置了 Bundle Name,也就是上面的设置形式 importer.assetBundleName = bundleName; 我的项目是没有设置 BundleVariant,不过的确有不少 BundleName,对于 BundleName 数量官网有下限要求?

A:你能够试一下在代码中手动调用一下 AssetDatabase.GetAllAssetBundleNamesWithoutVariant()(internal 办法,通过反射调用),看看是不是会造成大量 GC 和卡顿。如果本人调用也会造成卡顿,八成就是这个引起的。如果就是这个 Bundle Name 这个过多因而的卡顿,那你就用 AAB 的形式打 bundle 就好了,别设置 importer.assetBundleName。

感激马三小伙儿 @UWA 问答社区提供了答复

Script

Q:在应用 JsonUtility.ToJson 时,保留 float 类型时,提前曾经做好保留两位小数,但 ToJson 后果 1.059999999999999 都是这样的。请问有解决办法吗?

A:很遗憾,Unity 的 JsonUtility 是在 Native 层实现的,是闭源的并且提供的接口性能极少。倡议应用其余 Json 插件,如 Newtonsoft.json:
https://github.com/SaladLab/Json.Net.Unity3D

感激 Prin@UWA 问答社区提供了答复

A2:自荐一下魔改版 LitJson4Unity。
https://github.com/XINCGer/LitJson4Unity

LitJson4Unity:实用于 Unity 的改进型 LitJson 库
简介:基于原生的 LitJson 库革新的实用于 Unity 的 LitJson 库。

反对以下原生版本不反对的个性:

  • 反对 float 类型(最新原生版本曾经反对)
  • 反对 Unity 内建类型(Vector2、Vector3、Rect、AnimationCure、Bounds、Color、Color32、Quaternion、RectOffset 等)
  • 反对 JsonIgnore Attritube,对某些字段跳过序列化
  • 反对对输入的 Json 内容格式化,更规整

应用办法:间接将 Plugins/LitJson 目录下所有的 cs 脚本放到你的工程中即可。

【Unity 游戏开发】跟着马三一起魔改 LitJson
https://www.cnblogs.com/msxh/p/12541159.html

感激马三小伙儿 @UWA 问答社区提供了答复

封面图来源于网络

明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在 UWA 问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官网技术博客:blog.uwa4d.com
官网问答社区:answer.uwa4d.com
UWA 学堂:edu.uwa4d.com
官网技术 QQ 群:793972859(原群已满员)

退出移动版