优化游戏的LAN服务器

时间:2009-11-13 19:10:51

标签: c++ c optimization networking network-programming

我是学校游戏项目的网络程序员。我们希望在局域网上同时拥有多达16个玩家。我正在使用Server-Client模型,并为每个加入的客户端创建一个新线程。但是,如果非阻塞端口从客户端收到任何信息,那么只需检查每个线程就会浪费大量的CPU时间。

我一直在阅读Anthony Johns和Jim Ohlund的“Microsoft Windows网络编程”。他们提到了两种不同的服务器 - 客户端应用程序模型。

1)

  • 使用重叠的IO套接字选项
  • 将重叠的结构和WorkerRoutine传递给WSARecv
  • 调用WSAWaitForMultipleEvents()或SleepEX()将线程设置为alertable。
  • 处理WorkerRoutines中的已接收数据。

2)。

  • 使用重叠的IO套接字选项
  • 创建Io完成端口
  • 创建ServerWorkerThreads(无论你有多少个CUP)
  • 将完成端口与Socket。
  • 关联
  • 在ServerWorkerThread中调用GetQueuedCompletionStatus并处理收到的数据。

我想知道哪种方法最适合我的情况。这本书说完成端口模型非常适合成千上万的客户,但这让我觉得它是为大型服务器而不是小型局域网游戏。 WorkerRoutines / Event系统似乎更简单。

1 个答案:

答案 0 :(得分:2)

您应该停止使用非阻塞端口。它们对并发性最有用,而且你有线程。

只需让团队中的每个线程都在端口上等待,当它解除阻塞时,它就会有所作为,所以你不要浪费时间。如果您还有其他事情要做(比如更新游戏状态),请使用其他不执行任何网络I / O的线程。

并确保使用同步原语(信号量)以防止与您自己不同步。

这是超级多线程的方式,你可能应该使用它。另一种方法是使用锁步推进状态机来更新所有客户端循环。如果你想在互联网上玩游戏,这是徒劳的,因为不同的ping会使你的游戏以不同的速度运行。