【问题标题】:Timer anti cheat technique定时器反作弊技术
【发布时间】:2016-11-04 02:03:57
【问题描述】:

假设我正在开发一款游戏,并且存在重生之类的东西。用户可能会在 15 分钟后重生。有什么常见的做法可以避免时间作弊吗?我的意思是,没有什么可以阻止用户更改系统时间并将其设置为未来。我知道,这部分可以通过使用服务器端来解决,但没有什么可以阻止用户完全禁用网络。 PS。该游戏是跨平台的,因此该解决方案对于 antroid 和 iOS 来说都很有趣。 PS2。我知道一些有解决方案的游戏。

【问题讨论】:

    标签: android ios timer anti-cheat


    【解决方案1】:

    这实际上不是答案,而只是一个想法。 如果我们使用 tickCount 会怎样?每个操作系统都有这个属性。 例如,Android 中的 android.os.SystemClock.elapsedRealtime()[NSProcessInfo processInfo].systemUptime 在 iOS 中 他们应该提供所需的值。

    【讨论】:

      【解决方案2】:

      对于这样的事情,您可以简单地启动自己的计时器,完全独立于系统时间。如果您在玩家死亡时开始 15 分钟倒计时,他们将无法修改您的内部计时器。我对 iOS 开发人员不太熟悉(NSTimer 看起来很有可能),但我知道在 Android 中它很简单:

      // create 30 second internal countdown timer
      new CountDownTimer(30000, 3000) {
      
       public void onTick(long millisUntilFinished) {
           // store time remaining in database every 3 seconds in case user exits the game
           dbHelper.updateDeathTimer(millisUntilFinished);
       }
      
       public void onFinish() {
           // player respawns now
       }
      }.start();
      

      为了解决玩家关闭游戏的问题,我建议您还设置内部计时器,以定期将其当前状态缓存在数据库中,如果您要坚持使用 30 秒左右的话15 分钟计时器。

      下面是一些伪代码,说明当玩家在死亡时退出游戏并且我们的重生计时器仍在进行中时的样子。

      // When game resumes check database and begin updated death timer if necessary
      onGameResume() {
          if(dbHelper.isUserDead()) {
              // resume respawn timer 
              new CountDownTimer(dbHelper.getRespawnTime(), 15000) {
      
                public void onTick(long millisUntilFinished) {
                  // store time remaining in database every 15 seconds in case user exits the game
                  dbHelper.updateDeathTimer(millisUntilFinished);
                }
      
                public void onFinish() {
                  // player respawns now
                }
              }.start();
          }
      }
      

      【讨论】:

      • 这是个好主意,但如果应用程序被用户杀死 - 它将无法工作。对吗?
      • @DeepThought 为了解决这个问题,您需要在关闭应用程序之前将计时器的当前状态存储在某种持久存储 (DB) 中。当应用程序(或应用程序中的特定游戏)恢复时,当然会检索并恢复计时器。
      • 它无法帮助我检测应用程序处于非活动状态的时间。
      • @DeepThought 作为备份,您还可以设置内部计时器以定期将其当前状态缓存在数据库中,例如每 30 秒左右,如果您要坚持使用15 分钟计时器。
      • @DeepThought 只是好奇,您为什么需要知道应用程序处于非活动状态的时间?
      【解决方案3】:

      您可以存储事件的时间(在您的情况下生成),然后对其运行 timeIntervalSinceReferenceDate 并查看它是否超过您的限制(15 分钟)。

      iOS 端的风险是应用进入后台,计时器停止。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-19
        • 2018-09-04
        • 2014-01-16
        • 1970-01-01
        • 2019-02-01
        • 2017-01-04
        • 1970-01-01
        • 2016-11-26
        相关资源
        最近更新 更多