addEventListener 与 requestAnimationFrame
addEventListener with requestAnimationFrame
我正在使用 window.requestAnimationFrame
创建游戏循环。
一切正常,但当我尝试添加事件侦听器时,它会以非常快的速度触发数百次。
我试过使用闭包,但似乎不起作用。
game.update = function(){
//code that runs every frame
window.addEventListener('keydown', function(){
console.log("message");
},false);
}
我想在 keydown 事件上调用函数 ONCE 而不是多次。
仅当添加 new 侦听器时才添加事件侦听器。多次添加 same 侦听器无效 by design.
将您的侦听器函数 移出 您分配给 game.update
的函数,这样就不会在您每次调用时都创建一个新的侦听器副本 addEventListener()
:
var updateListener = function() {
console.log('message');
};
game.update = function() {
//code that runs every frame
window.addEventListener('keydown', updateListener, false);
};
也许有点晚了,但这对我来说不太有意义。不应在 RAF 内添加侦听器。如果你把它放在外面,并将处理程序的结果分配给一个变量,然后让 RAF 获取结果并清除变量,你将获得更快和更好的 stable/predictable 性能。这对于类似的任务来说非常明显,例如在移动设备上使用设备方向侦听器进行控制器输入。事件不需要循环。设置一次,每按下一个键它就会触发一次。 RAF 应该只用于更新图形。任何其他逻辑都应该在它之外。例如,运动和游戏机制应该在一个 setInterval 中,将它们的结果指向外部但 RAF 可以访问的变量和对象。 RAF 应该只选择新的位置值并设置转换。然后运行更流畅,'time'不会加速或减速,并且在不同的设备上保持一致,无论帧率如何。
我正在使用 window.requestAnimationFrame
创建游戏循环。
一切正常,但当我尝试添加事件侦听器时,它会以非常快的速度触发数百次。
我试过使用闭包,但似乎不起作用。
game.update = function(){
//code that runs every frame
window.addEventListener('keydown', function(){
console.log("message");
},false);
}
我想在 keydown 事件上调用函数 ONCE 而不是多次。
仅当添加 new 侦听器时才添加事件侦听器。多次添加 same 侦听器无效 by design.
将您的侦听器函数 移出 您分配给 game.update
的函数,这样就不会在您每次调用时都创建一个新的侦听器副本 addEventListener()
:
var updateListener = function() {
console.log('message');
};
game.update = function() {
//code that runs every frame
window.addEventListener('keydown', updateListener, false);
};
也许有点晚了,但这对我来说不太有意义。不应在 RAF 内添加侦听器。如果你把它放在外面,并将处理程序的结果分配给一个变量,然后让 RAF 获取结果并清除变量,你将获得更快和更好的 stable/predictable 性能。这对于类似的任务来说非常明显,例如在移动设备上使用设备方向侦听器进行控制器输入。事件不需要循环。设置一次,每按下一个键它就会触发一次。 RAF 应该只用于更新图形。任何其他逻辑都应该在它之外。例如,运动和游戏机制应该在一个 setInterval 中,将它们的结果指向外部但 RAF 可以访问的变量和对象。 RAF 应该只选择新的位置值并设置转换。然后运行更流畅,'time'不会加速或减速,并且在不同的设备上保持一致,无论帧率如何。