【问题标题】:Java: does Loop list twice drain double power?Java:循环列表两次消耗双倍功率吗?
【发布时间】:2012-05-22 15:19:54
【问题描述】:

LibGDX 附带一个使用 MVC 模式的示例。

更新程序看起来像这样

List<Enemies> enemies = new List<Enemies>();

public void update() {
updateEnemies();
checkCollision();
}

void updateEnemies() {
 for each enemy //Loop enemies list{
   enemy.update();
  }

}

void checkCollison(){
   for each enemy//Loop enemies list{
    if(enemy.overlaps(hero.bounds) {
       //Do stuff
    }
   }
}

现在它循环遍历敌人列表两次。我应该这样做吗?也许不是一个小列表,但我想添加很多列表,所以我应该合并它们吗?

干杯!

【问题讨论】:

  • 我想做类似的事情但不知道答案,我之前用过几个列表,但知道答案会很好
  • 合并操作会缩短时间。但是您是否经常更新而不检查冲突,或者您总是两者都做?
  • update = 更新位置状态,这样 Collison 就会发生碰撞

标签: java list libgdx


【解决方案1】:

迭代本身很便宜,不太可能成为任何性能问题的根源。然而,没有什么是可以保证的;如果您想了解程序的性能特征,请使用分析器。

【讨论】:

    【解决方案2】:

    被警告。在更新所有敌人时,他们都会采取新的立场。然后检查碰撞。如果您要循环执行:更新一个敌人并检查碰撞,您将检查一些敌人的过时位置。这可能无关紧要,也可能无关紧要。 Java 注释的顺序是: // 首先更新所有敌人: ... // 现在我们可以为新位置:.

    答案:开销很小。

    【讨论】:

    • 开销?...抱歉,这是什么意思?
    • 我打算写一些类似的东西,直到我意识到代码只检查与 hero 的冲突,他的位置似乎没有被任何一个改变循环。
    • AndroidXTr3meN:开销=成本;正如其他人所说,真的很小。感谢@aix 的说明。
    【解决方案3】:

    从上面的代码可以看出,性能应该不错,因为你使用的循环是性能友好的:

    for (Enemies enemy : enemies)
    {
        //Do something here
    }
    

    根据this.

    【讨论】:

    • 谢谢,如果我使用循环两次,我的意思是更多
    • 最大次数也会发生同样的事情,因为这种循环类型在其他循环类型中的性能方面最多。所以这是无可争辩的。
    • 你当然可以根据 GUI 的可访问性来做到这一点。
    【解决方案4】:

    在做:

    for each element in collection
       operationA();
       operationB();
    end for
    

    与做的时间基本相同:

    for each element in collection
       operationA();
    end for
    for each element in collection
       operationB();
    end for
    

    然而,第二个选项可能更清楚,因为每个循环都有一个特定的目标,并不是所有的东西都在同一个循环中混在一起。

    【讨论】:

    • 我很难相信它需要同样的时间。如果我的收藏有 12 万亿件物品,那么它的长度将是原来的两倍。
    • 我同意,这需要更多时间。但根据列表的大小,它可能可以忽略不计。
    • 其实n * (a + b) = n * a + n * b。如果一个操作的执行时间非常短,可能会有一点开销!
    • 我想如果我合并它们并扩大我的游戏可能会破坏设计并使其不清楚。还是?
    • 可能。我要说的是,让 n 块代码做 n 件你清楚理解并且可以轻松维护的特定事情通常比让一个代码块做 n 件事(有时混合它们!)要好。如果没有性能问题,情况尤其如此。
    【解决方案5】:

    理论上,一旦代码被执行,编译器可能会将两个循环合并在一起,或者以更好的方式对其进行优化。有时事情并没有按照它们看起来组合的方式完全执行。

    【讨论】:

    • 编译器按顺序从第 0 行到最后一行执行代码。至少我听说过
    • 这是你调试时看到的,而不是编译器看到的。
    【解决方案6】:

    合并循环会引入新的开销、意外的时间间隔……相反,对不同的方法使用相同的循环不会影响实践中的性能,它可以使您的代码清晰、可读性和可维护性更高。如果使用这些方法,可以轻松处理使用每种方法捕获异常和其他自定义任务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-19
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      • 2012-07-20
      • 2021-08-09
      相关资源
      最近更新 更多