C++ 为游戏优化局域网服务器

C++ 为游戏优化局域网服务器,c++,c,optimization,networking,network-programming,C++,C,Optimization,Networking,Network Programming,我是一个学校游戏项目的网络程序员。我们希望在局域网上同时拥有多达16名玩家。我正在使用服务器-客户机模型,并且正在为每个加入的客户机创建一个新线程。但是,如果非阻塞端口从客户机接收到任何信息,那么仅仅检查每个线程就会浪费大量CPU时间 我一直在读Anthony Johns和Jim Ohlund的《Microsoft Windows网络编程》。他们提到了两种不同的服务器客户端应用程序模型 1.) 使用重叠IO套接字选项 将重叠结构和WorkerRoutine传递给WSARecv 调用WSAWai

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

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

1.)

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

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

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

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

只要让团队中的每个线程在端口上等待,当它解除阻塞时,它就会有一些事情要做,这样你就不会浪费时间旋转。如果您有其他事情要做(比如更新游戏状态),请使用根本不做任何网络I/O的其他线程来完成

并确保使用同步原语(信号量)来防止与您自己失去同步


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

发布你认为是在浪费时间的代码,有人可能会建议一个更优化的解决方案。否则,这里就没有真正的编程问题了。你读过关于C10K问题的书吗?它涉及到你的一些问题。因此,当我的端口阻塞时,它是浪费CPU周期还是休眠?阻塞的线程将进入休眠状态,直到数据到达。