2010-06-24 61 views
1

我已經開發了一些使用服務器端編程(PHP和C++)和Flash(用於GUI)的在線遊戲(如國際象棋,跳棋,風險克隆)。現在,我想開發某種遊戲門戶(如www.mytopia.com)。爲了做到這一點,我必須決定什麼是構建我的服務器邏輯的好方法。關於多種遊戲服務器的建議

起初我想在爲每個遊戲編程分離的遊戲服務器。通過這種方式,每場比賽將是一個孤立的程序,爲客戶打開一個特定的端口。我還想過爲每個遊戲室創建不同的服務器(每個遊戲室允許同時連接100個客戶端)。當然,我會使用數據庫來鏈接一切(如高分等)。

然後,我想這不是構建遊戲門戶服務器的最佳方式。我正在閱讀關於線程編程的知識,我認爲這是最好的方式。所以,我想像做一個連接線程那樣只會監聽新的連接客戶端(這樣每種類型的遊戲客戶端將只連接一個端口),驗證這個客戶端(登錄),然後將這個客戶端轉移到特定的遊戲線程(如國際象棋線程,跳棋線程等)。我將使用select(或變體)來處理異步客戶端(我猜這次「每個客戶端一個線程」不適合)。這個結構似乎是最好的,但我如何在線程之間進行通信?我已經讀過關於競爭條件和全局作用域變量的信息,因此一種解決方案是在每次更改時都需要通過連接線程或遊戲線程鎖定全局客戶端數組(向量或映射)(新連接,註銷,更改狀態等)。這樣對嗎?

有沒有人在這樣的事情?任何建議?

非常感謝

回答

0

如果使用線程,你可能有一個更簡單的分時數據,但是你必須要更加註意安全性完全相同的原因。這當然不能解決一般的MT問題。

0

TBH我一直在做一個voip系統,服務器可以發出很多流,客戶端可以聽很多流。到目前爲止,我提出的最好的體系結構只是綁定到一個端口,並使用sendto和recvfrom來處理通信。如果我從一個新地址的客戶端收到一個有效的連接數據包,然後我將客戶端添加到內部列表並開始向它們發送音頻數據。數據包接收和響應管理(RRM)全部發生在一個線程中。音頻隨時準備就緒,然後從音頻線程發送到所有客戶端。客戶響應說他們收到了音頻,並在RRM線程中得到處理。如果客戶端未能響應超過30秒,則我發送斷開連接並從我的內部列表中刪除客戶端。我不需要特別容錯。

至於如何在遊戲中做到這一點,我的主要想法是發送一組脈衝向量(當前的和前面的'n')。這樣,如果客戶端不同步,它可以通過檢查它應該爲給定對象接收到的最後幾個衝動來檢查它是如何不同步的。如果它不符合它的內容,那麼它可以糾正,或者如果它太不同步,它可以要求遊戲狀態重置。這個想法是嘗試並避免完整的遊戲狀態重置,因爲這將是一件相當昂貴的事情。

很顯然,每個數據包都會被散列,因此客戶端可以檢查傳入數據包的有效性,但它也允許客戶端忽略無效數據包,並且仍然可以獲得下一次更新所需的信息,從而有助於防止狀態重置。

除此之外,它值得做的事情就像留意客戶的位置。當客戶端朝另一個方向看時或者有某種方式(即客戶端看不到被告知的對象)時,向客戶端發送更新沒有任何意義。這也限制了嗅探傳入數據包的wallhack數據包的有效性。顯然,在物體變得可見之前,你必須開始發送一些東西,否則你會在不方便的時候彈出一些東西。

無論如何......那只是一些隨機的想法。我必須補充說,我從來沒有真正爲遊戲編寫多人遊戲引擎,所以我希望我的思考能幫助你一點:)

1

門戶需要健壯,可擴展和可擴展,以便您可以應對更大的受衆,更多的遊戲/服務器被添加等等。一個好的開始就是研究MMO和分佈式系統的設計方式。這也可能有所幫助:http://onlinegametechniques.blogspot.com/

就我個人而言,我會通過擁有一個驗證服務器來集中用戶,然後爲每個遊戲提供一個單獨的遊戲服務器,以驗證用戶對驗證服務器。