Sockets 如何避免每个房间创建一个线程(玩家组)

Sockets 如何避免每个房间创建一个线程(玩家组),sockets,tcp,Sockets,Tcp,我已经制作了一个游戏(仍在测试阶段,需要改进,还有其他事情),我想知道是否有更好的方法来实现我在游戏服务器上所做的。(在C#上编程) 玩游戏的过程如下: 客户端应用程序(播放器)→ 连接到大厅服务器→ 用他喜欢玩的游戏检查一个可用的房间→ 大厅回答请求并将玩家指向右侧的游戏服务器(全部使用“原始”TCP/sockets) 当房间中至少有4名玩家(可能有多个房间)且最多12名玩家时,每个游戏服务器会自动启动游戏。每个房间都以不同的线程启动,我的意思是,我为每个房间创建了一个线程(4-12名玩家),

我已经制作了一个游戏(仍在测试阶段,需要改进,还有其他事情),我想知道是否有更好的方法来实现我在游戏服务器上所做的。(在C#上编程)

玩游戏的过程如下: 客户端应用程序(播放器)→ 连接到大厅服务器→ 用他喜欢玩的游戏检查一个可用的房间→ 大厅回答请求并将玩家指向右侧的游戏服务器(全部使用“原始”TCP/sockets)

当房间中至少有4名玩家(可能有多个房间)且最多12名玩家时,每个游戏服务器会自动启动游戏。每个房间都以不同的线程启动,我的意思是,我为每个房间创建了一个线程(4-12名玩家),因此如果我有1.200个线程(游戏服务器预计会有更多线程),那么至少会有100个线程(更多线程取决于每个房间中实际有多少玩家)。 主线程(并且是工作线程)加上所有创建的线程将消耗我服务器中的所有资源。。。所以,我想知道是否有人能提出更好的想法或方法


请记住,所有的连接都是异步的,除了在房间里,我的意思是,在房间里,服务器必须等待一个玩家的移动(比如Ludo游戏或打赌),让下一个玩家(房间里)也这样做。事实上,移动按钮仅对要移动的玩家启用。由于这个原因,就地传输是同步的,当有人移动时,其余的接收各自的通知。

如果您可以在同一线程中等待多个套接字(我不知道,这可能是操作系统特有的),并且您可以明确地将传入的数据与特定的套接字相关联(我想你应该能做到这一点),然后你就可以为所有的房间(或者只是几个房间)提供服务了在同一线程中按顺序存储,从而在操作系统和每线程堆栈中保存每线程数据结构。您可能需要实现某种状态机来实现这一点,并重新构建您的数据结构。

如果您可以在同一线程中等待多个套接字(我不知道,这可能是操作系统特有的)您可以明确地将传入的数据与特定的套接字相关联(我认为您应该能够做到这一点),然后您可以为所有房间(或者只是少数房间)提供服务在同一线程中按顺序存储,从而在操作系统和每个线程堆栈中保存每个线程的数据结构。您可能需要实现某种状态机来实现这一点,并重新构建数据结构。

来自MUD开发背景,这类事情的通常过程是处理“心跳”型号:

  • 您有一个计时器线程,它定期触发心跳事件/消息
  • 对于每个心跳信号,订阅的读卡器线程都会检查所有连接的套接字,看看它们是否有任何数据要读取。如果有,则可以将命令(按钮按下等)放入队列(以及哪个用户、房间等的指示器)中,由主游戏处理器读取
  • 游戏处理器只处理来自传入队列的消息,并生成响应(如果您愿意,可以将响应放在传出队列中进行传递)
  • 这就是我在编写聊天服务器、Talker和Mud时一直使用的方法,听起来它也很适合您的要求


    HTH

    来自泥浆开发背景,这种事情的通常过程是在“心跳”模型上工作:

  • 您有一个计时器线程,它定期触发心跳事件/消息
  • 对于每个心跳信号,订阅的读卡器线程都会检查所有连接的套接字,看看它们是否有任何数据要读取。如果有,则可以将命令(按钮按下等)放入队列(以及哪个用户、房间等的指示器)中,由主游戏处理器读取
  • 游戏处理器只处理来自传入队列的消息,并生成响应(如果您愿意,可以将响应放在传出队列中进行传递)
  • 这就是我在编写聊天服务器、Talker和Mud时一直使用的方法,听起来它也很适合您的要求


    HTH

    首先感谢你的帮助…我真的不明白你的建议…我的意思是,每个房间都是相互独立的,但在每个房间内,游戏必须快速进行,没有延迟,当有人下注或移动时,其他人必须心中有数,并继续下一个玩家…现在,如果我将每个房间中的每个移动都列为一个队列,那么组这可能会导致服务器的响应出现较大延迟,因为一个线程必须检查所有连接的套接字,并查看排队的消息…其想法是,当在房间内移动时,请提前到下一个玩家,这适用于每个房间。首先感谢您的帮助…我不太理解您的提示…我的意思是,每个房间都在相互依赖,但在每个房间内,游戏必须快速进行,没有延迟,当有人下注或移动时,其他人必须心中有数,并继续下一个玩家…现在,如果我将每个房间中的每个移动作为一个组进行排队,服务器的响应可能会有很大延迟,因为一个线程必须检查所有连接的套接字ts和查看排队的消息…想法是,当在房间内移动时,中间移动到下一个玩家。这适用于每个房间。你最终是如何做到的?已经10年了!你最终是如何做到的?已经10年了!