Unity3d 幀同步 VR遊戲中是否可行

幀同步的原理大意是

,遊戲運行時以10fps(100毫秒間隔,具體數值可根據實際情況調整)運行一個邏輯幀,邏輯幀負責物理、ai、攻擊判定等等。而動畫和實際位移由渲染幀負責。這樣動畫表現是流暢的。而客戶端每邏輯幀都會與服務器進行通信同步客戶端的操作,當操作同步完成客戶端的邏輯幀可以繼續向後模擬。比如運行第3幀要確保第一幀的數據是完整的。雙方客戶端接收的操作內容是一致的,初始狀態是一致的,所以運行的結果也應該是一致的。隨機數可以使用確定隨機種子的僞隨機數來解決。

       所以關鍵問題就是要確保客戶端以同樣的輸入可以獲得同樣的運行結果。 這個是理論上可行的,很多rts遊戲也都是基於此原理。比如魔獸爭霸3  最高指揮官2  全面戰爭  星際爭霸 帝國時代 等等。  以最高指揮官(Super Commander)爲例,其全部單位有上千個,如果要實時同步他們的狀態以現在的網絡條件都是很困難的,所以這些rts同步的僅僅是操作,即點擊了什麼位置,點擊了什麼按鈕,選擇了什麼目標,按了什麼按鍵。客戶端接收到對應的操作,進行同樣的模擬,達到同樣的輸出。從而完成網絡同步。


總的來說可以歸納爲:客戶端以輸入模式,服務器以判定模式 運行。

輸入模式:同步玩家的輸入設備狀態 , 即點擊了什麼位置,點擊了什麼按鈕,選擇了什麼目標,按了什麼按鍵。。。

判定模式:玩家有權限做這個操作就給他分發出去,沒有就不幹咯;其實服務不僅僅只管理玩家的行爲同步,還有各個AI  道具的行爲判斷,不做管理就會出現兩個客戶端AI 行爲不一致等等問題


VR遊戲中同步速率要求更加嚴謹,因爲VR 只要稍微延遲就很容易被玩家發現,VR遊戲的服務器一點要很好,客戶端的網速要穩定,同步直接用輸入同步模式數據量會降低並保證了傳輸的及時性;


下面是OculusVR/SteamVR平臺設備的輸入模式同步數據結構:


大致算一下200byte 左右一個同步包,VR中每秒90~120fps 那麼


1fps 同步一次的話:200byte*90=18000~200byte*120=2400 1.5k~2.5k 的數據  同步更慢的話就更小了


假設有100個人同時在線玩那麼數據量將達到150k~250k 每秒 加上 其他同步也就300K左右 的數據同步


  [Serializable]
   public class PlayerSync
    {
        public int Id;


        public Vector3 HeadPostion;
        public Quaternion HeadRotation;


        public bool LeftHand;
        public Vector3 LeftHandPostion;
        public Quaternion LeftHandRotation;
        public KeyState LeftTrigger;
        public Vector2 LeftTriggerAsix;
        public KeyState LeftGrip;
        public Vector2 LeftGripAsix;
        public KeyState LeftThumstick;
        public TouchState LeftTouch;
        public Vector2 LeftTouchAsix;
        public KeyState LeftMenu;
        public KeyState LeftXButton;
        public KeyState LeftYButton;
        public Vector3 LeftHandVelocity;
  
        public bool RightHand;
        public Vector3 RightHandPostion;
        public Quaternion RightHandRotation;
        public KeyState RightTrigger;
        public Vector2 RightTriggerAsix;
        public KeyState RightGrip;
        public Vector2 RightGripAsix;
        public KeyState RightThumstick;
        public TouchState RightTouch;
        public Vector2 RightTouchAsix;
        public KeyState RightMenu;
        public KeyState RightAButton;
        public KeyState RightBButton;
        public Vector3 RightHandVelocity;
        
    }


public    enum KeyState: byte
    {
        Up,
        Down,
        Pressed,
        
    }

public    enum TouchState : byte
    {
        Start,
        End
    }





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章