4

我正在为我的实时游戏设计一个 TCP 套接字服务器,我已经采用了两种方法来实现它的架构。他们来了:

  1. 我们启动两个线程。一个在无限循环中侦听新连接并将新客户端添加到数组中。第二个顺序扫描数组中的所有客户端套接字并从中读取数据。

  2. 我们启动一个线程,它在无限循环中侦听新连接,然后为每个仅从一个套接字读取数据的客户端启动新线程。

我已经对大约 100 个客户端进行了一些测试,但我看不出两种架构的性能差异。所以,我想问问你的意见,哪种方式更好。谢谢!

4

5 回答 5

4

这一切都取决于您的游戏实际的实时性。

在第一种方法中,您在所有打开的套接字上实现事件的多路分解 - 并且可能使用select()orpoll()来阻止。显然,虽然您只能在阻塞时接收事件通知,并且如果在解除阻塞时传递了多个事件,则您可以有效地序列化每个事件的处理。

在第二种方法中,您有可能并行处理事件(尤其是在多处理器系统上),并且还可以使用线程优先级对连接进行优先级排序。然而,这种方法使用更多的内存,并且调度线程比在第一种方法中迭代事件列表要昂贵得多。

你需要问自己的问题是:

  • 你真的需要并行处理事件吗?(无论如何,您是否要在处理中序列化执行?)
  • 每个事件的处理量是否明显高于调度线程的成本?
  • 线程堆栈的内存消耗会限制可伸缩性吗?
  • 您的实时性要求真的那么严格吗?
于 2012-08-14T11:10:40.680 回答
2

If you want to go WebSocket, here is a quick tip: look at https://github.com/zaphoyd/websocketpp and/or ask the author (Peter). WebSocket++ has a very flexible framework regarding what/how you do your WebSocket processing.

于 2012-08-14T19:32:34.720 回答
2

在我看来,这取决于你认为什么对你来说更容易。

你用升压吗?如果是,您可以查看他们asio用于实现此类服务器架构的示例。这样可以避免在监听连接和处理请求时手动管理线程。

还有ZeroMQ,这是一个库,专门用于轻松实现服务器架构。有了它,您可以通过显式控制线程数等来测试更详细的案例。

希望这可以帮助。

于 2012-08-14T11:12:11.263 回答
1

根据经验,我将为新客户设置一个单独的线程,以便您可以处理登录,并让它等待加入游戏的好时机。我想您并不总是想为新玩家登录而中断游戏。否则,一个主线程可能会变得非常混乱。

您可能还需要线程组中的多个现有游戏线程以实现可扩展性,例如,如果您有 8 个以上可用内核,则每个游戏一个。考虑甚至从新的游戏线程重定向到另一个服务器以获得更大的可扩展性。

于 2012-08-14T22:30:25.847 回答
0

只需使用Boost.Asio并快乐!学习一些示例并开始制作真正的游戏,而不是网络基础知识。

于 2012-08-17T10:42:19.577 回答