C# Gameserver的线程体系结构

C# Gameserver的线程体系结构,c#,multithreading,C#,Multithreading,我开始制作2D游戏/引擎,但不知道在服务器端处理客户端的最佳线程体系结构 最初,我考虑的是每个地图设计一个线程,而不是每个用户一个线程。但还有另一种理想的方法吗 在我的地图线程概念中,线程只会在地图上玩家的入口处创建,并在清空后很快被销毁。但是有了这个概念,一张有太多玩家(例如玩家商店)的地图可能会造成严重的延迟 使用用户线程方法,将有大量线程,因此内存分配也会很高 那么,还有另一种更好的方法吗?当您的服务器有多个CPU内核时,您将从mulithreading arch中获得一些好处。因此,如果

我开始制作2D游戏/引擎,但不知道在服务器端处理客户端的最佳线程体系结构

最初,我考虑的是每个地图设计一个线程,而不是每个用户一个线程。但还有另一种理想的方法吗

在我的地图线程概念中,线程只会在地图上玩家的入口处创建,并在清空后很快被销毁。但是有了这个概念,一张有太多玩家(例如玩家商店)的地图可能会造成严重的延迟

使用用户线程方法,将有大量线程,因此内存分配也会很高


那么,还有另一种更好的方法吗?

当您的服务器有多个CPU内核时,您将从mulithreading arch中获得一些好处。因此,如果您的游戏是纯事件驱动的(您从不在事件处理程序中等待任何事情),那么线程数等于CPU核心数时将获得最佳性能。

您的问题的答案是只使用一个线程模拟多个游戏实例。由于游戏编程的复杂性和以任何有意义/安全/有益的方式划分内存访问的困难,很少有游戏从多线程中获益的情况。即使是你听说过的最大游戏的服务器,在整个游戏逻辑中都是单线程的。例如,一个暗黑破坏神风格的游戏每个核心有一个线程,每个线程负责数百个游戏,每个线程都有一个小小的跨线程(真正的跨机器)逻辑来加速游戏。

可能是一个服务器范围的线程池,与使用线程数较少的贴图相比,使用线程数较多的贴图的用户数较多。请尝试将游戏逻辑改写为某种状态机,您可以在其中调用
map.Step()。然后,你可以很容易地在使用线程池、少量固定数量的线程甚至单个线程之间切换。Cory的+1“将游戏逻辑改写为某种状态机”——稍微复杂一些,但对于复杂的应用程序,你需要这种灵活性。