我正在编写多人游戏的服务器端网络。该游戏是一款RPG,它拥有2000名玩家的绝对最大容量,但它实际上最多可以达到300名玩家,尽管它可能更高或更低。在最长的时间里,每次我必须在很多客户端进行网络连接时,我都坚持使用NIO,因为它不需要使用数百个线程。最近,我遇到了一个PowerPoint演示文稿,其中详细描述了这两个模型,它几乎使得每个客户端的模型看起来优于NIO。我还找到了一些地方,它表明老IO实际上也可以胜过NIO。
PowerPoint可以在这里找到(它有点旧):http://www.mailinator.com/tymaPaulMultithreaded.pdf。
我还没有写任何内容,所以如果我不得不改变整个网络设计,那么从一开始就不会有问题。我没有时间压力。最初,我正在使用NIO设计反应器模式实现(选择一个事件,调度一个处理事件的处理程序)。
可在此处找到更多信息:http://en.wikipedia.org/wiki/Reactor_pattern
我的整个reactor实现旨在使用单个线程。由于我读到旧的IO可以超越,它实际上让我处于两难境地。我不想设计一个复杂的NIO系统,只使用多个线程来充分利用所有的CPU能力,但我也畏惧让一个应用程序使用300多个线程的想法。哪种设计适合我的目的?每个客户端的线程优势在于它本质上真正使用了所有CPU功能,但同时也使系统陷入困境。更不用说,单个线程的堆栈大小占用了大量内存(乘以几百倍)。我应该坚持反应堆模式吗?
我知道这个问题有点含糊不清,但我觉得我需要专门针对我的情况问一个问题,因为我在这个网站上找不到问题,也没有找到解决我的问题的网站。有一个关于游戏,但该游戏旨在处理成千上万的玩家。
非常感谢!如果您需要任何澄清,请询问!
答案 0 :(得分:10)
我不想设计一个复杂的NIO系统,只使用多个线程来充分利用所有的CPU能力,但我也畏惧让一个应用程序使用300多个线程的想法。哪种设计适合我的目的?
我们的JVM连续运行500多个线程(现在它们位于~700),并且在1000秒内达到峰值。我认为没有理由认为800线程在某种程度上“畏缩”值得。当你达到10,000个线程(作为球场号码)时我会开始担心 - 如果你在32位以下运行,可能会更少。当你进入1000s时,你肯定会分配更多的内存,但是1k线程以下的任何东西都不应该是个问题。这是thread creation numbers上的一个很好的页面。
当您拥有大量数量的连接且不经常使用IO时,NIO效率最高。它解决了许多问题,当谈到异步通信时,你可以用NIO做的事情,“老IO”从功能的角度来看不能做(例如可中断通道和非阻塞IO),但单线程处理程序是一个更简单的模型,我并不惊讶它在许多配置中可以胜过NIO实现。使用NIO,您在Java代码中执行了大量操作,这些操作是在JVM中完成的,甚至是本机代码中的内核。流的多路复用和就绪IO的处理都是“免费”(就复杂性而言)使用“旧IO”模型获得的所有内容。
我会保持简单并坚持每个客户端的模式,直到你有充分的理由去解决复杂性问题。