【问题标题】:How to avoid create one thread per room (group of players)如何避免每个房间创建一个线程(一组玩家)
【发布时间】:2011-09-29 07:25:48
【问题描述】:

我制作了一款游戏(仍处于测试阶段,需要改进,以及其他一些事情),我想知道是否存在更好的方法来说明我在游戏服务器中所做的事情。 (C#编程)

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

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

请记住,所有连接都是异步的,除了在房间里,我的意思是,在房间里,服务器必须等待一个玩家的移动(如 Ludo 游戏或下注)让下一个玩家(在房间)做同样的事情。事实上,移动按钮仅对轮到继续移动的玩家有效。由于这个原因,传输是同步的,当有人移动时,其余的会收到他们各自的通知。

【问题讨论】:

  • 你最后是怎么做到的? 10年了!

标签: sockets tcp


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    1. 您有一个计时器线程,它会定期触发心跳事件/消息。
    2. 对于每个心跳,订阅的读取器线程会检查所有连接的套接字,以查看它们是否有要读取的数据。如果是这样,则可以将命令(按下按钮等)放入队列中(连同指示哪个用户、房间等的指示器),以供主游戏处理器读取。
    3. 游戏处理器只处理来自传入队列的消息,并产生响应(如果您愿意,可以将其放在传出队列中进行传递)。

    这就是我在编写聊天服务器、谈话者和 MUD 时一直这样做的方式,听起来它也可以很好地满足您的要求。

    HTH

    【讨论】:

    • 首先感谢您的帮助...我不太明白您的提示...我的意思是,每个房间都是相互独立的,但是在每个房间内,游戏必须快速进行,没有延迟,当有人下注或移动时,其余的必须立即知道它并继续下一个玩家......现在,如果我将每个房间的每一个移动作为一个组排队,这可能会在服务器的响应中出现很大的延迟,因为一个线程必须检查所有连接的套接字并查看排队的消息......这个想法是,当在房间中移动时,立即前进到下一个玩家,这适用于每个房间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    相关资源
    最近更新 更多