我有一个C#游戏服务器,其中我有多个对象,每个对象代表一个游戏匹配。可能同时有很多比赛(例如:10000)。每场比赛有2位玩家,我想每秒在每场比赛中执行一个动作。
我只知道两种解决方法:
一个每秒执行的主计时器/任务/某事,其中遍历匹配项列表并使用操作调用方法我要执行。 (问题是我认为这不是很可扩展的,因为就像我说的那样,我可以进行很多匹配。)
每个匹配项都有1个计时器/任务/一些调用方法的东西独立地做我想执行的动作。但是我不知道是否有那么多的任务/计时器/什么会导致性能和资源问题。
这些解决方案中的任何一个都好吗?如果没有,我应该怎么做?
选项1(所有游戏一个计时器)的优点是可以控制应用程序使用的资源。所有游戏仅使用一个线程。万一一个线程不够用,所有游戏将开始落后(均等)。
选项2(每个游戏一个计时器)将利用计算机的所有可用CPU资源。该应用程序将很好地扩展,直到CPU达到100%饱和,这时ThreadPool
将被工作人员饿死,每500毫秒将注入新线程,直到最后1,000个线程(每个游戏一个)竞争一次罕见的时间从数量少得多的CPU处理器中分拆出来,所有游戏都会非常糟糕和不一致。
简而言之,这两个选项似乎都不理想。两者都很简单。在您的位置,我可能会从选项2开始,如果事实证明我的游戏足够成功,可以接近饱和点,那么我将开始考虑寻找一种更好(更复杂)的体系结构。