0

C# を使用して、グリッド ベースのマップ システムを含むゲームを作成しています。グリッド システムを List オブジェクトに格納しています。ここで、T は位置とその他のデータを含む型です。タイルの隣接を見つける関数を呼び出すと、実行が極端に遅くなりました。遅延をリストの Find() メソッドの呼び出しに絞り込みました。メソッドは次のようになります。

list.Find(タイル => タイル.X == x && タイル.Y == y)

なぜこれがこのような巨大な遅延を引き起こしているのでしょうか? タイルをリストに保存するより良い方法はありますか?

4

4 に答える 4

3

FindO(n) で、n はリストのカウントです。常に座標ペアでルックアップを行っている場合、キーで O(1) ルックアップを取得するため、ディクショナリが非常に役立ちます。から始めて、Dictionary<Tuple<int,int>, Tile>それがニーズに合っているかどうかを確認できます。Dictionary が長期的に優れているかどうかは、リストのサイズと必要なルックアップの種類によって明らかに異なります。

于 2013-09-21T08:26:07.630 に答える
1

あなたの場合のように、同じ種類のクエリを頻繁に実行する場合、通常、インデクサーのパフォーマンスは多かれ少なかれ一定であるため、結合されたキーでインデクサーを使用してオブジェクトを取得することは理にかなっています。オブジェクトの数が増えても、オブジェクトを見つけるまでの時間が増加しないことを意味します...

これを行うには、たとえば TKey が文字列で、各キーが tile.X + " " + tile.Y であるディクショナリを使用します。オブジェクトを取得するには、 dic[tile.X + " " + tile.Y]を呼び出すだけです

于 2013-09-21T09:33:33.507 に答える