使用 Unity 开发 Android 游戏时如何追踪性能问题(2)

下面这张图片是优化后的截屏,但它也只能是张图,你可以通过这张图片了解我的游戏。

The active block only have 1 draw call

活动块调用了一次绘图指令,参考(Batches: 20 或者 SetPass calls)。就像我前面所说的,以前每个块包包含 4-5 个独立的立方体并且每个都含有素材引用。因此正如你看到的每个块本身都要通过至少四次才能创建出来。

Locked blocks uses 1 draw call as well

而现在在顶端的两个被锁定的块,我们仅仅使用了一次额外的绘图调用。而这些块还是活动块时, 都是由原始的立方体组成并且每个立方体至少要经过一次处理才能创建出来。

Defense lines follows the same pattern

防御线使用相同的模式,但是这里只有 10 个原始的使用顶点颜色和共享素材的四方体。实际上,在这里我们不需要在一个网格里绘制完整的防御线,Unity 帮我们自动的将完整的防御线添加到“通过批处理保存”。

UFO 比较灵活些。每个 UFO 被分成 3 个独立的网格: 上,中,下。

由于我想随机的出现 UFO,并且随机的让 UFO 一部分活动 。 因此每个 UFO 的每个部分有3-4个素材。一个 UFO 大概有 12-17 次的绘图调用,然而我却发现每个 UFO 实际上有 17-30 次的绘图调用。而我大概会有 2-3 个 UFO 几乎同时出现在屏幕上,因此就有大概 50-100 次的绘图调用。好疼啊!

Before optimizing the UFOs

而在此刻,我非常非常渴望我能减少任何我能减少的绘图调用。因此我在网上找到了一个可以将所有网格合并成一个的脚本。但是这个这个脚本不能真正的适当的处理素材,所以我只能使用一种颜色的 UFO。我只能放弃多彩的漂亮的 UFO,而选用单调的讨厌的单一颜色的 UFO。通过对这个脚本的调整,我可以使用至少 2 种不同的颜色和一个纹理。 值得吗?当然了。30 次绘图调用听起来很多,也确实是。但是它表现的更好些,尽管我任然不能确信是否比之前好了很多。但是我将 UFO 绘图调用的次数减少到了仅仅 10 次左右。

After optimizing the UFOs

是否所有的绘图调用的减少都能让我们的游戏运行的跟快呢?不一定。 如果你能减少绘图调用,这很棒!但是对于那些更灵活,微妙的部分,如果你愿意牺牲一些灵活而去减少绘图调用,也不是不行。

目前我已经把游戏运行期间的平均 150-200 次的绘图调用减少到了仅仅 75-90 次。这已经减少了很多次了!

最后一部分,UFO 射出的激光,我在深入的研究后也解决了绘图调用的问题。所有的激光也都有素材引用,这些UFO的射击间隔很短“哒-哒”。在全力射击下每个激光会有30-40次的绘图调用。还好,这比创建初始方块要容易多了,使用相同的无光源顶点颜色着色器,再分配一些顶点颜色到网格就好了。现在所有的激光只需要一次绘图调用,就算是UFO“哒-哒-哒”不停地射击也没问题。 ;-)

现在我已经将整个游戏的绘图调用降低到 30-45 次了,怎么样?还行吧!

其他的绘图调用是 UI 引起的,我本来打算减少 UI 对象的数量来提高速度,但是我现在的效果我觉得挺好的了。游戏运行的比以前更流畅了。

The UFOs still uses a few draw calls

UFO 也使用了很少的绘图调用。但是想想大约 10 次和 30 次比较,还是有很大的区别的。

减少绘图调用的最重要的规则是使用尽可能少的素材。如果可以的话尽量使用共享素材而不是引用的素材,这些一定会帮助你减少你的绘图调用。:-)

确保你只加载了一次资源

在我的代码中我使用了一下资源加载,但是 Unity 没有缓存加载结果,因此导致了多次的加载了相同的资源。这个功能消耗了大量的性能。 我以前也是多次的加载了相同的素材到我的激光武器上,像往常一样游戏在电脑上运行的十分好,但是在 Android 上,就不行了。

最终我避免了重复加载资源,并且删掉了项目中资源加载的地方。但是在这之前,我创建了一个静态的字典,字符串作为 Key(资源的名称),资源作为 Value,然后,我使用的时候都会检查字典里是否已经存在 Key,如果没有就加载资源,否则从字典缓存里获取资源。

我建议你可以试着用这个方法加载舞台。

尽可能避免实例化

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/d00426951a2fe90b736e0a416a4f10a0.html