管理世界服务器上的玩家

Managing Players on a World Server

本文关键字:玩家 服务器 世界 管理      更新时间:2023-10-16


我目前正在开发游戏(MMORPG(的服务器部分,我被困在一个在我看来非常重要的问题上:如何管理客户端接收的数据包及其逻辑?

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

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

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

一位朋友向我提出了第三种解决方案:两者混合。这样,线程将处理NB_MAX_CLIENT。

我想知道是否有其他方法可以做到这一点。我在窗户上。我在C++使用Visual Studio进行开发,并使用Winsocks。

提前感谢,对不起我的英语不好。

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

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

避免线程问题确实很困难,因为您不知道哪个堆栈将处理下一个数据包,因此您无法在不透视数据结构的情况下对每个客户端执行任何操作。

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

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

老实说,正确做到这一点需要大量的工作(例如它是 Netflix 开发的一项主要技术(,您可能应该避免使用它以简化事情。

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