问题
在使用requestAnimateFrame
的时候,不同的机器由于性能差异,帧率会有不小差别。比如我使用 22 款联想拯救者配 3060 的卡,官网许多案例可以跑到 165 帧,因为系统限制了最大帧率等于屏幕刷新率。 再者过高的帧率有时候会造成性能浪费,或者开发的应用需要兼顾到移动端的性能,那么控制帧率就变得必要了。
思路
在帧回调函数里通过判断距离上一帧回调函数更新的时间 delta
和 dt
的和来更新 dt
, 最后 dt
对帧间隔取余,这样做的目的是计算当前帧间隔和新帧间隔的差异,然后立即更新,下几帧就迅速趋近新的帧间隔了,奉上我的灵魂手绘(processon 真香):
看代码:
js
const frameRate = 30;
let dt = 0;
let frameInterval = 1 / frameRate;
const clock = new THREE.Clock();
function render() {
requestAnimateFrame();
let time = clock.getDelta();
const delta = Math.min(time, frameInterval);
dt += time;
if (dt > frameInterval) {
// do frame logic
}
// renderer.render(scene, camera);
dt = dt % frameInterval;
}
如果应用不是很复杂,这样简单的几行代码就能实现帧率精准控制,如果有帮助,赶紧来帮作者点个赞吧😁