我正在为我的实时游戏设计TCP套接字服务器,我已经采用了两种方法来构建它。他们在这里:
我们开始两个主题。一个人在无限循环中侦听新连接,并将新客户端添加到数组中。第二个顺序扫描阵列中的所有客户端套接字并从中读取数据。
我们启动一个线程,它在一个无限循环中侦听新连接,然后为每个只从一个套接字读取数据的客户端启动新线程。
我已经对大约100个客户端进行了一些测试,我看不出两种架构的性能差异。所以,我想问你的意见,哪种方式更好。 谢谢!
答案 0 :(得分:3)
这完全取决于你的游戏实时的实际情况。
在第一种方法中,您正在所有打开的套接字上实现事件的多路分解 - 并且可能使用select()
或poll()
来阻止。显然,虽然您只能在被阻止的情况下收到事件通知,但如果在解除阻止时发送了多个事件,您可以有效地序列化每个事件的处理。
在第二种方法中,您有可能并行处理事件(特别是在多处理器系统上),并且还可以使用线程优先级对连接进行优先级排序。但是,这种方法使用更多内存,而调度线程比在第一种方法中迭代事件列表要昂贵得多。
您需要问自己的问题是:
答案 1 :(得分:2)
在我看来,这取决于你认为对你更容易的事情。
你使用提升吗?如果是,您可以查看使用asio
实现此类服务器体系结构的示例。这样,您可以在侦听连接和处理请求时避免手动管理线程。
还有ZeroMQ,它是一个库,专门用于轻松实现服务器体系结构。有了它,您可以通过显式控制线程数等来测试更详细的案例。
希望这有帮助。
答案 2 :(得分:2)
如果你想去WebSocket,这里有一个快速提示:查看https://github.com/zaphoyd/websocketpp和/或询问作者(Peter)。 WebSocket ++有一个非常灵活的框架,关于你进行WebSocket处理的内容和方式。
答案 3 :(得分:1)
根据经验,我会为新客户提供一个单独的线程,以便您可以处理登录,并让它等待加入游戏的好点。我想你并不总是想要让新玩家登录游戏中断游戏。一个主线程可能会变得非常混乱。
您可能还希望线程组中的多个现有游戏线程具有可伸缩性,例如,如果您有8个以上的核心可用,则每个游戏一个。考虑甚至从新游戏线程重定向到另一台服务器,以获得更大的可扩展性。
答案 4 :(得分:0)
只需使用Boost.Asio即可开心!学习一些例子并开始制作实际游戏,而不是网络基础。