【问题标题】:Loop every x seconds based on process speed根据处理速度每 x 秒循环一次
【发布时间】:2016-07-15 12:00:58
【问题描述】:

我正在为我的游戏实施基本的(仅针对儿童)反作弊。我为每个移动数据包添加了时间戳,并在服务器端检查这些数据包之间的时间差。

我还包含一个数据包,它根据处理速度每 5 秒发送一个时间戳。但是当PC滞后时,这似乎是一个问题。

那么我应该用什么来检查处理时间是否由于“speed hack”而变快?

我当前在客户端的循环速度检查:

this_time = clock();
time_counter += (double)(this_time - last_time);
last_time = this_time;

if (time_counter > (double)(5 * CLOCKS_PER_SEC))
{
    time_counter -= (double)(5 * CLOCKS_PER_SEC);

    milliseconds ms = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
    uint64_t curtime = ms.count();

    if (state == WALK) {
        // send the CURTIME to server
    }
}

// other game loop function

如果客户端 PC 没有因为 RAM 或 CPU 问题而出现延迟,则上面的代码可以正常工作。他们可能运行了太多的应用程序。

供参考的服务器端代码:(GoLang)

// pktData[3:] packet containing the CURTIME from client
var speed = pickUint64(pktData, 3)
var speedDiff = speed - lastSpeed
if lastSpeed == 0 {
    speedDiff = 5000
}
lastSpeed = speed

if speedDiff < 5000 /* 5000 millisec or 5 sec */ {
    c.hackDetect("speed hack") // hack detect when speed is faster than the 5 second send loop in client
}

【问题讨论】:

  • 我正在使用 VisualStudio2015
  • @MikeMB 不,我没有尝试过 stable_clock
  • 您的代码发送客户端 PC 的 system_clock 时间 - 他们可能不会将他们的 PC 同步到任何参考(即使您有),在这种情况下,您的服务器时间和他们的时间之间可能存在差异,即使没有任何与负载相关的滞后。您最好将他们的消息视为“心跳” - 预计每个消息都在最后一次的 10 秒内。
  • @TonyD 是的,我就是这么对待的。我将在我的问题中包含一些服务器端检查的代码。给我一些。
  • 刚刚编辑到问题中的服务器端检查代码确保客户端将数字 声称 至少相隔 5000 毫秒,但不执行任何服务器端检查接收消息的频率,这就是我上面所说的。

标签: c++ performance loops infinite-loop


【解决方案1】:

您的系统有一个严重的缺陷,这使得作弊者很容易绕过:它依赖于客户端提供的时间戳。您从客户端收到的任何数据都可能被作弊者操纵,因此不得信任。

如果你想检查服务器上的速度黑客:

  1. 不定期记录玩家头像的当前位置。 根据服务器时间存储每个日志的时间戳。
  2. 通过计算距离并将其除以时间戳差来测量两个此类日志条目之间的速度。

当速度大于玩家的速度限制时,你可能有作弊者。但请记住,滞后可能会导致突然出现峰值,因此最好对多个样本进行平均速度测量,以检测玩家是否在超速。这可能会降低 speedhack 检测的可靠性,但这实际上可能是一件好事,因为它使黑客更难了解他们使用的任何逃避方法的可靠性。

为避免误报,请记住跟踪任何不遵守速度限制的人为移动玩家的方式(例如在被杀死后传送到重生点)。当这样的事件发生时,当前的速度测量是没有意义的,应该丢弃。

【讨论】:

  • 是否有任何可用的资源可供我以正确的方式参考?也许是开源游戏?
  • 您可以将结果存储在某个时间范围内(例如 30 秒),然后平均存储的结果。
  • @majidarif 您需要保存的只是一个位置和一个时间戳。这不是真正的火箭科学。
  • @Philipp,所以我在想,在延迟中,数据包有时会累积并设置在一起,这意味着读取速度会更快。我查了一下,好像它太快了,这意味着数据包是作为一大块发送的。但是当进行速度破解时,数据包仍然会被逐个发送,但速度很快。
  • @majidarif 速度 = 距离除以增量时间。当您一次收到大量数据包时,它们的时间戳将相同,这意味着 delta-time 将为 0,这意味着您得到除以零,这意味着这种延迟峰值的结果无论如何都无法使用。跨度>
猜你喜欢
  • 2012-05-26
  • 2023-03-11
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
相关资源
最近更新 更多