15

我正在编写多人游戏的服务器端网络。该游戏是一款角色扮演游戏,最大容量为 2000 名玩家,但实际上最多可容纳 300 名玩家,尽管可能更高或更低。在最长的时间里,每次我不得不做涉及大量客户端的网络时,我都坚持使用 NIO,因为它不需要使用数百个线程。最近,我遇到了一个 PowerPoint 演示文稿,其中详细描述了这两种模型,它几乎使每客户端线程模型看起来优于 NIO。我还发现一些地方表明旧的 IO 实际上也可以胜过 NIO。

可以在这里找到 PowerPoint(它有点旧): http: //www.mailinator.com/tymaPaulMultithreaded.pdf

我还没有写任何内容,所以如果我不得不改变我的整个网络设计,从头开始对我来说不是问题。我没有时间压力。最初,我正在使用 NIO 设计一个反应器模式实现(选择一个事件,调度一个处理程序来处理该事件)。

更多信息可以在这里找到:http ://en.wikipedia.org/wiki/Reactor_pattern

我的整个反应器实现设计为使用单个线程。因为我读到旧的 IO 可以跑赢,这实际上让我进退两难。我不想设计一个复杂的 NIO 系统,它使用多个线程来充分利用所有 CPU 能力,但我也对让单个应用程序使用 300 多个线程的想法感到畏缩。哪种设计适合我的目的?每个客户端线程的优势在于它真正利用了本质上的所有 CPU 能力,但与此同时,它使系统陷入困境。更不用说,单个线程的堆栈大小占用了大量内存(当乘以几百倍时)。我应该坚持反应堆模式吗?

I know this question is a bit ambiguous, but I feel that I need to ask a question specifically for my situation because I could not find a question on this site nor a website where it addresses an issue of my sort. There was one about a game, but the game was meant to handle tens of thousands of players.

Thanks a lot! If you need any clarification, please ask!

4

1 回答 1

10

我不想设计一个复杂的 NIO 系统,它使用多个线程来充分利用所有 CPU 能力,但我也对让单个应用程序使用 300 多个线程的想法感到畏缩。哪种设计适合我的目的?

我们的 JVM 持续运行超过 500 个线程(现在它们大约为 700 个),峰值在 1000 多个。我认为没有理由认为 800 个线程在某种程度上值得“畏缩”。当你达到 10,000 个线程(作为一个球场数字)时,我会开始担心——如果你在 32 位下运行,可能会更少。当你进入 1000s 时,你当然必须分配更多的内存,但任何低于 1k 的线程都不应该成为问题。这是一个关于线程创建编号的好页面。

当您有大量不频繁 IO 的连接时,NIO 效率最高。当涉及到异步通信时,它解决了很多问题,并且您可以使用 NIO 做一些从功能角度来看“旧 IO”无法做到的事情(例如可中断通道和非阻塞 IO),但是单线程处理程序是一个更简单的模型,我并不感到惊讶,它可以在许多配置中胜过 NIO 实现。使用 NIO,您可以在 Java 代码中执行大量操作,这些操作是在 JVM 甚至内核中以本机代码为您完成的。流的多路复用和就绪 IO 的处理都是您使用“旧 IO”模型“免费”(就复杂性而言)获得的所有东西。

我会保持简单并坚持使用每个客户端线程模式,直到您有充分的理由接受复杂性的打击。

于 2012-04-11T21:03:24.503 回答