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(原群已满员)