javascript - 如何将 setTimeout 操作更改为 requestAnimationFrame?
问题描述
我有这行简单的代码:
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
处理requestAnimationFrame
?
[更新]:我设法通过 using 运行requestAnimationFrame(this._boundTimeout)
,但它忽略了 FPS,因此几乎不可能捕捉到它的运动。在添加方面this._gameSpeed
,我如何处理添加到requestAnimationFrame
?
解决方案
您必须自己计算增量时间,并且仅在它大于您的 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
推荐阅读
- php - PHP 变量不保留任何数据,也不使用 MySQLI Bindparams 插入 Mysql 数据库
- windows - Chocolatey 应用程序安装失败,错误消息为 The remote server returned an error: (403) Forbidden
- compression - 有没有办法合并 rsync 和 tar(压缩)?
- python - 如何从 https://pypi.org/simple/* 手动下载的包中安装 TensorFlow?
- c# - 中间件架构 asp.net 令牌身份验证检查令牌是否过期
- c++ - 如何在 C++ Windows 中向/从批处理文件传递参数并获取返回的退出值
- javascript - NodeJS:变量未更新
- apache-kafka - 从任何 Java 应用程序(不使用 Kafka Consumer 或 Producer)向 Confluent Control Center 发送指标的任何方式
- flutter - 无法将 flutter_blue 包含到我的 Flutter 项目中
- python - 将 xls 文件附加到电子邮件并发送 - 通过 python