2012-12-11 224 views
2

好的,所以我意識到這已經被反覆討論了,因爲我已經閱讀了無數堆棧溢出線程以及網絡上的文章。我目前在VPS上運行TCP異步C#.NET服務器。TCP實時多人遊戲

我已經得到了這個適合多人遊戲大廳,如連接玩家遊戲和什麼不是。我的主要問題是遊戲開始時,因爲它變得非常塊。所以在我的研究

我發現了一些非常有幫助的插值線程,他們引導我走向基本(差異(Serverpos - Localpos)* Deltatime(服務器更新之間的時間?)*插值常量)。這在某種意義上是有效的,它平滑了幀速率,但我仍然在服務器更新時間上存在一時的滯後。

但是,我的主要問題是,我正在使用加速度計來更新每個播放器的位置,但是我的服務器無法收到該數據,並且像加速度計更新一樣快地處理它,導致它開始混亂。

所以今天我試着簡單地發送數據到服務器,但是我的最大傳輸時間大約是350MS,這使它無法將事故中的消息合併起來。

然後我遇到了「Dead Reckoning」,這在理論上是可行的,但是因爲你不會跟蹤理論上最新的槳位置。當球擊中你的對手槳時會發生什麼?你是否會自動將槳衝入位置並顛倒球的位置?

基本上,我認爲我只是通過理論化不同的方式來做一個大圈子。我也知道UDP,但我無法想象一個龐多人會要求我運行一個UDP連接,必須有一種方法來使用TCP。

無論如何,謝謝你們給我的任何幫助。我對此很陌生,我認爲在網絡網絡中已經迷失了方向。

+0

這非常含糊。你有關於你正在談論的這些算法或技術之一的問題嗎?否則,這裏就不存在問題,因此,它確實沒有「答案」。我有點在「推測」一段中看到一個問題,也許你可以專注於這個問題? –

+0

對不起,我想我的問題是關於人們如何通過TCP實現流暢的遊戲。我會在客戶端模擬球時每隔350MS發送一次Paddle位置嗎?那麼在更新期間只需使用航位推算法就可以了?抱歉含糊不清。 – peytoncas

回答

3

這不是一個網絡問題,它是一個過濾器問題。我會推薦閱讀「卡爾曼濾波」。數學可能是令人生畏的,但是你想要的基本問題是「如何根據我對系統物理學的知識以及(可能)用戶輸入和以前狀態的噪聲和不規則測量來插入狀態」....這恰好是經典的卡爾曼問題。

1)您必須建立一個服務器和客戶達成一致的共同「時間」。有一些衆所周知的算法可以做到這一點。用這個普通時間爲您的所有更新添加時間戳。

2)使用UDP是要走的路 - 只要記住數據包可能會丟失,並且不能保證以發送順序收到數據包。這意味着您必須有方法檢查數據包,並確定它們是否「舊」,然後才能使用它們來更新客戶端。你也有這樣的問題,如果你的客戶無法像發送它們一樣快速處理它們,那麼你將開始在你的客戶端獲得大的delta值......最好扔掉比花時間處理它的數據包更舊的數據包。

3)最小化延遲。如果可以的話,將服務器完全從環路中切出並讓客戶端向對方廣播更新。

4)這就是過濾器理論出現的地方 - 對於每一個自由度,決定你願意容忍多少錯誤(客戶端看到的和真實之間的差異)。例如,對於一架飛機,這個位置不是很有活力 - 你可能會得到一秒甚至兩秒鐘的更新,並且在客戶端的位置錯誤很少。然而,姿態(俯仰,偏航,滾轉)非常動態,因此您可能需要每次更新這些狀態。25秒才能達到可接受的位置誤差。卡爾曼理論會告訴你更新率需要達到什麼樣的要求。您還可以根據您在原始客戶端發生的情況更改您的更新速率....快速控制輸入=>較高的更新速率與無控制輸入=>較低的更新速率。

+0

好吧,我並不是無視卡爾曼理論,因爲它確實很有趣。不過,我認爲爲了成本/效益,簡單地實現UDP連接並讓服務器保持客戶端同步會更好?此外,感謝卡爾曼提示長期學習看起來很有趣,只需要快速實施即可。 – peytoncas