【问题标题】:More efficient to check if a variable is set, then set it, or just constantly set it?更有效地检查是否设置了变量,然后设置它,或者只是不断地设置它?
【发布时间】:2012-12-27 00:41:04
【问题描述】:

制作游戏...这样做更有效率?

if (37 in keysDown) { //left arrow
    if (sprite.state != 'left') sprite.state = 'left';
}

还是这个?

if (37 in keysDown) { //left arrow
    sprite.state = 'left';
}

这是在我的游戏更新函数中调用的(不断地,尽可能快)。

旁注: 这是我的输入键检查代码。

//input
var keysDown = {};
window.addEventListener('keydown', function(e) {
    keysDown[e.keyCode] = true;
});
window.addEventListener('keyup', function(e) {
    delete keysDown[e.keyCode];
});

【问题讨论】:

  • keydown 和 keyup 会触发事件,使用那些触发器
  • @popnoodles:我想他希望它在游戏循环中只要按住键就触发;不是一次,也不是自动重复。
  • 我怀疑这通常是可以回答的,因为对于不同的 JS 运行时,这可能(并且将会)有所不同。
  • 谢谢大家。 popnoodles 的评论对我来说是最有用的,因为我正在使用 keydown 和 keyup 事件从数组中添加/删除键。只需在这些事件上设置 sprite.state 将是最好的方法。
  • @Thilo,这取决于后台写入操作的成本。读取对缓存等的影响较小)。此外,这取决于读取和写入的比率,例如条件多久会最终为真?

标签: javascript performance optimization


【解决方案1】:

我们应该忘记小的效率,比如说大约 97% 的时间:过早的优化是万恶之源。”

http://c2.com/cgi/wiki?PrematureOptimization

这两种方式具有相同的复杂性,设置\更改四个字符的变量不会成为您应用的瓶颈。

我在这里唯一关心的是代码的可读性,如果您希望 sprite.state 具有值 left 为什么需要检查之前的值是什么?
(哦,它节省了大约 20 位的带宽,就像这里的性能提升一样......)

【讨论】:

  • 复杂性有什么关系?一个 O(1) 仍然可能比另一个 O(1) 慢很多。
  • 来吧——这里唯一有效的答案是“放松,没关系”
  • @Thilo, @Thilo, O(1) +2 == O(1) +3 给我(还有数学......)
  • 所以让我们都同意删除所有 O(1)/O(N) 的东西。
  • @gdoron 我并没有试图消除喊叫,只是耳朵流血(凝块会适得其反):)
【解决方案2】:

这样的事情不会比遍历按键快很多吗?您可以非常快速地连续检查变量。

var keyleft=false;

window.onkeydown = keydown;
window.onkeyup = keyup;

function keydown(event)
{
    var keyCode = ('which' in event) ? event.which : event.keyCode;
    if (keyCode==37) keyleft=true;
}

function keyup(event)
{
    var keyCode = ('which' in event) ? event.which : event.keyCode;
    if (keyCode==37) keyleft=false;
}

不保证这段代码能正常工作,我忘记了不用jQuery怎么做

【讨论】:

  • 他没有循环按键。他将当前按下的键存储在哈希中(插入keydown,删除keyup),因此他可以随时测试任何键是否已关闭。循环是游戏循环(动画速度),而不是关键循环。
  • 哦,这就是他的意思(37 in keysDown)
  • popnoodles,他不是:developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/… 我知道这一点,但在我的评论中有一个脑残并引用了错误的东西。 in 的这种用法是正确的,并不表示 if 中有循环。
  • 它与 PHP 中的 in_array 相同,但由于某种原因,我认为它是在检查键。
猜你喜欢
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多