我正在Node.js中创建一个游戏服务器,并且我认为setInterval()
上有一个不错的服务器循环。但是,我打算制作游戏的方式是同时运行许多小游戏实例,这意味着同时发生许多不同的setInterval()
循环。
太多的setInterval()
同时运行是否会出现问题,如果存在,是否有更好的方法来构建服务器?例如试图在一个setInterval()
循环中运行游戏的所有实例?
最佳答案
纯粹是理论问题,不包含任何代码或数据,答案是肯定的。当然有可能同时运行太多setInterval()
调用。
与大多数游戏一样,如果您需要对setInterval()
通话进行一些可预测的计时以保持流畅的游戏流程,那么随着越来越多的通话在运行,您将开始失去何时运行的可预测性。由于node.js中的Javascript是单线程事件驱动的设计,因此,如果计划在同一时刻发生两个setInterval()
调用,则一个将首先运行,而另一个将直到运行完成后再运行。在这成为一个明显的问题之前,您需要拥有多少完全取决于代码的情况-您有多少代码,每个代码执行所需的时间以及您的游戏对计时的轻微延迟的容忍度。
由于node.js具有单线程性质,因此拥有一个试图执行许多对时间敏感的事情的单一进程并不是一件好事。解决此问题的典型方法是使用多个node.js进程(计算机中每个CPU内核通常使用一个),这样您就可以使用所有CPU内核。甚至在某些情况下,您试图提高动作之间的公平性,您可能想要拥有比CPU核心更多的进程,因为这为您提供了在不同的node.js进程之间进行工作之间的操作系统驱动时间划分。
由于我们对您的详细信息一无所知,因此无法说您将从集群化(多个node.js进程都运行相同的代码并共享输入负载)中受益,还是从每个方案使用单独的node.js应用程序中受益N个游戏实例,其中N是您通过测试得出的结果。可能您希望一个游戏实例由一个特定的节点实例处理,因此您的模型更像第二个选项(每个node.js实例N个游戏实例),但这只是一个猜测,因为我们没有具体细节。
但是正如我在评论中说的那样,因为您已经提出了一个纯粹的理论性问题,没有代码,也没有数据,所以我们真正能做的就是假设地回答-没有现实世界的代码或数据可以通过。