我目前正在阅读Java NIO,并在过去自己做了一些实现。但是,我从来没有真正关注服务器的性能 - 这看起来真的很傻,而且确实如此。我听说有人说单螺纹反应器就好了,但我真的想利用我拥有的核心。
由于我要实现的是游戏,所以还有一些游戏逻辑线程,所以它不会占用很多线程 - 如果有的话,它可能只有两个。
这是我想出的情节:
目标:
另外,如果您熟悉它,游戏就是RuneScape。我的目标是模拟RuneScape的官方服务器软件,以便我的一个客户可以使用它。这是一种流行的做法 - 见www.runelocus.com,www.rune-server.org,即
我的问题是:您认为这是一个很好的实施吗?只是让一个反应堆更好吗?或者我应该使用更多?我猜测接收和发送的数据大致相同,可能在高优先级反应堆上多一点(这就是为什么它是高优先级的。)
此外,当我将其定义为高优先级时,我实际上并没有将其优先于标准反应器。它只是处理被认为比游戏数据包更重要的任务。
非常感谢任何反馈:)如果需要任何澄清/解释,请知道!
答案 0 :(得分:0)
你觉得这会是一个很好的实现吗?
对于100 - 1000个连接,我会使用每个连接模型的一个/两个线程来阻塞NIO或者可能是旧的IO。这通常要简单得多,并且对于这种连接几乎同样有效。如果你有免费核心,你可以做得越简单越好。显然,这个模型可以毫无问题地使用所有核心。 ;)
答案 1 :(得分:0)
正如我在Rune-Server上多次解释的那样,这是一种理想的方法。它对RuneScape协议(以及其他基于周期的游戏)非常有用。
最终目标是避免并减少将网络帧编码/解码为数据包对象的开销,并将其排队等待以后处理。如果您可以在遵守循环的情况下直接从缓冲区中读取基于RuneScape的处理并且没有任何同步,您已经从这项任务中消除了尽可能多的开销。
第二个高优先级反应堆的目的不是出于性能原因 - 它是为了减少接受客户端和登录过程的延迟。它也适用于缓存更新,它绝对需要尽可能少的延迟。