1

我正在制作多人游戏,并且经常想测试它是否在全球网络上完美运行,因为有时它只能在本地运行,所以我怎么能做到这一点而不将我的客户发送给朋友进行测试。

4

2 回答 2

0

如果您想针对“全球网络”对其进行测试 - 您必须以这种方式进行测试。有很多事情可能会出错,这在本地网络上不是问题。就在我的头顶

  1. 延迟(对游戏很重要)
  2. NAT(问题的常见原因取决于您的游戏架构——如果是 P2P 则更是如此)
  3. 安全
  4. 连接错误(Wifi/3G 间歇性丢失)
于 2013-10-05T10:36:15.370 回答
0

当您通过 Internet 交谈而不是在 localhost 或本地网络上运行时,网络的许多方面通常会略有不同。

  • 可能会发生各种延迟,这可能会在您的代码中抛出一些糟糕的假设。
  • TCP 流可能会受到 TCP 流控制的影响(当 TCP 窗口填满时,发送方将停止发送并向您报告事实(或者如果您使用异步 API,则可能不报告))。
  • TCP 读取在 localhost 上返回“完整消息”,您自己的网络可能会开始返回消息片段。
  • UDP 数据报可能会丢失并且永远不会到达,或者可能会多次或以任何顺序到达。

因此,您认为您需要针对这些很少出现在您自己的网络上的边缘情况测试您的代码是正确的。你也认为仅仅将客户端发送给朋友,或者在远程机器上运行它是不够的,这也是正确的。

一种方法是构建一个专用的测试客户端,它发送已知的游戏并检查它是否得到预期的响应(这有多难取决于您的协议和您的游戏)。一旦你完成了这项工作,你就可以让测试客户端故意以测试上述项目的方式发送数据。因此,如果您使用的是 UDP,您可能会在您的测试客户端中放置一些代码,以便它有时根本不会费心发送 UDP 数据报。客户应该认为它发送了它。网络层简单地抛弃了它。这会测试您的 UDP 协议是否有丢失的数据报。然后多次发送一些数据报,然后发送一些乱序等。对于 TCP 添加延迟,将逻辑“消息”分解为单独的网络发送,它们之间有很大的延迟;

完成此操作后,您需要对客户端代码执行相同的操作,也许可以通过在服务器的网络代码中添加“模糊测试”选项来执行相同的操作...

就我个人而言,我倾向于尝试退后一步,并在专门的“单元测试”中尽可能多地做这件事(我知道有些人会说这些不是单元测试,你可以随意称呼它们,写出来! )。这些测试使用真实网络(与测试创建的虚拟服务器/客户端对话)来锻炼您的网络层,并验证可怕的边缘情况。

于 2013-10-08T15:03:59.233 回答