0

2DタイルベースのRPGゲーム用のマップエディターを作成していますが、障害が発生しています。問題は、実際には、300x300タイルなどの非常に大きなマップに対してグリッド線を効率的に描画する方法です。

もともと私は、マウスを動かしたりクリックしたりするたびにグリッドパネル全体を再描画するように呼びました(ドラッグしたり、ホバーしているタイルを強調表示したりできるため)。これは大きな地図にとってはひどいものであり、非常に遅かった。

したがって、私の解決策は、新しい空のマップが作成されたときに、指定されたサイズのグリッドのbufferedImageを作成し、paintが呼び出されるたびにその画像を再描画することでした。これは非常にうまく機能しましたが、200x200以上のJavaでは、bufferedImageの作成時にヒープスペースが不足する点が異なります。ユーザーが新しいマップを任意のサイズに指定できるはずなので、プリロードされた画像を実際に作成することはできません。また、グリッドをタイルの上に描画するのが好きです。そうしないと、タイルが線を覆い、乱雑に見えます。つまり、タイルが追加されるたびにグリッドを再度描画する必要がありますか?

私の質問は、マウスを動かすたびに再描画される非常に大きなグリッドを描画する別の方法はありますか?Tiledプログラムは、1000x1000以上のマップを簡単に作成できますが、どのように実行されますか?ありがとう

編集: タイルなどのグリッドコンテンツではなく、実際のグリッド線を意味します。現在、グリッドが描画されると、2D配列を繰り返し処理し、タイルのすべての長さで線を描画します。

編集: 画面の表示部分のみをペイントすることで機能するようになりました。JScrollPaneでビューペインの座標を見つけるのはそれほど難しくありません。:)

4

1 に答える 1

0

さて、これは私が現在取り組んでいることに似ていると思います。私は現在、Ogre3Dの3Dフロントエンドを備えたシミュレーションソフトウェアを少し書いています。タイルベースのマップがあり、簡単に3000 x 3000にすることができ、場合によってはさらに大きくなることもあります。

2D / 3Dを実行しているだけの場合、グリッドをどのように描画するのかわかりませんが、私にとっての主な問題は、各タイルに異なるテクスチャを適用する方法でした。これが関係ない場合は、うまくいけば、これは将来の笑のためにとにかく役立つかもしれません。私にとっての問題は、eacchタイル用に個別のオブジェクトを作成することは、速度のためにノーノーであるということです。1024 x 1024でも、100万を超えるタイルを見ていて、それぞれに属性があります。これは、10 x 10のマップしかない最初のテストではうまく機能しましたが、より大きなマップでは停止しました。

私が現在やっているのは書き直しです。新しいアプローチは次のとおりです。(それが助けになるなら、あなたはこれをあなたがしていることに適応させることができるかもしれません)。グリッドは1つのオブジェクトになりました。私の場合、3Dで動作しているメッシュです。各頂点はいくつかの値を保持します。1つは列で、もう1つは行です。マップと同じサイズの個別のテクスチャがあるため、100列と100行のマップの場合、100 x 100のテクスチャを作成します(これは動的に作成されます)。

次に、このテクスチャと頂点をcgシェーダーに渡します(これは、同等の方法を考えなければならない場合がありますが、実行可能である必要があると思います)。テクスチャリングしたいグリッドスロットに関連するこのテクスチャのピクセルの色を調べることで、色の値を見つけることができます。これらの色の値は、マップで可能なすべてのテクスチャを保持するテクスチャアトラスに関連しています。次に行う必要があるのは、メッシュ/グリッドの特定の部分にテクスチャアトラスの特定の部分を使用することだけです。

それが何らかの意味をなすといいのですが、そうでない場合は、もう少し詳しく説明してください。CGシェーダーを使用している場合でも、JavaでCGベースではないものに相当するものを思い付くことができるはずです。これの利点は、1つのルックアップテクスチャ、メモリ内の1つのオブジェクト、およびルックアップが非常に高速な頂点を保持するバッファが得られることです。

お役に立てれば。

于 2012-06-30T18:02:32.687 に答える