【问题标题】:C++ Good practices for a client-server multiplayer game客户端-服务器多人游戏的 C++ 良好实践
【发布时间】:2014-07-14 08:46:15
【问题描述】:

请注意,我是线程和 WinSock 的新手。

对于一个大学项目,我必须创建一个用 C/C++ 编写的简单多人游戏,使用 WinSock 进行通信,使用 WinAPI 线程处理多个客户端(最多 4 个)。

游戏非常简单,玩家沿着棋盘移动他们的点并留下他们的痕迹。在给定时间内设法覆盖最大区域的玩家赢得了比赛。

在客户端应用程序上,我正在运行 2 个线程。第一个将有关按键的信息发送到服务器。第二个从服务器接收数据(所有玩家的坐标)并绘制世界。

在服务器端,我为每个客户端运行 1 个线程来接收他的输入,然后在服务器上更新他的坐标。还有另一个线程执行逻辑(检查碰撞,检查玩家是否没有离开屏幕等)并不断向所有客户端发送玩家坐标。

我在两边都使用阻塞套接字。

我为 2 名玩家测试了游戏,服务器和客户端都在同一网络中的不同机器上,结果玩家体验到明显的延迟并且不流畅。

我的方法完全错误吗?为多人游戏创建服务器和客户端应用程序的最佳方式是什么?

【问题讨论】:

    标签: c++ multithreading client-server winsock2


    【解决方案1】:

    套接字通常会尝试将多条小消息组合成一次传输以提高网络效率。但这会减慢大多数消息的传输速度,因为它们会在缓冲区中停留一段时间,希望在传输之前获得更多数据。这就是“Nagle 算法”。您可以尝试使用带有 TCP_NODELAY 的 SetSocketOpt 将其关闭。这应该会减少延迟。

    对于本地网络上的少数玩家,您可以考虑使用点对点通信方案而不是使用服务器。通过服务器路由所有内容至少会使通信延迟加倍。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-19
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多