管理世界服务器上的玩家
Managing Players on a World Server
我目前正在开发游戏(MMORPG(的服务器部分,我被困在一个在我看来非常重要的问题上:如何管理客户端接收的数据包及其逻辑?
让我解释一下:我知道如何从客户端获取连接,如何存储此客户端的套接字,但我不知道如何管理稍后将发送的数据包并在服务器上应用修改(全部异步(。
我想到了2个解决方案:
1( 一旦服务器检测到客户端连接,它就会为客户端创建一个线程。因此,每个客户端有 1 个线程将处理单个客户端的数据包。但是在这种情况下,客户端越多,处理器就越多,对吗?
2(一旦服务器检测到新客户端,它就会将其存储在列表中。线程将在客户端列表上循环,并查看当前客户端是否正在发送数据包。如果是这样,它会管理它。但是这个解决方案也带来了一个问题:如何管理这个数据包?专门为此数据包创建新线程?但我回到起点:太多的数据包会使机器过载。
一位朋友向我提出了第三种解决方案:两者混合。这样,线程将处理NB_MAX_CLIENT。
我想知道是否有其他方法可以做到这一点。我在窗户上。我在C++使用Visual Studio进行开发,并使用Winsocks。
提前感谢,对不起我的英语不好。
一旦服务器检测到客户端连接,它就会为客户端创建一个线程。因此,每个客户端有 1 个线程将处理单个客户端的数据包。但是在这种情况下,客户端越多,处理器就越多,对吗?
这是相当常见的,除非您从每个线程所需的堆栈中耗尽 RAM(通常操作系统线程需要每个物理线程一个操作系统堆栈(。另一个问题是太多的上下文切换可能会让您考虑其他情况。
避免线程问题确实很困难,因为您不知道哪个堆栈将处理下一个数据包,因此您无法在不透视数据结构的情况下对每个客户端执行任何操作。
一旦服务器检测到新客户端,它就会将其存储在列表中。线程将在客户端列表上循环,并查看当前客户端是否正在发送数据包。如果是这样,它会管理它。但是这个解决方案也带来了一个问题:如何管理这个数据包?
通常,为此设置一组生产者使用者线程。一个生产者获取每个数据包并将其发送到队列,然后由仅处理每个项目的一定数量的工作线程使用。
老实说,正确做到这一点需要大量的工作(例如它是 Netflix 开发的一项主要技术(,您可能应该避免使用它以简化事情。
特别是因为 RAM 很便宜,每个线程 1MB 需要并发性,这会在您的专用线程堆栈杀死您之前将您从其他问题中击倒。(同样,当上下文切换成为你最大的问题时,除非你做错了与本次讨论无关的事情,否则你已经走得很远了(。
- "unknown ca"自生成的 CA、证书和客户端/服务器
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 有没有办法知道Tracer是否成功地完全连接到了jaegerclientcpp中的jaeger后端服务器
- 从服务器传输到客户端的消息不会出现
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- OpenSSL TLS服务器-使用客户端证书白名单
- 我正在开发服务器,ip作为参数传递不起作用
- 根据用户回答声明"Players"。用户选择玩家数量。播放器是结构体
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 提升 Asio TCP 服务器 处理多个客户端
- 玩家加速穿越世界(C++)
- 如何在 Minecraft 服务器上执行命令
- 调试编译的服务器在数据库打开时崩溃
- C++套接字客户端到 Python 服务器未创建连接
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 将相机数据从服务器实时流式传输到客户端
- 为什么创建服务器后C++ httplib 库阻塞了我的主线程?
- 需要推荐c++游戏服务器,关于玩家使用的数据结构,怪物对象,以获得性能优势
- 管理世界服务器上的玩家