我是学校游戏项目的网络程序员。我们希望在局域网上同时拥有多达16个玩家。我正在使用Server-Client模型,并为每个加入的客户端创建一个新线程。但是,如果非阻塞端口从客户端收到任何信息,那么只需检查每个线程就会浪费大量的CPU时间。
我一直在阅读Anthony Johns和Jim Ohlund的“Microsoft Windows网络编程”。他们提到了两种不同的服务器 - 客户端应用程序模型。
1)
2)。
我想知道哪种方法最适合我的情况。这本书说完成端口模型非常适合成千上万的客户,但这让我觉得它是为大型服务器而不是小型局域网游戏。 WorkerRoutines / Event系统似乎更简单。
答案 0 :(得分:2)
您应该停止使用非阻塞端口。它们对并发性最有用,而且你有线程。
只需让团队中的每个线程都在端口上等待,当它解除阻塞时,它就会有所作为,所以你不要浪费时间。如果您还有其他事情要做(比如更新游戏状态),请使用其他不执行任何网络I / O的线程。
并确保使用同步原语(信号量)以防止与您自己不同步。
这是超级多线程的方式,你可能应该使用它。另一种方法是使用锁步推进状态机来更新所有客户端循环。如果你想在互联网上玩游戏,这是徒劳的,因为不同的ping会使你的游戏以不同的速度运行。