《Unity性能優(yōu)化》系列課程筆記——第拾貳節(jié)
2022年4月5日第拾貳講?物理
Unity中的物理解決方案
Box2D
Nvidia PhysX
Unity Physics
Havok Physics for Unity
Unity中的物理組件Collider部分的優(yōu)化
Trigger與Collider
Trigger對象的碰撞會被物理引擎所忽略,通過OnTriggerEnter/Stay/Exit函數(shù)回調(diào)
Trigger對象不需要RigidBody組件,Collider對象必須至少有一個Collider對象有RigidBody組件
Trigger對象更高效
Unity中的物理組件Collider部分的優(yōu)化
盡量少使用MeshCollider,可以用簡單Collider代替,即使用多個簡單Collider組合代替也要比復雜的MeshCollider來的高效
MeshCollider是基于三角形面的碰撞
MeshCollider生成的碰撞體網(wǎng)格占用內(nèi)存也較高
MeshCollider即使要用也要盡量保障其是靜態(tài)物體
可以通過PlayerSetting選項中勾選Prebake Collision Meshes選項來在構(gòu)建應(yīng)用時預(yù)先Bake出碰撞網(wǎng)格。
Unity中的物理組件RigidBody部分的優(yōu)化
Kinematic與RigidBody
Kinematic對象不受物理引擎中力的影響,但可以對其他RigidBody施加物理影響。
RigidBody完全由物理引擎模擬來控制,場景中RigidBody數(shù)量越多,物理計算負載越高
勾選了Kinematic選項的RigidBody對象會被認為是Kinematic的,不會增加場景中的RigidBody個數(shù)
場景中的RigidBody對象越少越好
Unity中的RayCast與Overlap部分的優(yōu)化
Unity物理中RayCast與Overlap都有NoAlloc版本的函數(shù),在代碼中調(diào)用時盡量用NoAlloc版本,這樣可以避免不必要的GC開銷
盡量調(diào)用RayCast與Overlap時要指定對象圖層進行對象過濾,并且RayCast要還可以指定距離來減少一些太遠的對象查詢
此外如果是大量的RayCast操作還可以通過RaycastCommand的方式批量處理,充分利用JobSystem來分攤到多核多線程計算。