私のゲームエンジンの一部を勉強していて、一部の部分を最適化する方法が不思議です。この状況のための双方向データ構造
状況は非常に簡単であり、それは以下の通りです:
- 私は(双方向次元配列に格納されている)
Tile
Sのマップ持っている(〜260Kのタイルを、しかし、より多くのを想定) - 私は多くの
Item
sが連続している Tile
は、論理的に、ゲーム実行時にはItem
の- の無限の量を含むことができ、常に少なくとも、ほとんどのタイルである
Item
のリストを持っていますLY作成し、彼らはすべてのItem
が連続隣人の1にそのTile
(アップ、右、下、左)を変更し、独自のTile
- から開始
今までのすべてのItem
その実際のTile
への参照を持っています私はアイテムのリストを保持しています。 Item
が隣接するタイルに移動するたびに、私はちょうどitem->tile = ..
を更新し、私は問題ありません。これは正常に動作しますが、単方向です。
エンジンを拡張しているうちに、タイルに含まれるすべてのアイテムを何度も見つけなければならないことに気付きました。これはパフォーマンスを効果的に低下させます(特に、一部の状況では、一つずつ)。
これは私がO(n)のでより良い特定Tile
のすべてのアイテムを見つけるのに適したデータ構造を発見したいと思いますが、私は「1枚のタイルからの移動に多くのオーバーヘッドを回避したいと思います意味(今はポインタを割り当てているので、かなり頻繁にそこで多くの操作をしないようにしたいと思っています)。
アイテムは常に隣のセルに移動していますが、私は現在暗闇の中で突っ走っているという事実を利用するカスタムデータ構造について考えています!どのようなアドバイスも、トリッキーなやりとりのアプローチにも感謝します。残念ながら私は記憶を浪費するだけでは良いトレードオフが必要ではありません。
私はC++でSTLを使用していますが、Boostは使用していません。 (はい、私はおよそmultimap
を知っていますか、それは私を満たしていないが、私はもっと良いものが見つからない場合、私はみます)
'Tile'マップはすでに生の二次元ポインタです。 'タイルマップ[幅] [高さ]'私はマップ全体にランダムアクセスがありますが、これらのアイテムは疎であり、大きなタイルを占めていないので、各タイルのアイテムのリストを持つことは望ましくありません。マップ自体.. – Jack
それはちょうど悪いデザインのように聞こえる。まず、固定サイズの配列を取り除き、適切なインターフェースを持つベクターを使い、次にベクトルやその他のものをローカルに与えることで、アイテムを所有する 'Tile'を作ります。 – 111111
それは悪いデザインではなく、世界中の地図が必要です。すべてのタイルはアイテムのためではなく、他の多くのもののために存在しなければなりません。私が言ったように、これはエンジンのほんの一部です:) – Jack