最近在優化攝像機部分代碼,抽了個時間對物理投射這塊進行了系統性的測試,發現了不少東西
測試工程下載地址:
http://files.cnblogs.com/files/hont/RaycastTestProj.rar
測試方式:
在某半徑內隨機若干Cube,然后以中心點發射各種投射進行測試
使用Unity5.4.1版本,並用Profiler和StopWatch進行測試並截圖,比較性能和GC差異
由於膠囊之類的投射實在太慢了,我改用1000次調用進行測試,NonAlloc緩存數組長度為20
一些投射都做了距離限定
腳本基本如下:
for (int i = 0; i < 1000; i++) { Physics.BoxCastAll(transform.position, Vector3.one * 2f, Vector3.forward, Quaternion.identity, 0); }
測試結果:
名稱 | 速度 | GC Alloc |
Raycast | 1ms | - |
RaycastNonAlloc | 2ms | - |
RaycastAllTest | 2ms | 273.4KB |
Linecast | 1ms | - |
BoxCastTest | 17ms | - |
BoxCastNonAllocTest | 18ms | - |
BoxCastAllTest | 20ms | 1.5MB |
CheckBoxTest | 1ms | - |
OverlapBoxTest | 62ms | 2.4MB |
OverlapBoxNonAllocTest | 24ms | - |
CapsuleCastTest | 162ms | - |
CapsuleCastNonAllocTest | 227ms | - |
CapsuleCastAllTest | 336ms | 12.7MB |
CheckCapsuleTest | 1ms | - |
OverlapCapsuleTest | 84ms | 2.1MB |
OverlapCapsuleNonAllocTest | 30ms | - |
SphereCastTest | 96ms | - |
SphereCastNonAllocTest | 171ms | - |
SphereCastAllTest | 226ms | 8.8MB |
CheckSphereTest | 1ms | - |
OverlapSphereTest | 33ms | 1.5MB |
OverlapSphereNonAllocTest | 16ms | - |
射線和線段的開銷非常小,撇開這個可以發現,性能消耗的順序是這樣的
從小到大:
CheckXXX -> OverlapXXX -> XXXCast
其中Check系列方法的開銷極小
從投射物來看,從小到大分別是:Box > Sphere > Capsule