最近在优化摄像机部分代码,抽了个时间对物理投射这块进行了系统性的测试,发现了不少东西

测试工程下载地址:

http://files.cnblogs.com/files/hont/RaycastTestProj.rar

测试方式:

在某半径内随机若干Cube,然后以中心点发射各种投射进行测试

使用Unity5.4.1版本,并用Profiler和StopWatch进行测试并截图,比较性能和GC差异

由于胶囊之类的投射实在太慢了,我改用1000次调用进行测试,NonAlloc缓存数组长度为20

一些投射都做了距离限定

Unity中各类物理投射性能横向比较-LMLPHP

脚本基本如下:

for (int i = ; i < ; i++)
{
Physics.BoxCastAll(transform.position, Vector3.one * 2f, Vector3.forward, Quaternion.identity, );
}

测试结果:

名称速度GC Alloc
Raycast1ms-
RaycastNonAlloc2ms-
RaycastAllTest2ms273.4KB
Linecast1ms-
BoxCastTest17ms-
BoxCastNonAllocTest18ms-
BoxCastAllTest20ms1.5MB
CheckBoxTest1ms-
OverlapBoxTest62ms2.4MB
OverlapBoxNonAllocTest24ms-
CapsuleCastTest162ms-
CapsuleCastNonAllocTest227ms-
CapsuleCastAllTest336ms12.7MB
CheckCapsuleTest1ms-
OverlapCapsuleTest84ms2.1MB
OverlapCapsuleNonAllocTest30ms-
SphereCastTest96ms-
SphereCastNonAllocTest171ms-
SphereCastAllTest226ms8.8MB
CheckSphereTest1ms-
OverlapSphereTest33ms1.5MB
OverlapSphereNonAllocTest16ms-

射线和线段的开销非常小,撇开这个可以发现,性能消耗的顺序是这样的

从小到大:

CheckXXX -> OverlapXXX -> XXXCast

其中Check系列方法的开销极小

从投射物来看,从小到大分别是:Box > Sphere > Capsule

05-11 17:45