【问题标题】:Loop forever and provide delta time永远循环并提供增量时间
【发布时间】:2012-12-09 09:29:30
【问题描述】:

我正在编写一个 HTML5 游戏开发 Javascript 框架,我想为用户提供上一个刻度和当前刻度之间的时间差。

setInterval(tick, 16.6666666);

function tick() {
  update();
  draw();
}

这就是我拥有的,但我想拥有:

while (true) {
  /* Calculate delta time */

  tick(dt);
}

function tick(dt) {
  update(dt);
  draw();
}

我试过了,使用 date.getTime();计算增量时间,但 Firefox 说脚本崩溃了。显然,无限循环会崩溃。有什么建议可以解决这个问题吗?

我想要一个无限循环,可以用break 停止。我也想通过增量时间,但我知道该怎么做。

【问题讨论】:

  • 为什么要无限循环?无限循环使浏览器崩溃。
  • @Bergi 他更有可能来自像 c 或 c++ 这样的本地语言,其中主循环必须继续循环直到游戏完成,例如( while( isDone == false ){ // 运行游戏,计算增量时间,设置滴答速度等 } )

标签: javascript html loops timedelta


【解决方案1】:

这是我用的:

let lastTick = performance.now()

function tick(nowish) {
  const delta = nowish - lastTick
  lastTick = nowish

  update(delta)
  render(delta)

  window.requestAnimationFrame(tick)
}

window.requestAnimationFrame(tick)

【讨论】:

    【解决方案2】:

    愿意给我两分钱。通常我在我的游戏中使用这种 deltatime 方法:

    const perfectFrameTime = 1000 / 60;
    let deltaTime = 0;
    let lastTimestamp = 0;
    
    function start() {
        requestAnimationFrame(update);
    }
    
    function update(timestamp) {
        requestAnimationFrame(update);
        deltaTime = (timestamp - lastTimestamp) / perfectFrameTime;
        lastTimestamp = timestamp;
    
        // YOUR FRAME CODE HERE!
    
    }
    
    start();
    

    这确保您将拥有完美的 deltatime(就像 Unity deltaTime 一样),因此您可以将时间缩放到帧时间。

    【讨论】:

      【解决方案3】:

      只需维护一个带有上次更新时间的变量,并在tick 本身中计算经过的时间/增量时间。

      var lastUpdate = Date.now();
      var myInterval = setInterval(tick, 0);
      
      function tick() {
          var now = Date.now();
          var dt = now - lastUpdate;
          lastUpdate = now;
      
          update(dt);
          render(dt);
      }
      

      这是一个 JSBin,虽然我不认为它真的需要...http://jsbin.com/okimam/10

      编辑: 我必须指出,setInterval(tick, 0) 并不一定意味着将立即调用tick,两次调用之间的间隔为“0ms”。这取决于浏览器。

      【讨论】:

      • @Rikonator 请记住,滴答速度通常用于客户端和服务器来描述服务器的滴答速度,而增量速度描述实际的增量时间,如果我们想将滴答速度设置为每秒 60 个滴答声我们会让服务器线程休眠 1000 毫秒
      【解决方案4】:

      你是不是想多了?

      var myInterval = window.setInterval(calculateForDeltaHere , 20);
      
      function calculateForDeltaHere () {
          /* Calculate delta time */
          dt = Math.random();
          tick(dt);
      }
      
      function tick() {  
        update();
        draw();
      }
      

      而当你想停止间隔时

      window.clearInterval(myInterval);
      

      【讨论】:

      • 不会 Math.random() 让它随机循环吗?我希望它是一个滴答声和下一个滴答声之间的实时时间。见en.wikipedia.org/wiki/Delta_timing
      • 如果 Math.random() 是指实际计算增量时间,还有一个问题 - setInterval 每 20 毫秒运行一次,而不是尽可能运行无限循环。
      • Math.random 只是我卡在那里的代码,所以 DT 有一个循环。循环是无限的,它只是迭代时间较慢。你到底想做什么???
      • 我正在尝试尽可能多地循环,但是在两个滴答声之间传递时间。所有这一切都不会导致网站崩溃。
      • 所以你将循环分解成更小的块并使用网络工作者。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 2017-10-12
      • 2014-08-24
      相关资源
      最近更新 更多