最近在優化攝像機部分代碼,抽了個時間對物理投射這塊進行了系統性的測試,發現了不少東西
測試工程下載地址:
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
