Unity最佳实践-物理计算
Unity最佳實踐-物理計算
英文原文:https://unity3d.com/cn/learn/tutorials/topics/physics/physics-best-practices
層次(Layer)和層次碰撞矩陣(Layer Collision Matrix)
所有新建的GameObject默認處于 Default 層,該層中的所有物體都可以相互碰撞,這樣會比較消耗性能。
應(yīng)該為不同類型的GameObject設(shè)置不同的層,來設(shè)定哪些GameObject之間可以發(fā)生碰撞。
新添加的層默認設(shè)置為可與所以已存在的層發(fā)生碰撞,要在碰撞矩陣中去掉不必要的碰撞關(guān)系,以減少碰撞監(jiān)聽和碰撞事件。
碰撞矩陣界面位于 Edit-Project Settings-Physics : Layer Collision Matrix。
射線(Raycasts)
射線比較消耗性能,其性能開銷與射線的長度和場景中的碰撞器(Collider)的類型關(guān)系密切。
下面列出一些優(yōu)化射線性能的提示:
- 盡量減少射線的數(shù)量。
- 射線的長度夠用即可。射線越長,引擎要檢測的對象就越多。
- 不要在 FixedUpdate() 中使用射線,也盡量不要在 Update() 中使用射線。
- 注意射線所檢測的碰撞器的類型,MeshCollider 的射線處理性能開銷非常大。
- 對于具有復(fù)雜網(wǎng)格的物體,一個比較好的解決方案是為其創(chuàng)建多個帶有基礎(chǔ)碰撞器的子對象,然后調(diào)整子對象碰撞器的形狀到與父物體相近。
- 若確實需要使用MeshCollider,盡量將其設(shè)置為 convex 。
- 明確射線需要與哪些層發(fā)生碰撞,盡量在射線方法中使用層次遮罩。
- 射線方法中的 layerMask 參數(shù)用于設(shè)置層次遮罩,它是位掩碼而不是層id。
- 要設(shè)置射線只與第10層(層id為10)的物體發(fā)生碰撞,layerMask參數(shù)應(yīng)該為 1<<10。
- 要設(shè)置射線不與第10層的物體發(fā)生碰撞,layerMask參數(shù)應(yīng)該為 ~(1<<10),不能省略括號。
- 可以通過 LayerMask.NameToLayer("LayerName") 方法獲取層的id。
- 示例1: Physics.Raycast(ray, out hit, 1 << 10)。
- 示例2: Physics.Raycast(ray, out hit, ~(1 << 10))。
剛體(Rigidbody)
剛體是在對象間進行物理交互所必須的組件,即使是只將碰撞器作為觸發(fā)器(Tigger),也應(yīng)該為對象添加剛體組件,這樣可以確保 OnTrigger 事件正常工作。
當多個對象具有層級關(guān)系且子對象具有碰撞器時,只需在最外層的父對象上添加一個剛體即可,無需為每個子對象添加剛體。
不帶有剛體的碰撞器對象會被引擎認為是 靜態(tài)碰撞器(Static Collider)。要避免移動靜態(tài)碰撞器對象,這一操作開銷很大,因為這會導(dǎo)致引擎重新計算整個場景的物理數(shù)據(jù)。
Profile 窗口的 CPU Profile 欄會在移動靜態(tài)碰撞器時輸出警告(warning)。
這里我在Unity 5.6.3和Unity 2018.1.0中做了下測試,感覺反而是加了剛體之后每幀耗時增加了,Profile中也沒看到警告,不知道是Unity內(nèi)部做了升級還是我哪里沒設(shè)置好,如果有人懂這里的改動,希望能給講解一下!
Fixed時間步長(Fixed Timestep)
在時間管理器(Time Manager)中調(diào)整 Fixed Timestep 會直接影響到 FixedUpdate() 和 物理計算 的更新頻率,通過更改該值來在物理計算精度和CPU消耗中尋求平衡。時間管理器界面位于 Edit-Project Settings-Time : Time Manager。
總結(jié)
以上是生活随笔為你收集整理的Unity最佳实践-物理计算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件工程(1)--初识基础概念
- 下一篇: opencv学习笔记五十三:训练自己的级