RequestAnimationFrame 在代码中的位置
RequestAnimationFrame position in code
有人可以分享您应该在动画循环中调用 RequestAnimationFrame 的位置吗?它应该在循环的开头还是循环的结尾?我已经看到它在循环开始时用它写了很多次,但是在循环的底部会不会更好,这样它就不会在它可能还在处理的时候被调用?或者 RequestAnimationFrame 是否检查它是否已经 运行ning 而不是 运行 如果它已经 运行ning 了?还是根本不重要?我试过移动它,但没有注意到我的代码有任何变化。
例如顶部:
function gameLoop() {
RequestAnimationFrame(gameLoop);
renderFrameHere();
}
例如底部:
function gameLoop() {
renderFrameHere();
RequestAnimationFrame(gameLoop);
}
谢谢,
我见过大多数程序员将 requestAnimationFrame 放在循环的底部...
但我不确定是否有必要。假设您开始第一个循环。然后,在第一个循环中,您 立即 请求第二个循环。第一个循环将始终在尝试第二个循环之前完全执行。
这是因为 requestAnimationFrame
为您排队多个未完成的帧循环,因此如果当前循环运行时间过长,它只会延迟下一个循环,直到当前循环结束。使用 rAF 时不会出现丢帧循环。
显示 requestAnimationFrame 如何排队循环的演示
这个演示运行 10 个循环,requestAnimationFrame
放在循环函数的顶部。循环中的代码有意延迟 1 秒——比 1/60 秒的典型 rAF 循环长得多。即便如此,rAF 正确执行了所有 10 个循环,即使每个循环花费的时间比通常的每个 rAF 循环 17 毫秒要长得多。
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height;
var loopCount=0;
requestAnimationFrame(loop);
function loop(time){
loopCount++;
if(loopCount<10){ requestAnimationFrame(loop); }
var t1=performance.now()+1000;
while(performance.now()<t1){}
ctx.fillText('Loop count: '+loopCount+', time: '+time,20,loopCount*15);
}
body{ background-color: ivory; }
#canvas{border:1px solid red; margin:0 auto; }
<h4>rAF at top of loop still runs all 10 frames even<br>if the code in the loop takes extra long to complete</h4>
<canvas id="canvas" width=300 height=300></canvas>
有人可以分享您应该在动画循环中调用 RequestAnimationFrame 的位置吗?它应该在循环的开头还是循环的结尾?我已经看到它在循环开始时用它写了很多次,但是在循环的底部会不会更好,这样它就不会在它可能还在处理的时候被调用?或者 RequestAnimationFrame 是否检查它是否已经 运行ning 而不是 运行 如果它已经 运行ning 了?还是根本不重要?我试过移动它,但没有注意到我的代码有任何变化。
例如顶部:
function gameLoop() {
RequestAnimationFrame(gameLoop);
renderFrameHere();
}
例如底部:
function gameLoop() {
renderFrameHere();
RequestAnimationFrame(gameLoop);
}
谢谢,
我见过大多数程序员将 requestAnimationFrame 放在循环的底部...
但我不确定是否有必要。假设您开始第一个循环。然后,在第一个循环中,您 立即 请求第二个循环。第一个循环将始终在尝试第二个循环之前完全执行。
这是因为 requestAnimationFrame
为您排队多个未完成的帧循环,因此如果当前循环运行时间过长,它只会延迟下一个循环,直到当前循环结束。使用 rAF 时不会出现丢帧循环。
显示 requestAnimationFrame 如何排队循环的演示
这个演示运行 10 个循环,requestAnimationFrame
放在循环函数的顶部。循环中的代码有意延迟 1 秒——比 1/60 秒的典型 rAF 循环长得多。即便如此,rAF 正确执行了所有 10 个循环,即使每个循环花费的时间比通常的每个 rAF 循环 17 毫秒要长得多。
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height;
var loopCount=0;
requestAnimationFrame(loop);
function loop(time){
loopCount++;
if(loopCount<10){ requestAnimationFrame(loop); }
var t1=performance.now()+1000;
while(performance.now()<t1){}
ctx.fillText('Loop count: '+loopCount+', time: '+time,20,loopCount*15);
}
body{ background-color: ivory; }
#canvas{border:1px solid red; margin:0 auto; }
<h4>rAF at top of loop still runs all 10 frames even<br>if the code in the loop takes extra long to complete</h4>
<canvas id="canvas" width=300 height=300></canvas>