0

いくつかのプロジェクトで使用するために、この 2D タイル ベースのゲーム エンジンを作成してきました。

主にで構成される「ScreenObject」というクラスがあります

Dictionary<Point, Tile>

ポイント キーは、画面上のどこにタイルをレンダリングするかを示すためのものであり、タイルにはそのポイントに描画される 1 つ以上のテクスチャが含まれています。この ScreenObject は、タイルが変更、削除、追加される場所です。

私が行ったテストでタイルを描画する最初の方法は、ScreenObject を繰り返し処理し、各クワッドを各位置に個別に描画することでした。私が読んだことから、これはリソースの大幅な浪費です。テストではそれほど遅くはありませんでしたが、アニメーション クラスとエフェクト クラスを完成させた後は、非常に遅くなることは間違いありません。

最後にもう 1 つ、よろしければ.. 前に述べたように、Tile クラスには、画面上の Point 位置に描画される複数のテクスチャを含めることができます。

ここで、おそらく 2 つの選択肢があると思います。描画するテクスチャごとにその場所にクワッドを追加するか、何らかの方法で..同じクワッドに複数のテクスチャを使用します (可能な場合)。各タイルにテクスチャが 1 つしか含まれていない場合でも、画面に描画されるクワッドは 64 個になります。ほとんどのタイルには 2 ~ 5 個のテクスチャが含まれるため、この方法ではクワッドの総数が劇的に増加します。新しいテクスチャごとにクワッドを追加することは可能でしょうか?それとも、これを行うためのより良い方法を無視していますか?

4

2 に答える 2

0

三角形とインデックスから構成される単一の VAO オブジェクトを使用することをお勧めします。クライアント側で位置を計算し、各フレーム (ストリーミング) で更新するだけです。

テクスチャ アトラスを使用して、すべてを 1 つのテクスチャに格納します (状態の切り替えを避けるため)。テクスチャ パッカー ツールを使用できます。

ワンショットでレンダリングします (深度バッファが有効になっている場合)。それ以外の場合は、最初に不透明なオブジェクトをレンダリングしてから、ブレンドする必要があるすべてをレンダリングします。

于 2013-04-15T17:55:28.377 に答える
0

Dictionary を使用すると、単純な配列を使用するよりも遅くなると思います。ワールドが 512x512 タイルで構成されている場合、長さ 512x512 (262144) の配列を割り当てます。YTou は、「array[x + (y * 512)]」を使用して、その配列内の特定のタイルを取得できます。

タイルの数がわかっているので、それぞれがその位置のタイルを指すか、リスト内のタイルへのインデックスを持つ配列を保存します (おそらくすべてのタイルを配列に保持できるため、この方法でメモリを節約できます)サイズが 65536 未満、場合によっては 256 未満であるため、インデックスを 16 ビットとして格納します。

次に、レンダリングする配列の領域を見つけます。これを最適に行うには、テクスチャの切り替えをできるだけ避けたいと考えています。そのため、最初にタイルの大きさを確認してから、できるだけ多くのテクスチャを 1 つの大きなテクスチャに結合してみます。次に、この大きなテクスチャのサブ部分をサンプリングするように UV を設定します。このようにして、いくつかの大きなテクスチャで使用中のテクスチャの数を制限できるはずです。もちろん、特定のタイル セット (たとえば、岩場など) が同じテクスチャ グループを使用していることに気付くでしょう。また、どこかで草にブレンドすることもあるかもしれないので、多くのテクスチャの交換を避けるために、両方の大きなテクスチャで草のテクスチャを保持する価値があるかもしれません。つまり、速度のためにビデオ メモリを犠牲にします。

次に、配列の可視部分を繰り返し処理し、テクスチャ 1 を使用してすべてのタイルを描画し、次にテクスチャ 2 を使用してすべてのタイルを描画します。

于 2010-05-14T07:49:00.680 に答える