关于Unity的Physics优化GC与cpu耗时
2020-07-02 本文已影响0人
AngerCow
最近在优化项目Physics时,发现Physics的使用有一些需要注意的地方,这里记录一下。
我们可以查看或者自己测试Physics的耗时与GC情况,这里网上有现成的测试数据可供参考,这里就不做测试了。可以看以下链接:
https://blog.csdn.net/weixin_34199405/article/details/94698726
我们来看以下的表(表取自上面文章):
由表我们可以看出每个检测的函数都有对应无GC版本,比如:RaycastAll对应RaycastNonAlloc,(新的api已经有变化,所以不是RaycastAllTest,现在是RaycastAll,其它函数想对应变化,自己对照看)。其中耗时跟着GC成正比上升,所以我们优化了GC后,对应该的耗时也会下降。
接下来是看如何使用XXXXNonAlloc来实现与其对应函数的相同功能,同时优化代码。
要正确的使用一个api肯定是要看官方的文档,这是最基本的
Physics.RaycastAll
Physics.RaycastAll描述返回的是所有的碰撞但可能是无顺序。会产生GC。
Physics.RaycastNonAlloc
Physics.RaycastNonAlloc描述返回的是满足射线检测条件的碰撞个数,需要传 RaycastHit[] 数组来接收碰撞信息。且部分有序。不会产生GC。
下面是范例:
这里使用时我总结出一些要注意的地方:
1.RaycastNonAlloc传入的RaycastHit[]必须初始化,不然检测不到返回数据。这样我们最好提取出来,new数组也是会产生GC的,所以我们要避免可复用的变量去new。不然我们失去使用这个函数优化的意义了。
2.可以利用RaycastNonAlloc返回的int来减少遍历次数。虽然这些能优化出来的东西九牛一毛。但是优化就是这样的,积少成多。,这是优化时最忌讳的。这也是规范与书写高质量代码的好习惯。好的习惯要从日常养成。
前路漫漫,共勉之。有什么问题或者理解有误可留言探讨。