管理世界服务器上的玩家

时间:2016-11-15 00:24:40

标签: c++ multithreading


我目前正在开发游戏的服务器部分(MMORPG)而且我仍然坚持认为我非常重要的一点:如何管理客户端收到的数据包及其逻辑?

让我解释一下:我知道如何从客户端获取连接,如何存储此客户端的套接字但我不知道如何管理它稍后将发送的数据包并在服务器上应用修改(所有异步地)。

我想到了两个解决方案:
1)一旦服务器检测到客户端连接,它就会为客户端创建一个线程。因此每个客户端有1个线程来处理单个客户端的数据包。但在这种情况下,客户端越多,调用的处理器就越多吗?

2)一旦服务器检测到新客户端,它就会将其存储在列表中。线程将在客户端列表上循环,并查看当前客户端是否正在发送数据包。如果是这样,它会管理它。但是这个解决方案也存在一个问题:如何管理这个数据包?专门为此数据包创建一个新线程?但我回到起点:太多的数据包会使机器超载。

一位朋友向我提出了第三种解决方案:将两者结合起来。通过这种方式,线程将处理NB_MAX_CLIENT。

我想知道是否有其他方法可以做到这一点。 我在Windows上。我使用C ++开发Visual Studio,然后使用Winsocks。

提前致谢,抱歉我的英语不好。

1 个答案:

答案 0 :(得分:1)

  

只要服务器检测到客户端连接,它就会为客户端创建一个线程。因此每个客户端有1个线程来处理单个客户端的数据包。但在这种情况下,客户端越多,调用的处理器就越多吗?

这是相当常见的,除非您从每个线程需要的堆栈中耗尽RAM(通常OS线程需要每个物理线程的OS堆栈)。另一个问题是太多的上下文切换可能会让您考虑其他问题。

避免线程问题非常困难,因为您无法绕过数据结构而无法为每个客户端执行任何操作,因为您不知道哪个堆栈将处理下一个数据包。

  

只要服务器检测到新客户端,它就会将其存储在列表中。线程将在客户端列表上循环,并查看当前客户端是否正在发送数据包。如果是这样,它会管理它。但是这个解决方案也存在问题:如何管理这个数据包?

通常,您为此设置生产者消费者线程集。一个生产者获取每个数据包并将其发送到队列,然后由一些只处理每个项目的工作线程使用。

老实说,正确地做这件事需要大量工作(例如Netflix开发的一项主要技术),你可能应该避免它来简化事情。

特别是因为RAM很便宜,每个线程1MB需要并发性,这会在你的专用线程堆栈杀死之前将你从其他问题中解脱出来。 (同样,当上下文切换成为您最大的问题时,除非您正在做与此讨论无关的事情,否则您将走得很远。)