2016-11-30 93 views
0

作爲一個原型,我正在使用javascript和websockets在畫布上製作多人繪畫遊戲。條件是服務器無法以任何方式生成畫布。所有的模型邏輯都發生在客戶端。如何使服務器沒有權威的網絡架構

現在我有以下設置:

1)當輸入發生在客戶端將其轉移到服務器並保存。服務器做了一個非常簡單的驗證檢查。

2)每15毫秒(在服務器上),所有輸入都發送到客戶端並清除。客戶端在本地呈現輸入。

3)每200毫秒每一個客戶送他們的帆布的版本在那裏保存

4)每200毫秒服務器票「正確」版本的服務器,並把它備份到客戶那裏更新他們的畫布。正確的版本使用時間戳存儲在服務器上。

5)當一個新的客戶端連接時,他們從服務器獲取最新的正確版本的畫布。

儘管這種方法提供了多人繪畫與持久狀態,但它也帶有一些問題。什麼是正確的版本,他們如何投票?當客戶遇到類似10秒的延遲併發送他們的版本時會發生什麼?另外,如果每個客戶端都在不斷地進行本地更改,每個客戶端的畫布將永遠不會完全相同,這使得它變得不可能?找到正確版本的畫布,因爲它們在發送到服務器時都有所不同。

問題可以歸結爲:可以製作一個依賴客戶端 - 服務器的架構,其中客戶端執行所有邏輯並且服務器只檢查輸入是否有效?即使它需要更多的網絡流量。如果是這樣,什麼是一個好的接近?

+0

也許客戶總是應該每隔15ms將畫布和輸入一起發送。除了每〜200ms,服務器大部分時間都會丟棄畫布數據,然後保存畫布的一個版本。這當然會大大增加交通負荷:) – xCander

回答

0

經過進一步調查,我發現了一些關於上述問題的優秀文檔。

擁有一個僅客戶端的網絡模型可以被描述爲一個對等交換模型,並且實際上是在帝國時代1 + 2中使用的。但是,由於微軟面臨的幾個問題讓客戶端同步運行(以及小的變化打破了遊戲),我決定使用服務器模型而不是一些快捷方式來實際啓用服務器來合併模型。