2010-02-24 31 views
3

我有一款遊戲,我正在C++和OpenGL上工作。我已經創建了一個線程服務器,它現在接受客戶端(遊戲)並接收來自他們的消息。現在遊戲只發送消息。我希望遊戲和服務器都能夠發送和接收,但我不確定最好的解決方法。我正在考慮使用一個線程發送和一個接收,都在同一個套接字上。現在遊戲運行在單個線程中,服務器爲每個客戶端分別創建一個線程。在C++/WinSock中製作(線程化)遊戲服務器

尋找關於如何去遊戲以及服務器的建議(除非你的建議對於兩者都是一樣的)。任何問題,請隨時問:)

謝謝!

+2

你應該看看異步調用。線程不能很好地擴展。 – 2010-02-24 01:30:19

+0

+1以上, 我無法想象MMO編碼爲每個玩家連接產生線程:) – YeenFei 2010-02-24 01:36:51

+0

@YeenFei:他們通常不是。 – kyoryu 2010-02-24 02:22:44

回答

0

考慮使用Boost.ASIO,它使用C++ API實現這一功能(除了異步I/O外,還允許使用許多不同的方法)。有很多tutorials。但是,對於絕對最高的性能,你可能不應該使用線程。

+0

對於最高性能,每個執行單元需要一個線程,*和*異步I/O引擎。 – 2010-02-24 02:04:08

+0

真實,糟糕的使用我的語言。 – Tronic 2010-02-24 02:17:50

+0

感謝您的回覆。遊戲是第一人稱射擊遊戲(你可以在我的網站看到進步),所以速度是至關重要的,但我並不擔心有超過50人連接最多。我從頭開始做所有事情,所以雖然我很欣賞使用Boost庫的想法,但我寧願不使用其他人創建的任何東西(除非必要)(也稱爲Win32,WinSOck APi等)。 我將研究異步方法:) – Se7eN 2010-02-24 02:29:01

1

您需要做的是爲每個客戶端設置一個傳出隊列的消息。假設您有2個客戶端連接到服務器,一個由線程A提供服務,另一個由線程B服務。線程A應該在其套接字上執行WaitOnMultipleObjects(),並在其隊列中創建一個信號量/互斥/條件變量。這樣,如果它的隊列中有東西,它可以喚醒併發送出去。如果它從客戶端收到消息,它不需要給客戶端B,它將處理該消息並將其放入線程B的傳出隊列中。

這是一個非常簡單的同步方案。如果你的遊戲非常複雜或龐大,你將不得不做比這更聰明的事情。

1

請勿在遊戲服務器中使用線程。事實上,許多專業的AAA遊戲服務器都是單線程的 - 我見過的每一款服務器都是我見過的。