请参阅此小提琴 - http://jsfiddle.net/rnqLfz14/28/
[此代码不是我的 - http://www.isaacsukin.com/news/2015/01/detailed-explanation-javascript-game-loops-and-timing]
//....
function stop() {
running = false;
started = false;
cancelAnimationFrame(frameID);
}
//...
function mainLoop(timestamp) {
// Throttle the frame rate.
if (timestamp < lastFrameTimeMs + (1000 / maxFPS)) {
frameID = requestAnimationFrame(mainLoop);
return;
}
delta += timestamp - lastFrameTimeMs;
lastFrameTimeMs = timestamp;
begin(timestamp, delta);
if (timestamp > lastFpsUpdate + 1000) {
fps = 0.25 * framesThisSecond + 0.75 * fps;
lastFpsUpdate = timestamp;
framesThisSecond = 0;
}
framesThisSecond++;
var numUpdateSteps = 0;
while (delta >= timestep) {
update(timestep);
delta -= timestep;
if (++numUpdateSteps >= 240) {
panic();
break;
}
}
draw(delta / timestep);
T.textContent = timestamp;
if (timestamp >= 6000.0) {
T.textContent = "Stopped!";
stop();
}
end(fps);
frameID = requestAnimationFrame(mainLoop);
}
//...
cancelAnimationFrame函数不会停止动画循环。有什么建议吗?我已经摸了好头很长时间了,欢迎任何建议。
答案 0 :(得分:6)
当满足stop()
的条件时,会调用stop()
,但代码会继续,因此会请求新的rAF。
只需在停止通话后添加退货以防止这种情况发生(或使用else
):
...
if (timestamp >= 6000.0) {
T.textContent = "Stopped!";
stop(); // stop() is just a sub-routine here and will continue after being called
return; // <--- here
}
...
<强> Modified fiddle 强>