1

我目前一直在阅读 Java NIO,过去我自己也做了一些实现。但是,我从来没有真正考虑过服务器的性能——这看起来很傻,而且确实如此。我听人说单线程反应器就可以了,但我真的很想利用我拥有的内核。

因为我要实现的是一个游戏,所以也有一些游戏逻辑线程,所以它不能占用很多线程——如果有的话,它可能只有两个。

这是我想出的情节:

  • 高优先级反应堆
    1. 接受连接
    2. 处理游戏的登录过程(客户端发送数据包,服务器进程,服务器发送响应数据包,这里没有大量数据)
    3. 按需分发资源文件数据(游戏的构建是为了服务器发送客户端存储在缓存中的数据,该缓存包含游戏的几乎所有资源。大部分都是在加载游戏时完成的,但仍然会发生很多事情在后台播放)
  • 标准反应器
    1. 读取并响应游戏中的数据包;这些通常很小,但数量很多,因为玩家所做的几乎所有事情都以数据包的形式分发,我想很好地扩展它以处理大约 200 名玩家)

目标:

  • 适合约 200-300 名玩家
  • 快速响应游戏数据包
  • 快速分发上述文件数据
  • 快速接受连接

此外,如果您熟悉它,游戏就是 RuneScape。我的目标是模拟 RuneScape 的官方服务器软件,因此我的可以与他们的客户之一一起使用。这是一种流行的做法——参见www.runelocus.comwww.rune-server.org,即

我的问题是:你认为这会是一个好的实现吗?仅仅拥有一个反应堆是一个更好的主意吗?还是我应该使用更多?我猜接收和发送的数据大致相同,可能在高优先级反应堆上多一点(这就是为什么它是高优先级的。)

此外,当我将其定义为高优先级时,我实际上并没有将其优先于标准反应器。它只是处理被认为比游戏包更重要的任务。

非常感谢任何反馈:) 如果需要任何澄清/解释,请让我知道!

4

2 回答 2

0

正如我在 Rune-Server 上多次解释的那样,这是一种理想的方法。它对 RuneScape 协议(可能还有其他基于循环的游戏)非常有利。

最终目标是避免和减少将网络帧编码/解码为数据包对象并将它们排队以供以后处理的开销。如果您可以安全地直接从缓冲区中读取数据,同时遵守 RuneScape 的基于循环的处理并且无需任何同步,那么您就可以从该任务中消除尽可能多的开销。

第二个高优先级反应器的目的不是出于性能原因 - 它是为了减少接受客户端和登录过程的延迟。它也适用于缓存更新,它绝对需要尽可能少的延迟。

于 2012-06-23T06:26:15.313 回答
0

你认为这将是一个很好的实施吗?

对于 100 - 1000 个连接,我会为每个连接模型使用一个/两个线程,并使用阻塞 NIO 或旧 IO。这通常更容易实现,并且对于这个数量的连接几乎同样有效。如果你有免费的核心,你可以做得越简单越好。显然,这个模型可以毫无问题地使用你所有的内核。;)

于 2012-06-15T07:36:10.673 回答