如何在多人策略游戏中正确管理同时战斗的插槽

How to properly manage sockets for simultaneous battles in a multiplayer strategy game

我正在开发一款策略游戏,玩家可以在其中互相战斗。至于现在,我专注于制作 1v1 PvP 战斗,但我也想构建一个架构,允许进一步扩展最多 3v3 战斗。

我创建的游戏基于套接字Client/Server架构。每个进入游戏并按下 "Find match" 按钮的玩家,将被安排在与其他玩家之一的单独战斗中。

但是,关于如何构造套接字,我有很多问题:

  1. 每次同时进行的战斗都需要一个单独的插座 ("room socket") 吗?

  2. 谁应该创建和绑定房间套接字?如果是客户端,如果客户端的端口关闭,服务器如何连接到这个套接字?如果它是服务器,请参阅第 13 页。 3

  3. 是否可以将所有这些套接字绑定到一个端口?如果地址和端口相同,客户端如何连接到 "his" 套接字?

  4. 何时以及如何打开"room sockets"以便每个客户端都会获得相应的端点?服务器端怎么写?

  5. 配对队列需要多少个套接字 ("welcome sockets")?

  6. 我是要使用多线程编程,还是可以不用它?

如有任何帮助,我将不胜感激

P. S. 由于我编写服务器所用的语言不太流行,我无法使用任何现成的解决方案

根据你的问题,我怀疑你可以从回顾 Beej Guide to Network Programming 中受益。

  1. Do I need a separate socket ("room socket") for each simultaneous battle?

我不确定 "room" 套接字是什么意思。如果你的意思是每个游戏都会分配一个不同的监听插座,那是不切实际的。

通常的做法是让服务器侦听单个套接字(地址/端口),每个客户端都将连接到服务器的套接字。

这意味着服务器将为每个活动客户端提供一个套接字 + 一个侦听套接字,并且每个客户端实现将有一个套接字(连接套接字)。

对于1:1游戏,服务器可以"matched"对联,使"couplet"成为一个房间。

对于 1:many 游戏,您可以考虑通过实施 "channels" 和 "subscriptions" 使用 pub/sub 模式...但是,由于(我假设)玩家一次只能进入一个游戏,您可以考虑为每个游戏制作一个数组或链表。

  1. Is it possible to bind all of these sockets to one port? How the client can connect to "his" socket if the addresses and the ports are the same?

是的,这是可能的,这就是服务器的实际工作方式。

侦听套接字的行为与连接套接字略有不同,因为侦听套接字可以 "accept" 个连接并为每个连接创建一个新套接字。

  1. When and how to open "room sockets" so that each client will get a corresponding endpoint? How to write it on server-side?

这取决于语言。大多数语言在 the Beej Guide to Network Programming.

中的函数 listen 上都有某种变体

通常服务器会调用 listen,然后使用 accept 创建新的客户端套接字。客户端将调用 connect 并有一个套接字。

  1. How many sockets do I need for matchmaking queue ("welcome sockets")?

对于 1:1 游戏,您将需要一个插槽 "queued",因为它会等待下一个可用连接。

当然,这可能更复杂。如果客户有游戏要求(即只有 10 级及以上的玩家),您可能需要一个有序列表或另一个数据存储来管理队列。

  1. Am I to use multithreaded programming, or it is possible to go without it?

如果您使用事件(非阻塞)设计,您可能 运行 在一台机器上用一个线程运行数千个游戏。

这实际上取决于在服务器上执行了多少工作与在客户端计算机上执行了多少工作。