问题描述
这是一个关于 requestAnimationFrame()
的高级问题。
我认为the proper use of as on MDN如下:
也就是说,它类似于一个 setTimeout()
,比如说,当屏幕将被重新绘制时,告诉我以便我可以做一些类似于“当你要给出最终考试,让我知道这样我就可以学习了,我不想在那之前学习浪费我的时间。
所以代码是:
const elDisplay = document.querySelector("#display");
const startTime = Date.now();
let runCount = 0;
function updateData(timestamp) {
runCount++;
elDisplay.textContent = `${Date.now()}\n${timestamp}\n${(Date.now() - startTime) / 1000}\n${timestamp / 1000}\n${runCount}\n${runCount / (timestamp / 1000)}`;
requestAnimationFrame(updateData);
}
requestAnimationFrame(updateData);
#display {
font: 21px Consolas,Monaco,monospace;
white-space: pre;
}
<div id="display"></div>
每秒可以调用大约 60 次,符合 MDN 文档。
当上面的程序运行时,最后一个数字是每秒调用回调的次数。
但是,如果说是requestAnimationFrame()
的不当使用或滥用,如下,我每秒能够获得大约250次重绘。那是什么意思呢?这是否意味着可以将 requestAnimationFrame()
推到更高的限制?尤其是现在的处理器有4核、8核、12核,显卡每1.5到2年就会增加2倍的功率,所以重绘的次数也许可以推。我查看了数据,发现经过的秒数是准确的,因此不会向 requestAnimationFrame()
提供回调溢出(每个回调都受到尊重)。
版本 2:
const elDisplay = document.querySelector("#display");
const startTime = Date.now();
let runCount = 0;
function updateData(timestamp) {
runCount++;
elDisplay.textContent = `${Date.now()}\n${timestamp}\n${(Date.now() - startTime) / 1000}\n${timestamp / 1000}\n${runCount}\n${runCount / (timestamp / 1000)}`;
}
function makeRequest() {
setTimeout(() => {
requestAnimationFrame(updateData);
makeRequest();
},0);
}
makeRequest();
#display {
font: 21px Consolas,monospace;
white-space: pre;
}
<div id="display"></div>
我能够每秒获得大约 200 次更新。如果是下面的版本 3,我什至可以在 Google Chrome 上获得 250 个更新。那是什么意思呢?意思是 requestAnimationFrame()
可以推送吗?或者我怀疑的一件事是,这是否意味着屏幕仍然仅以每秒 60 次的速度重绘,但每秒完成 250 次的事实仅意味着调用了 4 个回调并进行了“不必要的”更新DOM 的 4 次更新中,真的只有 1 次有效地显示在屏幕上吗? (也就是说,在对 requestAnimationFrame()
的 240 次调用中,对于一组 4 次对 requestAnimationFrame()
的调用,只有 1 次真正有用,而前面的 3 次被浪费了?)它究竟是如何工作的?>
版本 3:
const elDisplay = document.querySelector("#display");
const startTime = Date.now();
let runCount = 0;
const intervalID = setInterval(() => {
runCount++;
requestAnimationFrame((timestamp) => {
elDisplay.textContent = `${Date.now()}\n${timestamp}\n${(Date.now() - startTime) / 1000}\n${timestamp / 1000}\n${runCount}\n${runCount / (timestamp / 1000)}`;
});
},1);
#display {
font: 21px Consolas,monospace;
white-space: pre;
}
<div id="display"></div>
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)