Physics Performance & Optimization
簡介
在存在實時交互的多人遊戲環境中,遊戲的性能對於為玩家提供最流暢的體驗至關重要。
雖然物理系統並非總是問題的根源,但在這些情況下,它們往往是常見的瓶頸。
性能分析
在採取進一步措施之前,你需要確保你的問題確實是由物理系統引起的。
Quantum圖形分析器
Quantum Graph Profiler
是一種用於分析所有系統性能以及圖形和 Unity 腳本的工具。這主要有助於確定是否有任何與 Unity 相關的內容導致性能問題。
任務分析器
該工具用於評估Quantum模擬中每個系統的執行時間。
通常,如果使用這些工具沒有檢測到任何與物理相關的問題,那麼你面臨的問題可能與物理無關。
有關Quantum中的性能分析的更多信息,請參閱:性能分析
廣域階段優化
物理引擎是由系統設置中相應系統調度的一系列任務。
每幀,這些任務將:
為模擬中具有物理組件的實體創建物理條目並收集這些條目。
廣域階段:檢測可能重疊的對,以便進行詳細評估。這一步至關重要,可避免暴力的、O (n²) 的檢測方式。
狹域階段:評估之前廣域階段的候選對,並確定哪些是重疊的。這一步的計算量與經廣域階段過濾後的潛在候選對數量呈線性關係,且涉及昂貴的數學計算。
使用迭代求解器解析速度和位置約束。
積分力和速度,檢測靜止物體並解析之前的廣域階段查詢。
這些任務中的大多數都與條目數量或它們之間的交互量呈線性關係。
因此,減少動態條目數量的一種方法是將任何不移動的動態碰撞體轉換為靜態碰撞體。
有關靜態碰撞體的信息,請參閱:靜態碰撞體
另一種方法是減少物體之間的交互量,例如使用物理層或查詢選項。
3D 和 2D 的碰撞矩陣是從 Unity 導入的,並且在Simulation Config
中可用。

世界大小和桶大小
有關物理設置的更多深入信息,請參閱設置
World Size
是在Map
資產中找到的一個欄位,由QuantumMapData
組件烘焙而成。它定義了物理引擎中的可玩區域。
地圖被劃分為一系列稱為 Buckets
的部分,用於解析廣域和狹域階段的查詢。
世界大小
World Size
應盡可能接近遊戲的可玩區域大小,以提高效率。

在第一張圖中,World Size
大於遊戲實際使用的區域,桶的分佈不均勻且存在浪費。在第二張圖中,物體在世界區域內均勻分佈。
需要注意的是,添加過多不必要的桶不會提高性能,而桶數過少則會有太多條目需要評估。在第一個或最後一個桶中有太多條目會極大地影響性能。
參考Task Profiler
來評估性能,並根據最適合你的情況調整數值。
注意:如果某物體超出世界大小限制,它將被視為處於第一個或最後一個桶中(無論哪個更近)。
桶細分
桶細分用於提高常規物理查詢的效率。因此,如果你的遊戲不使用常規查詢,例如只使用廣域階段查詢,你可以將細分數設置為 0。
否則,QuantumMapData
組件中提供的默認值對於大多數情況來說已經足夠。
桶劃分軸
根據遊戲中物體的分佈方式,世界大小細分的軸可以提高性能。

在左圖中,一些桶有 5 個條目,而右圖中的其他桶只有 3 個。
因此,對於此圖,Bucketing Axis
應設置為水平,因為物理體將更均勻地分佈在各個桶中。
注意:在這個只有幾個條目的例子中,變化會很小。但是,當擴展到數百或數千個條目時,這絕對是重要的。
三角形單元大小
注意:這僅與 3D 遊戲相關。
三角形單元大小定義了 3D 靜態碰撞體三角形所劃分的單元大小。
動態實體與靜態網格之間的碰撞只會在相應的和相鄰的單元中進行評估。
優化方法:
- 避免每個單元中有太多三角形。
- 避免太多單元。
你應該力求地形和網格碰撞體具有合理的三角形密度,因為它們在物理引擎的性能中起著重要作用。因此,根據網格的不同,你可能需要為碰撞體創建第二個簡化的網格,而不是使用與視圖相同的網格。
要可視化這些,請在 QuantumGameGizmosSettings
中啟用相關欄位。

優化模擬執行
Quantum的物理引擎為多種功能執行多個調度步驟,但是根據遊戲的不同,並非所有步驟都可能需要。
你可以在SimulationConfig
資產中單獨禁用這些功能:

靜止物體
當遊戲中有不需要長時間移動的物體時,系統會讓它們進入休眠狀態,並跳過它們的力、速度、積分和碰撞檢測。此選項可以在SimulationConfig
資產中啟用:

求解器迭代次數
SimulationConfig
資產中的Solver Iterations
欄位表示用於求解物理引擎所使用的約束(例如碰撞和接頭)的迭代次數。
默認值為 4,通常這對於大多數情況來說已經足夠。但是,可以根據所需的精度增加或減少該值。
光線投射優化
當每幀執行大量光線投射時,確保它們得到正確優化是個好主意。
例如:
添加 LayerMask 以避免對不重要的物體進行不必要的碰撞評估。
使光線投射距離盡可能小,以避免不必要的碰撞評估。
如果只需要第一個碰撞,使用
Raycast
而不是RaycastAll
。在光線投射方法中使用
QueryOptions
,確保它不會命中不重要的物體。
有關QueryOptions
的更多信息,請參閱:查詢
廣域階段查詢
如上所述,廣域階段查詢可用於優化遊戲中的查詢。有關更多信息,請參閱:廣域階段查詢
Back to top