【问题标题】:FPS game ping implementationFPS游戏ping实现
【发布时间】:2012-02-28 23:45:18
【问题描述】:

我目前正在开发一款 FPS(第一人称射击)游戏,我想在游戏中显示玩家的 ping(连接延迟)。但是最好的方法是什么?一开始我想用 GetTickCount64,但 Get Tick Count 不准确:

“GetTickCount64 函数的分辨率受限于系统定时器的分辨率,通常在 10 毫秒到 16 毫秒之间。”

我想到了使用 time.h 来查看 1 秒内有多少滴答计数。但我认为这不是最好的解决方案。

有人可以帮我解决这个问题吗?

编辑: 我正在制作一个 Windows 游戏。 (感谢 unwind 和 Lefteris 提到我忘了记下来)

【问题讨论】:

  • @Lefteris: FPS 与 FPS 不同 ;)
  • 我的意思是“第一人称射击游戏”,我在问题中添加了平台。
  • 嗯......笑脸告诉我我在这里遗漏了一些重要的东西:P 它是什么? :P
  • @Lefteris:FPS 在这种情况下的意思是“第一人称射击游戏”
  • 哈哈哈......这让我的初步评论进入了离题 cmets 的黄金名单。我的头脑从来没有做出相关性......应该知道。谢谢尼克拉斯 :)

标签: c++ connection ping frame-rate gettickcount


【解决方案1】:

我认为最好的方法是简单地对服务器主机执行 ICMP 回显。这样,您显示的 ping 将与玩家可以自己测量的值相匹配,这很好。此外,根据我的经验,您只应该期望像 ping 这样的毫秒级分辨率。我知道 Linux 做得更好,但你没有提到平台和游戏,Windows 非常流行。

【讨论】:

  • 这是我正在制作的 Windows 游戏。我已经有一个给客户端的信息数据流。所以我认为将这个添加到那个是很糟糕的。这样会占用更少的带宽。
【解决方案2】:

如果您正在寻找 Windows 解决方案,请尝试QueryPerformanceCounter

以下代码由 BobJoy1 发布。 您必须将两次调用之间的差异除以 CPU 频率,如下所示:

LARGE_INTEGER start;
::QueryPerformanceCounter(&start);
// do something
LARGE_INTEGER stop;
::QueryPerformanceCounter(&stop);

LARGE_INTEGER proc_freq;
::QueryPerformanceFrequency(&proc_freq);
double frequency = proc_freq.QuadPart;
double seconds_elapsed = ((stop.QuadPart - start.QuadPart) / frequency);

【讨论】:

  • 请注意,QueryPerformanceFrequency 只需要调用一次。它在整个程序中不会改变,但在不同的计算机上可能会有所不同。
  • 谢谢,这将非常有帮助!
  • 如果您在 Windows 中,则 QueryPerformanceCounter 为 +1。肯定会被证明是有用的。
猜你喜欢
  • 2016-04-14
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多