在网络上构建一个多人游戏,能够同时处理数千名玩家,分成独立的大厅/会议。可能有20名球员在一个大厅,10名在另一个,30在另一个,等等。
我正在使用NodeJS、Express和Socket.io,但我对一些事情不太确定。我假设我的整个应用程序将运行在一个NodeJS服务器上,但是每个游戏大厅都会产生自己的快递服务器和或自己的socket.io服务器。
或者,它们都可以共享相同的中央单一快车服务器,但该快递服务器将为它们生成独立的socket.io服务器(如果可能的话)。
对我来说,最不可能的情况是只有一台socket.io服务器供所有大堂使用,并使用Socket.IO的“房间”功能来区分它们。这似乎是不正确的,因为房间是服务器端唯一关心的问题,所有客户端的‘都会发出到同一个服务器上,可能会影响性能。
将我的不确定性正式化为四个问题:
发布于 2023-05-11 09:40:44
这是一个相当大的问题,答案是“视情况而定”。
您将看到单个node.js实例上的数百个连接的基准测试,但这些基准通常都是无用的,因为它们实际上并没有做任何“工作”。不需要任何处理就发送消息。这不是您的服务器可能会做的,所以它们没有那么有用。有一些负载测试的信息在socket.io网站上,可能会更有帮助,以确保您的特定游戏将规模。
尽管如此,还是有一些考虑因素:
缩放插座可能会很困难。当您引入多个服务器时,您需要引入一种方法来确保位于同一游戏大厅中的用户实际上连接到同一个socket.io实例,这样您就不会在用户之间通过网络进行通信。这可能是困难的,也可能是琐碎的,这取决于您如何让用户加入大厅(也许他们只能在连接到的同一个实例上看到大厅)。
当您为您的游戏大厅生成一个单独的socket.io实例时,如果它存在于同一个实例(IE:您正在使用叉子或某个子集),那么您仍然受到主机系统硬件的限制。
如果你正在为每个游戏游说旋转单个进程,那么我不确定你是否真的那么关心并发/多线程wrt到你的游戏本身。对我来说,你可以把它分成几个大厅,这意味着在大厅内发生的任何事情都是受限的,不应该影响大厅之外的任何事情(除了玩家)。并发/多线程将遇到的问题达到了“跨”的程度。这是当你需要触摸另一个过程正在接触的东西的时候。不知道你的游戏,很难说你会在哪里遇到问题。
https://gamedev.stackexchange.com/questions/205418
复制