2012-02-02 10 views
1

マップ座標xとyのデータベーステーブルがあるとしましょう。表示したいものを取り出し、PILを使って地図画像を作成します。以下を解く最適化された方法

私は画像を作成し、各マップタイルをループして背景画像を貼り付けます。すべてが問題ありません。

タイルにはn人のプレイヤー、モンスター、npc、ポータルなどが存在します。 タイルにオブジェクトがある場合は、特定のイメージを貼り付ける必要があります。

問題:タイルに何かがあるかどうかを確認する方法:どのようなDB構造が必要ですか?

すべてのプレイヤーは、ポジション(FKからポジションのMapTileまで)を持っています。タイルにプレーヤー/モンスター/ npcがどこにあるかをDBで照会すると苦労するので、各座標にobjects_count列を追加します。それが> 0なら、私は発生を探します。

if objects_count: 
    if query_for_players_exists: 
     show player 
    elif query_for_monster_exists: 
     show monster 
    elif query_for_npc... 
     show npc 
    and so on. 

私は、一般的な関係を持つテーブルにM2Mを使用することができますが、私見一般的な関係はその速くはありません。

そして、それは次のようになります。 クエリーセットは49個のタイルで構成されていますが、どのようなオブジェクトがタイル上に存在しているかを簡単に調べるにはどうすればよいですか?

答えて

0

私の頭に最初に来たことは次のとおりでした。オブジェクトの密度がそれほど高くない場合(例えば15%未満、例えばこれが計算可能な場合)、これらのフィールドを有するテーブルがあるかもしれない:x, y, objectsobjectsは、漬け物の配列またはリストの他の何らかのテキスト表現であってもよい。タイル名のリスト。

地図が密集していても、重複していない四角い塊に分割し、オブジェクトの行列として保存する方がよい(マトリクスのサイズは一定であり、ビューポートのサイズに依存する)。もちろん、オブジェクト自体もマトリックスセルにシリアル化する必要があります。

しかし、1つのことはdefenetly真である、あなたは多くのパフォーマンス "単純な"表現を得ることができません。行レベルの操作を減らすには、何らかの方法でそれらをパックする必要があります。

0

各タイルまたは各タイル+可能なオブジェクトに対してクエリを実行するのはなぜですか? 1つのクエリを実行してすべてのタイルのすべてのオブジェクトを戻し、結果セットをタイル単位で繰り返します。

タイルごとに100個のオブジェクトがあり、49個のタイルを持つ場合でも、結果セットには4900個のアイテムしかありません。

 
fetch database rows and store resultset in some data structure 
foreach tile 
    if(have tile in DB resultset) 
    place all object from tile
+1

これは1つのクエリです。問題は、これらのタイルに配置されたオブジェクトをフェッチする方法です。 – aemdy

+0

ああ。私は擬似コードを間違って補間して、複数のDBクエリを実行していたことを意味します。 – bot403

関連する問題