gpt4 book ai didi

java - java中每个连接的线程与所有连接的一个线程

转载 作者:行者123 更新时间:2023-12-02 02:24:17 24 4
gpt4 key购买 nike

我目前有两种不同类型的服务器和客户端正在运行,我正在尝试确定哪一种更适合 MMO 服务器,或者至少是一次至少有 100 名玩家的小型 MMO 服务器。

我的第一个服务器使用每个连接一个线程模型,并使用 ObjectOutputStream 通过套接字发送对象。

我的第二台服务器使用 java nio 对所有连接仅使用一个线程,并使用 select 循环它们。该服务器也使用 ObjectOutputStream 发送数据

对于我的问题,对于 MMO 服务器来说,更好的方法是什么?如果单线程模型更好,通过套接字 channel 发送对象会受到什么影响,它不会被一路读取并且无法获得完整的内容吗?对象?

对于通过它发送的每个对象,仅包含一个 int 和 2 个 float ,用于发送位置和玩家 ID。

最佳答案

我会将这个问题与为什么 MMO 使用 UDP over TCP 相关。原因是 UDP promise 快速交付,而 TCP promise 有保证的交付。

类似的类比可以应用于单线程与多线程模型。无论您选择哪种,您的整体 CPU 周期都保持不变,即服务器每秒只能处理这么多信息。让我们看看每种情况下会发生什么

1.单线程模型:在这种情况下,您自己的实现或底层库将最终创建一个管道,请求开始在其中排队。如果处于最小负载,队列实际上将保持为空,并且执行将是实时的,但可能会浪费大量 CPU。在最大负载下,将出现很长的队列,并且随着负载的增加,执行将出现延迟,但是交付将得到保证,并且 CPU 利用率将达到最佳。通常,缓慢的客户端会减慢其他人的速度。

  • 多线程模型:在这种情况下,根据您自己的实现或底层库实现多线程的方式,请求的并行执行将开始发生。 MT 的缺点是很容易被愚弄。例如,java.util.concurrent.ThreadPoolExecutor 实际上并不执行任何并行处理,除非您将队列大小设置为较低的值。一旦并行处理开始发生,在最小负载下,您的执行速度将超快,CPU 利用率将达到最佳,游戏性能也将非常出色。然而,在最大负载下,您的 RAM 使用率会很高,而 CPU 利用率仍然是最佳的。通常,您需要设置线程中断以避免慢速客户端占用所有线程,这意味着慢速客户端的性能会出现问题。此外,当您开始耗尽线程池和资源时,线程要么排队,要么直接被丢弃,从而导致性能问题。
  • 在游戏中,性能比稳定性更重要,因此毫无疑问,您应该尽可能使用 MT,但是调整您的线程参数以补充您的服务器资源将决定它是福音还是彻底的祸害

    关于java - java中每个连接的线程与所有连接的一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48019034/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com