0

次のような大きな3D配列を管理するための最良の方法を知りたいです:

x = 1000 y = 1000 z = 100

=>100000000オブジェクト

そして、各セルは、ある程度のデータを持つオブジェクトです。

すべてのデータが折りたたまれている場合でも、単純なメソッドは非常に簡単です(私は最初にオブジェクトの配列の配列の配列を試しました)

class Test

    def initialize
        @name = "Test"
    end

end

qtt = 1000*1000*100
Array.new(qtt).each { |e| e = Test.new }

私はどこかでDBがそのような場合に良いことかもしれないと読んだ。

あなたはこのことについてどう思いますか ?

私は何をしようとしていますか?

この「マトリックス」は世界を表しています。また、各要素は1mx1mx2mのブロックであり、異なる種類(水、泥、石など)である可能性があります。一部のブロックも空である可能性があります。

しかし、ユーザーはどこでもブロックを取り外して、周りのすべてを変更できる必要があります(後ろに水がある場合、それは例として穴を通って流れます。

実際、私がやりたいのは、MinecraftがDwarfFortressの本当に小さなクローンになることではありません(http://www.bay12games.com/dwarves/)

その他の興味深いこと

私のモデルでは、グラウドはレベル10です。これは、ほとんどの場合、[0,10]が空の空であることを意味します。丘と山の一部だけがそれらの層に存在する可能性があります。

地下は基本的に不明であり、掘られていません。したがって、未使用のブロックのインスタンスを追加する必要はありません。

最初からモデルに追加する必要があるもの:隣接する石/ムード/アースブロックを保管しなくても保管できる宝石、金、水。

ゲームの開始時に、キューブの80%をメモリにロードする必要はありません。

掘るたびに、新しいブロックを作成します。掘った空のブロックとその周りのブロックです。

インデックスを作成する必要があるのは次のとおりです。

  • 地下河川
  • 地下湖
  • 溶岩川
4

1 に答える 1

1

その多くのオブジェクトをメモリに保持することは決して良いことではありません。フラットファイルまたはデータベース中心のアプローチは、はるかに効率的で保守が容易です。

私がすること-オブジェクト指向のアプローチ

ブロックのパラメータを単純なデータとして保存し、オブジェクトを動的に構築します。

ゲーム内のブロックを表すクラスを作成し、Blockその特定のブロックのパラメーターを保持する変数を指定します。

class Block
  # location of the Block
  attr_accessor :x, :y, :z

  # an individual id for the Block
  attr_accessor :id

  # to define the block type (rock, water etc.)
  attr_accessor :block_type

  # and add any other attributes of a Block...
end

次に、データをファイルまたはデータベースにシリアル化/逆シリアル化できるようにするいくつかのメソッドを作成します。

Boardボード上で機能すると述べたように、ゲームの状態を維持し、オブジェクトに対してアクションを実行する、それを表すクラスも必要になりBlockます。x, y, zそれぞれの属性を使用してBlock、ゲーム内での位置を特定できます。次に、この情報を使用しBlockて、現在のブロックに隣接するブロックを見つけるクラスにメソッドを記述できます。これにより、あるブロックが別のブロックのアクションの影響を受ける場所について話している「カスケード」効果を実行できます。

データへの効率的なアクセス

これは、Blockオブジェクトのシリアル化をどのように選択するかに完全に依存します。おそらく、バイナリ形式を選択して不要なデータの読み取りを減らし、idパラメーターを介してオブジェクトを格納してから、 MMIOのようなものを使用して、配列のような方法で大きなデータファイルに対してランダムアクセスの読み取り/書き込みをすばやく実行します。これにより、メモリのオーバーヘッドなしで、データにすばやく効率的にアクセスできます。データの読み取り方法は、上記の隣接ブロックの方法に関連します。

もちろん、DBストレージルートを選択することもできます。これにより、ブロックを分離し、特定のブロックをより高いレベルでルックアップできますが、少し余分なオーバーヘッドが発生する可能性があります。

面白いプロジェクトのように聞こえますが、これが少しお役に立てば幸いです。:)

PS別の言語の選択についての@Linuxiousによる上記のコメントに関して。はい、これは場合によっては当てはまるかもしれませんが、熟練したプログラマーが自分のツールを非難することはありません。プログラムは、プログラマーが作成するのと同じくらい効率的です... Javaで作成している場合を除きます;)

于 2012-07-09T19:51:12.547 に答える