2

libGDX のドキュメントでは、SpriteBatch へのテクスチャのバインドについて説明しています...

[SpriteBatch] に最後のテクスチャとは異なるテクスチャが与えられた場合、最後のテクスチャがバインドされ、収集されたジオメトリが描画されるように送信され、新しいテクスチャのジオメトリの収集が開始されます。

描画されるいくつかの長方形ごとにテクスチャを変更すると、SpriteBatch が多くのジオメトリをバッチ処理できなくなります。また、テクスチャのバインドはややコストのかかる操作です。これらの理由から、多くの小さな画像を大きな画像に保存し、大きな画像の領域を描画して、ジオメトリのバッチ処理を最大化し、テクスチャの変更を回避することが一般的です。

このため、すべてのゲーム スプライト イメージを 1 つのテクスチャに配置しました。ただし、ゲームに大きな背景画像を配置して、画面全体を埋めたいと考えています。

私のオプションはどちらかのようです...

  1. 小さなゲーム スプライトに使用しているのと同じテクスチャに背景を配置するか、または...

  2. 背景には別のテクスチャを使用します。

#1の問題は、異なるレベルに異なる背景画像を使用したい場合、これは非常に実用的ではないように見えることです(画像が非常に大きくなるか、異なる背景ごとに複数の画像でゲームスプライトのコピーを作成する必要があります)。

しかし、#2 を行う場合、SpriteBatch を 2 つの異なるテクスチャにバインドしてから GPU に送信する必要があります。これはドキュメントで「かなり高価」と説明されています。

最善のアプローチが何であるかはわかりません。複数のテクスチャへのバインドについてそんなに心配する必要がありますか? または、私が検討していないより良いアプローチがありますか?

アドバイスを求めました、ありがとう!

4

1 に答える 1

4

あまり頻繁に使用されない、すでに大きなテクスチャの場合は、他のすべての小さく頻繁に使用されるテクスチャと同様に、それらを同じテクスチャ (アトラス) にパックしないようにする必要があります。

どうしてこれなの?多くのデバイスでは、2 のべき乗 (POT) サイズのテクスチャのみを使用する必要があるため、まとめたい大きなテクスチャの場合、かなり大きなファイルになり、多くの無駄なスペースが生じる可能性があります。

さらに、それぞれ異なる背景を持つ 10 のレベルがあり、すべての背景を 1 つのテクスチャに配置する場合、単一の背景だけを GPU に送信する可能性はありません。すべてのレベルで、背景の 1 つだけを表示するために、すべての背景を含む巨大なテクスチャ ファイルを GPU に送信する必要があります。したがって、スペースだけでなく GPU メモリも浪費し、さらに悪いことになります。

これらの理由と、通常は背景を 1 回だけ描画するため、1 つのテクスチャ スイッチのオーバーヘッドは無視できます。それほど高価ではなくフレームごとに 1 回だけ (背景の場合) 実行しても、違いはありません。

全体として、背景テクスチャを残りから分離し、個別のファイルにします。

于 2014-03-21T10:40:09.120 に答える