我有两种不同类型的服务器和客户端正在工作,我正在尝试决定哪一个更适合MMO服务器,或者至少一个小型MMO服务器,一次至少有100个玩家。
我的第一台服务器使用每个连接模型的线程,并使用ObjectOutputStream通过套接字发送对象。
我的第二台服务器使用java nio只为所有连接使用一个线程,并使用select循环它们。此服务器也使用ObjectOutputStream来发送数据
对于我的问题,对于MMO服务器更好的方法是什么?如果单线程模型更好,如何通过套接字通道发送对象会受到影响,是不是一直读取而不是获取完整对象?
对于通过它发送的每个对象,它只包含例如一个int和2个浮点数,用于发送位置和玩家ID。
我将把这个问题与MMO使用UDP over TCP的原因联系起来。原因是UDP承诺快速交付,而TCP承诺保证交付。
类似的类比可以应用于单线程和多线程模型。无论您选择哪种,您的整体CPU周期都保持不变,即服务器每秒只能处理如此多的信息。让我们看看每种情况都会发生什么
1.Single-Threaded模型:在这种情况下,您自己的实现或底层库将最终创建一个请求开始排队的管道。如果您处于最小负载状态,则队列将保持几乎为空并且执行将是实时的,但是可能会浪费大量CPU。在最大负载时,将会有一个长队列,并且执行将随着负载的增加而产生延迟,但是会保证交付并且CPU利用率将是最佳的。通常,慢速客户端会降低其他所有人的速度。
在游戏中,性能比稳定性更重要,因此毫无疑问你应该在任何地方使用MT,但是调整你的线程参数以补充你的服务器资源将决定它是一个恩惠还是一个完整的祸根