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

时间:2011-09-29 07:25:48

标签: sockets tcp

我制作了一款游戏(仍然处于测试阶段,需要改进,还有其他东西),我想知道我是否有更好的方法来处理游戏服务器。 (用C#编程)

玩游戏的过程是这样的: 客户端应用程序(播放器)→连接到大厅服务器→检查他喜欢玩的游戏的可用房间→大厅回答请求并将玩家指向正确的游戏服务器(全部使用“原始”TCP /套接字)。

每个游戏服务器在房间内至少有4名玩家(可能有多个房间)且最多12个玩家时自动启动游戏。每个房间都在不同的线程中启动,我的意思是,我每个房间创建一个线程( 4-12个玩家),所以如果我有1.200(游戏服务器可以预期更多)那么将至少有100个线程(甚至更多,取决于每个房间真正有多少玩家)。 主线程(并且是工作)加上创建的所有线程将占用我服务器中的所有资源...所以,我想知道是否有人可以提出更好的想法或方法?

保持我的所有连接是异步的,除了在房间里,我的意思是,在房间里服务器必须等待一个玩家的移动(如Ludo游戏或下注)让下一个玩家(在房间)也这样做。事实上,进行移动的按钮仅对转向移动的玩家启用。出于这个原因,适当的传输是同步的,当有人移动时,其余的接收他们各自的通知。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

  1. 您有一个计时器线程,它会定期触发心跳事件/消息。
  2. 对于每次心跳,订阅的读取器线程会检查所有连接的套接字,以查看它们是否有任何要读取的数据。如果是这样,命令(按下按钮等)可以放入队列中(连同主要游戏处理器要读取的用户,房间等的指示符)。
  3. 游戏处理器只是处理来自传入队列的消息,并产生响应(如果您喜欢,可以将其放在传出队列中进行传递)。
  4. 这就是我在编写聊天服务器,谈话者和MUD时总是这样做的,听起来它也非常适合你的要求。

    HTH