2017-06-04 45 views
3

爲了減少數據傳輸的大小以及爲每個worldUpdate序列化世界對象的計算時間,我想知道是否可以省略同步物體的物理可以完全,忠實地在客戶端gameEngine上模擬的對象(它們是不是playerObjects,所以playerInput不直接影響它們,它們的物理性質完全是確定性的)。與這些GameObjects的交互將完全由不那麼頻繁的GameEvents處理。如果客戶端運行與服務器相同的物理並且可以訪問相同的初始條件,我覺得這應該是可能的。是否有必要在worldUpdate中包含物理確定性的GameObjects?

當我嘗試從隨後的worldUpdates中忽略GameObjects時,我發現它們的運動變得更加起伏,它們的移動速度比沒有被省略的速度更快;然而,當我在停止遊戲服務器的同時打開客戶端時,他們的動作更像我所期望的,如果我沒有忽略它們的話。這一切都在我的本地機器上進行外推同步。

回答

2

簡短的回答是最新版本的Lance(1.0.8在撰寫本文時)並不支持用戶從世界更新中遺漏遊戲對象,但它確實實現了一種差異機制,如果它們的netScheme屬性沒有改變,則更新,節省帶寬。

這意味着如果你有靜態物體,比如牆壁,它們只會爲每個玩家傳送一次。根本不傳遞這個是一個有趣的特性。

如果您所指的對象不是靜態的,那麼確定性地知道它們的位置就沒有真正的方法。您可能已考慮使用世界步數,但由於網絡固有的延遲,不同的客戶端會在不同的時間處理不同的世界步驟。客戶端無法知道服務器在給定時間點處理的真正步驟是什麼,因此無法確定性地決定此類對象的位置。這就是蘭斯使用Authoritative server model的原因 - 允許一個單一的事實來源,並確保客戶端同步。

如果您仍然希望避免手工的對象發送更新,您可以編輯其netScheme以便它不返回任何東西,但它的ID,例如:

static get netScheme() { 
    return {  
     id: { type: Serializer.TYPES.INT32 } 
    }; 
} 

雖然這不是一個典型的應用由於上述原因,因此如果您遇到特定的同步問題並且仍然是您感興趣的功能,則最好提交Lance issue tracker中的功能請求。確保在您的用例中包含詳細信息以促進健康的討論

相關問題