c++ - 为游戏优化 LAN 服务器

标签 c++ c optimization networking network-programming

我是学校游戏项目的网络程序员。我们希望 LAN 上同时有多达 16 名玩家。我正在使用服务器-客户端模型,并为每个加入的客户端创建一个新线程。然而,大量的 CPU 时间被浪费在检查每个线程是否非阻塞端口已经从客户端接收到任何东西。

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

1.)

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

2.)

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

我想知道哪种方法最适合我的情况。书中说 Completion Port 模型非常适合成千上万的客户端,但这让我认为它是为大型服务器而不是小型 LAN 游戏而设计的。 WorkerRoutines/Event 系统看起来更简单。

最佳答案

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

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

并确保使用同步原语(信号量)来避免与自己不同步。

这是实现它的 super 多线程方式,您可能应该使用它。另一种方法是使用锁步推进状态机来更新所有客户端循环。如果您想通过 Internet 玩游戏,这将毫无用处,因为不同的 ping 值会使您的游戏以不同的速度运行。

关于c++ - 为游戏优化 LAN 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1731226/

相关文章:

c++ - 使用 Qt 可以同时处理多个应用程序的输入音频吗?

C++ 使用 std::function 从命名空间中返回一个函数

c++ - 如何快速找到 vector 和的最大元素?

c - 在 Sublime Text 2 中编译 C 程序时出现 scanf() 错误

php - 优化用户兴趣排名算法

java - 如何减少此代码重复

c++ - 为什么我的嵌套 QEventLoop 不能为我的 QThread 传递所有事件?

c - 程序收到信号 SIGPIPE,Broken pipe

java - Java 中的 boolean 表达式优化

iphone - 如何在iPhone应用程序中通过修改图像的像素值来为UIImage添加色调效果