如何将setTimeout操作更改为requestAnimationFrame?

时间:2018-10-04 10:13:17

标签: javascript

我有以下简单的代码行:

timeout() {
  this.tick();

  if (this._running) {
    this._timeoutId = window.setTimeout(this._boundTimeout, this._gameSpeed);
  }
}

startRunning() {
  this._timeoutId = window.setTimeout(this._boundTimeout, this._gameSpeed);
  this._running = true;
}

我知道在requestAnimationFrame中,您只需要像这样的回调作为参数

this._timeoutId = window.requestAnimationFrame(timeout);

但是我应该在哪里处理this._gameSpeed的{​​{1}}?

[更新] :我设法使用requestAnimationFrame进行跑步,但是它忽略了FPS,因此几乎无法捕捉其运动。就添加requestAnimationFrame(this._boundTimeout)而言,如何处理将其添加到this._gameSpeed

1 个答案:

答案 0 :(得分:0)

您必须自己计算增量时间,并且只有在它大于FPS时才做事。

这是一个带有示例https://jsfiddle.net/qnkf7x9g/

的小提琴

这是相关代码。

    const FPS = 2; // Frames per second
    const delay = 1000/FPS;
    let previous = 0;
    
    const loop = () => {
    	requestAnimationFrame(loop);
    
    	const now = Date.now();
    
    	if (now - previous < delay) {
      	    // Do nothing
    		return;
    	}
    
    	previous = now;
    
    	// Do something
    	console.log("Hello");
    };
    
    
    loop(); // Start the loop