这是第119篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。
UWA 问答社区:answer.uwa4d.com
UWA QQ群:465082844(仅限技术交流)
堆内存
Q1:在我们的UWA报告中显示,现在Mono GC 分配达到了30MB,持续存留的内存也有20MB左右。我们是直接Split,也测试过indexof+substring,但是并没有多大改进。想问下大家有没有针对CSV配置文件的优化策略呀?
因为C#的字符串是不可更改的,所以字符串操作往往会造成大量临时变量,常规操作很难避免。题主可以考虑两种方案:
1)将CSV转化成其他存储结构,protobuf或者MessagePack。
2)使用unsafe指针来操作字符串(可能有点麻烦)。基本思想就是将字符串在[idx0,idx1]之间的char手动转换成int,float,bool和string。string和bool比较简单,int次之,float要考虑的情况比较多,如果有C++经验的话,写这种代码应该会容易一点。更进一步的就是数组,先确定数组的长度,再来构造数组可以减少一部分GC,终极问题就是Dictionary。
感谢凯奥斯@UWA问答社区提供了回答,欢迎大家转至社区进行进一步交流:
https://answer.uwa4d.com/question/5b3e0eb4f91024518ab77ab0
动画
Q2:特效使用动作控制器做表现的时候,会遇到显示时控制器初始化,导致那一帧时间消耗变大很多;而且每一次SetActive都会初始化控制器,每次都会有初始化的时间消耗。请问大家有什么好办法吗?
隐藏GameObject并不一定需要SetActive,可以将所有的Renderer组件Enable设置为False。
感谢胡阿毛@UWA问答社区提供了回答
对于含有Animator组件的GameObject进行Active操作是一定会造成Animator.Initialize的CPU开销的。建议可以看一下这问题:Profiler中看到Animator.Initialize这个耗时很大,这个有什么建议么?
该问答来自UWA问答社区,欢迎大家转至社区进行进一步交流:
https://answer.uwa4d.com/question/5b3e0fbef91024518ab77ab2
崩溃/闪退
Q3:我在Unity 4.x下用WWW加载资源会奔溃,显示
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR)。
最后定位到调用的接口是:
MemoryProfiler::RegisterRootAllocation(void*, BaseAllocator*, char const*, char const*)+124
请问该怎么处理呢?
如果是Development Build的版本出现了崩溃Log,那其实不用管它,因为这个Crash只在Unity 4.x上的Dev版本中出现,在Release版本中是不会出现的。如果题主发现Release版本也在相同位置出现崩溃,那么应该是其他问题,跟这个Crash Log没关系了。该Bug在Unity 5.0以后被修复,但在Unity 4.x上依然存在。
该回答由UWA提供,欢迎大家转至社区进行进一步交流:
https://answer.uwa4d.com/question/5b3ee720f91024518ab77ac0
资源管理
Q4:我们项目从Unity 5.6升级到2017.4.3之后,美术的贴图文件都发生了改变,主要是Meta自动被修改了,修改如下。这个是不是Unity版本自身的问题,导致贴图的一些信息被改变了?
问题已经解决,是因为我们工程内有后处理脚本,在OnPostprocessTexture中对美术的贴图限制了大小,防止他们提交大于2048的贴图,只要对导入的贴图不进行导入修改就没有问题了。(在此,感谢UWA群的一位朋友的指导)
感谢题主炉石不传说@UWA问答社区分享该问答,欢迎大家转至社区进行进一步交流:
https://answer.uwa4d.com/question/5b3cc4fdf91024518ab77a94
堆内存
Q5:ManagedHeap.ReservedUnUsedSize的内存占用有2个GB,这是什么原因导致?这个参数一般大家都是控制在什么范围内呢?
这应该是游戏运行到某一阶段时,出现了很大的堆内存分配,然后将Mono的总体堆内存撑高所致,后续虽然此处的堆内存被GC掉了,但是Mono的整体堆内存是不会返还给系统的。这也是为什么ManagedHeap.ReservedUnusedSize才会这么大。对此,建议题主查查看是否确实存在这种情况,一般都是发生在游戏、技能配表或者地形导航网格加载时所致,建议题主先从这些方面进行查起。
对于手游,UWA建议Total Mono堆内存峰值小于40MB。
该回答由UWA提供,欢迎大家转至社区进行进一步交流:
https://answer.uwa4d.com/question/5b3e0a98f91024518ab77aad
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
官方技术QQ群:465082844(仅限技术交流)