《魂鬥羅:歸來》子彈中沒中,沒你想得那麼簡單!

    無數玩家童年的神作重新迴歸,手機端多人聯機,呼朋引伴一起重溫當年的熱血大作。除了IP,劇情,對工程師而言,《魂鬥羅:歸來》更要解決的聯機同步和命中同步等問題,簡單說,一顆子彈打沒打中,沒你想得那麼簡單!

    

客戶端高級工程師聶鵬和田亞濤本週在《論道》開聊,小小子彈命中的大問題!
移動同步
    最左邊是1P玩家的持續,中間是DS,右邊是3P玩家。玩家走路,會有一個MoveStep,MoveStep裏包括了各種移動計算,操作以後它會把移動的包,即SendMove發到服務器,服務器會根據這個包進行MoveStep。計算之後,根據當前服務器計算的結果和客戶端上報的結果,進行對比,即CheckCheat,看位置有沒有差異,客戶端有沒有作弊。如果有作弊,客戶端會向iP玩家發送一個AdjustOwner,進行校正,校正可能會導致1P玩家有拉扯。

  

瞬髮型同步模型和投射類同步模型 

    

    瞬髮型同步模型中,需要達到的目標是本地預表現,響應及時,體驗順暢。核心點是命中校驗和反外掛。1P玩家發送射擊開始和結束事件,過程由DS計算並同步給3P玩家表現。本地檢測命中後預表現命中效果,需發送當前時刻的狀態序號給DS做命中判定。DS收到後回滾角色發射時刻信息,校驗彈量、射程、方向、位置、阻擋等信息。驗證通過,執行傷害並同步給所有客戶端。 

    這是本地發射開火,但並不會真的發射子彈出來,服務器開始創建子彈,同時給兩端玩家進行。假設他們一起開始,傷害是在DS進行的,本地只是預表現,不做檢測。目標是犧牲局部實時性,與3P保持彈道一致,公平性優先。核心點是延遲補償,平滑差值。外網偶爾會反饋一些問題,比如命中無效、擊穿問題、彈量閃跳,這些都是非常影響體驗的。命中無效就是打着沒傷害,第二就是會穿人,子彈會穿過去,還有就是在設計的時候,按着開槍的時候,彈量會閃跳。

命中無效:回滾250毫秒歷史事件    

    

    在C/S架構中,DS收到的目標是一個RTT前,敵人所在的位置,當你扣下扳機時他已經跑了。這個大部分原因是網絡延遲。目前的解決方案是,回滾250ms的歷史事件,回滾到這個點,沒有取到信息,之前是會判定命中無效。如果大於250ms,還會增加一個檢查,看你是不是還在這個位置。如果你沒動,對方沒動或動了但在250ms之內,還是會產生傷害,只是傷害會產生延遲。

原文:點擊打開鏈接

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