Unity3d中超大图的bug

发表评论 阅读评论

前几天我们游戏升级unity3d版本到5.4后,出现一个严重的问题,每当打开一个新UI,会卡大约1秒时间,升级unity3d版本到5.5和5.6依然会卡1秒,而5.3及更低版本却没有问题。

查找问题

出现问题后,首先打开Unity的Profiler看看具体是哪里出现问题了,下面是Profiler截图:
unity profiler Overview

从Profiler中可以看出,最耗时的不是什么自己的代码,而是 Unity 的 WaitingForJob,这表示Unity在等待 Job System 线程,然后再切换到 Timeline 视图,看看 Unity 具体在等待什么内容。
unity profiler timeline

Timeline 视图里发现 Canvas.Sort 耗费的时间为424ms,与等待的时间基本一致,又有些我们项目使用了大量的Canvas,并且使用了 Canvas.sortingOrder 来排序,所以就想是不是使用了太多的Canvas的问题。

  1. 尝试将游戏中所有嵌套的Canvas都去掉,UI卡掉的问题果然消失了。
  2. 尝试不移除Canvas,只是不勾选OverrideOrder,UI依然会卡顿。

由于项目中UI比较复杂,后面又做了N多尝试,终于找到了真正触发UI卡顿的原因,这也正是Unity的一个bug。

由于背景遮罩图片设置的缩放比较大(100, 100, 100),导致Untiy触发了卡顿的bug。只需将该背景设置为正常缩放(1, 1, 1)就不会再卡顿了。

现在做一个精简的测试demo,只需在场景中放置一个Image,并且让这个Image的最终面积(size*scale)比较大,然后显示/隐藏该Image,就可以看到卡顿现象。

unity large image parmas

上面是我测试的参数,如果机器性能比较好,需要增大Image的面积即可测试该问题。

总结

Iamge的面积够用就好,需要设置的太大。
出现问题后一定要多尝试,尽可能去除跟问题无关的因素。 最终,该问题在 Untiy 5.6.2.p1中被修复。

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
回到顶部