2

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
    }
   }
}

敵リストを 2 回ループするようになりました。これを行う必要がありますか?たぶん1つの小さなリストではなく、たくさんのリストを追加したいので、それらをマージする必要がありますか?

乾杯!

4

6 に答える 6

5

反復自体は安価であり、パフォーマンスの問題の原因になる可能性はほとんどありません。ただし、何も保証されていません。プログラムのパフォーマンス特性を理解したい場合は、プロファイラーを使用してください。

于 2012-05-22T15:23:27.990 に答える
2

上記のコードから、使用しているループはパフォーマンスに適しているため、パフォーマンスは良好であることがわかります。

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

これによると。

于 2012-05-22T15:37:23.130 に答える
2

注意してください。すべての敵を更新すると、それらはすべて新しい位置になります。そして、衝突がチェックされます。ループで行う場合: 1 つの敵を更新してコリジョンをチェックすると、いくつかの敵の古い位置をチェックすることになります。これは無関係かもしれませんし、そうでないかもしれません。Java コメントは次のようになります。 // 最初にすべての敵を更新します。

答えとして: オーバーヘッドは最小限です。

于 2012-05-22T15:31:36.740 に答える
0

理論的には、コードが実行されると、コンパイラーは両方のループをマージするか、より良い方法で最適化する可能性があります。時々、物事はそれらがまとめられているように見える方法で正確に実行されないことがあります。

于 2012-05-22T15:37:42.877 に答える
0

やっている:

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

ただし、各ループには特定の目標があり、すべてが同じループに混在しているわけではないため、2 番目のオプションの方が明確な場合があります。

于 2012-05-22T15:24:13.547 に答える
0

ループをマージすると、新しいオーバーヘッド、予期しない間隔が発生します...代わりに、異なるメソッドに同じループを使用しても、実際にはパフォーマンスに影響はありません。コードが明確になり、読みやすく、保守しやすくなります。各メソッドで例外やその他のカスタム タスクをキャッチすることは、それらのメソッドがあれば簡単に処理できます。

于 2012-05-22T15:44:42.680 に答える