2010-02-24 30 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游戏服务器都是单线程的 - 我见过的每一款服务器都是我见过的。