2012-01-02 81 views
4

我使用winsock和C++創建2d sidescroller mmorpg,我想問如何編程客戶端預測&更正? 尤其是修正,因爲預測基本上只是運行客戶端服務器上運行的物理代碼。 服務器每兩秒鐘發送更正一次。該消息中包含X & Y位置和X &ÿ速度和輸入像 左0,右1,跳1 ...遊戲網絡代碼 - 客戶端預測和更正

編輯: 它是確定我做同樣的其他客戶端?因此,我不是發送位置和速度的快照,而是隻發送已更改的輸入,並且本地客戶端將預測其他客戶端正在移動到的位置。服務器每2-3秒發送一次更正。

非常感謝!

回答

7

通常是什麼在這種類型的遊戲做:

  1. 預測是「航位推算」,其中服務器與客戶端的一些勻速運動(當然調整這個速度重力,爆炸,以及無論服務器上發生什麼),直到客戶端更新其當前位置和速度。對於動作遊戲來說,很難提出比這個速度*時間運動更高級的預測(即試圖預測將要發生什麼輸入)。

  2. 告訴服務器你在哪裏是一件棘手的事情。如果服務器依靠玩家發送他們自己的位置和速度,客戶可以欺騙他/她的位置來避開障礙。理想情況下,服務器只會接收客戶端輸入並直接處理所產生的移動,因此可以肯定人們正在以合法的方式移動。然而,延遲獲取輸入到服務器使這不切實際,所以你可能需要一箇中間地帶的解決方案,客戶說:「當我將速度改變爲(s,t)時,我就在(x,y)」(即在x,y點按下跳轉鍵),服務器查看這些信息並說:「根據我對這個客戶的預測動作,他在0.7秒前實際上已經接近該點,所以我相信他確實做了改變他的速度到(s,t)在那個點上,而我對最後0.7秒的預測是不準確的,所以玩家實際上在(x,y)+(s,t)* 0.7「如果服務器不同意,應該告訴玩家它認爲她或她當前在哪裏,以便玩家回到服務器指示的位置。例如,如果在客戶端輸入到服務器之前服務器上發生爆炸,那麼客戶端對自己在世界上的看法就不再準確。同樣,如果客戶試圖發送一個遠離他當前位置的錯誤位置或一個荒謬的高移動速度。服務器必須放下,可以這麼說:)

  3. 服務器向每個客戶端發送他或她附近的每個玩家的位置和速度。位置和速度足以完全預測和推斷玩家的移動。換句話說,其他玩家不關心哪些按鍵被按下或者類似的東西,服務器已經確認了準確性。 NPC動作和AI可以在客戶端進行處理,所以不需要發送。

  4. 網絡遊戲幾乎是總是使用UDP套接字完成。由於數據包未被收件人確認,因此UDP套接字的開銷比TCP低得多。如果他們迷路了,他們就會消失。雖然這節省了確認往返時間,但您不能認爲數據包曾到達服務器,反之亦然。這是關於發送輸入事件的棘手問題。始終發送當前狀態「快照」而不是狀態更改是理想的,因爲即使數據包在傳輸中丟失,只要數據包進入,就知道正確的狀態。換句話說,您總是想說「這就是我所處的位置和我目前正在做的事情「,而不是」我按了3次跳躍「。

所以總結一下,客戶端可以發送速度更新以及發生更改時頭像的位置。服務器驗證所有當前狀態的合理值。服務器將這些數據發送給其他附近的玩家(理想情況下,將附近玩家的所有運動信息打包成單個數據包),客戶端應用相同的預測模型,然後減去合理運動的驗證。

對不起,如果這太長了...