Unity幀同步的探索之路二 不靠譜的Unity實體引擎
- 1.為何不靠譜?
- 2.測試環境
- 3.碰撞示範
- 4.測試結果
1.為何不靠譜?
衆所周知,在使用幀同步的情況下最好不要使用Unity自帶的實體引擎。
具體為什麼不同步,網上給出的答案全都是會造成不同步。
因為Unity自帶的實體引擎内部是由浮點數參與計算的,而浮點數在不同平台産生的結果也不一樣,就導緻了結果有所浮動,且不一緻,是以就造成了不同步。
是以就衍生出了定點數。
而幀同步為了保證各平台同步的情況下,則必須使用定點數。
雖然說網上都說要使用定點實體庫來保各平台的一緻性。
但肯定會有不少人會去巧妙的構想:在使用定點數保證兩名玩家位置一緻,旋轉一直,操作一緻(在同一幀)的情況下,也就是絕對同步的情況下,使用Unity自帶的實體引擎,進行碰撞,會不會得到相同的結果。
帶着這個思想,咱們就去探究一番Unity實體系統的計算會不會造成不同步。
2.測試環境
1.首先保證兩個用戶端:
- 位置一緻
- 旋轉一緻
- 輸入一緻
2.然後在角色的武器上添加Unity的BoxCollider,在角色身上添加剛體,達成碰撞條件。
3.攻擊時通過武器碰撞敵方玩家的回調,來播放對方玩家的受擊動畫。目的就是為了測試碰撞算法的準确率。
3.碰撞示範
下面是測試效果:
4.測試結果
在同一台電腦的模拟器上 進行了多次測試,保證兩個玩家位置、旋轉、輸入、一緻的情況下,碰撞算法得到的結果卻不穩定,有不小的浮動性。有時結果一緻,有時結果不同,甚至在一緻結果的情況下會出現兩種不同的表現結果。
猜測是實體系統内部浮點數導緻計算結果具有上下浮動值,進而産生了在一台裝置上的結果不同。
是以幀同步最好還是要使用定點數實體庫,否則遊戲過程中出現一個不同步,就會影響後續的計算。
或者在擊中判定采取定點實體計算的方式,來保證不同不平台下的結果一緻性。
是以在幀同步中,還是要避免掉一切有關于float浮點數相關的計算,否則會造成不同步問題。
努力積才能,壹葉便成名。
喜歡我關注我,更多幹貨知識等着你!