【问题标题】:Race car game, car moving faster on faster computer赛车游戏,汽车在更快的计算机上移动得更快
【发布时间】:2011-01-13 03:52:17
【问题描述】:

我明白它为什么会这样,但我真的不知道如何防止这种情况。所以场景是,每一帧我都会将汽车移动一定的预定义像素。当我使用慢速或更快的计算机时会发生什么......好吧,我每秒获得的帧数更少或更多,因此汽车移动得更慢或更快。我想知道如何防止这种情况发生。

我怀疑我在使用任何库时都会遇到同样的问题...这是我第一次做这样的实时工作。

【问题讨论】:

标签: frame-rate sfml


【解决方案1】:

根据计时器而不是帧率移动汽车。即汽车模型应该独立于显示表示。

【讨论】:

  • 如果我理解正确,计时器会计算每帧之间的时间吗?
  • @Apoc,是的。如果您基于时间而不是帧率,您将拥有更加一致的游戏
【解决方案2】:

您必须在移动汽车和图纸之前节省时间。
在所有计算后节省时间。
以 N 像素/秒的速度移动您的汽车

【讨论】:

    【解决方案3】:

    运动应该受到“实时”时间延迟的限制,即您的汽车将以每个时间片 x 像素的速度移动。

    【讨论】:

      【解决方案4】:

      读取实时时钟,并将汽车移动到经过时间的适当距离。如果计算机太慢,这可能看起来有点“生涩”,但会使汽车速度独立于 CPU 速度。

      【讨论】:

        【解决方案5】:

        您可以通过使用精确的计时器和矢量数学来解决这个问题。

        因此,为了争论,我们建议您的绘图代码可以在任何时间点调用,例如相隔 1 秒或相隔 3 秒或相隔 0.02 秒。

        将汽车的移动速度设为每秒 40 像素。

        因此,它应该移动的像素数是 (TIME_NOW - LAST_FRAME_TIME) * 40px。

        【讨论】:

          【解决方案6】:

          您需要将帧速率限制为每秒 X 帧(最常见的是 60 FPS)。这是包括 SFML 在内的大多数多媒体框架中的常见特性。对于 SFML,我会研究 Window/RenderWindow 方法 SetFramerateLimit(unsigned int Limit)

          【讨论】:

          • 当帧速率低于 60 时,这并不能解决问题。
          【解决方案7】:

          我怀疑你当前的代码看起来像这样

           // to be called every frame
           void OnEveryFrame()
           {
               MoveCar();
               DrawCarToScreen();
           }
          

          但应该是这样的:

           // to be called - for example - 50 times per second:
           void OnEveryTimerEvent()
           {
               MoveCar();
           }
          
           // to be called every frame
           void OnEveryFrame()
           {
               LockTimerEvents();
               DrawCarToScreen();
               UnlockAndProcessOutstandingTimerEvents();
           }
          

          当然,你必须设置一个相应的计时器事件。

          【讨论】:

            【解决方案8】:

            您需要fix your timestep。基本上,您将汽车移动的每一帧距离都会根据自上次更新调用以来实际经过的时间而变化。这样,无论帧率如何,您都能获得正确的速度。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-10-13
              • 1970-01-01
              相关资源
              最近更新 更多