2

Python+pygletで昔ながらの2D RPGを開発しています。

マップは複数のレイヤー (最大 10) で構成され、各レイヤーは正方形のタイル (32x32 ピクセル) で構成されます。スプライト (パーティー キャラクター、NPC、その他のもの) は、2 つのレイヤーの間 (通常は最後のレイヤーの直前) に描画されます。

それをレンダリングするために、多くの OrderedGroups を持つ単一の Batch を使用します。レイヤーごとに 1 つのグループ、スプライトごとにグループです。

スプライトの問題は、y 値の降順でレンダリングする必要があることです。そのため、グループは次のように配置されます (マップに 3 つのレイヤーがあり、最後のスプライトの直前に 2 つのスプライトを描画する必要があるとします)。

g[0] = OrderedGroup(0) : first layer
g[1] = OrderedGroup(1) : second layer

g[2] = OrderedGroup(2) : empty, serves as a base for the following :
OrderedGroup(0, parent = g[2]) : the highest sprite
OrderedGroup(1, parent = g[2]) : the lowest sprite

g[3] = OrderedGroup(3) : the third layer

レイヤー スプライトをバッチに追加するときは、それらが静的であることを指定します。パーティー スプライトを追加すると、それらは「動的」になります。

だから私の最初の質問: それらはすべて同じバッチに属しているので、矛盾していませんか? (別の言い方をすると: 「静的」または「動的」はスプライト オブジェクトまたはバッチのプロパティですか?) (注: 私は OpenGL に関する知識がほとんどなく、バッチとグループがどのように実装されているかわかりません)

当分の間、パフォーマンスは正しいです (私は 60 fps が必要で、最大 8 個の移動スプライトがあります)。私のエンジンは、C/ASM で部品を変換することなく、可能な限り最も効率的です)。

だから私の2番目の質問:私が選択した戦略(バッチを使用し、できるだけ少なくする)は良いものですか?

回答ありがとうございます

4

1 に答える 1

0

私は Pyton や Pyglet のユーザーではありませんが、いくつかのヒントがあります。

  1. あなたはOpenGLを使用しています

    Yそのため、およびまたはビュー プレーンの並べ替えレンダリングは必要ありません。Z-バッファがそれを行うので、描画順序は任意です...透明なタイルを使用しない限り(その場合、選択の余地はありません)。

  2. あなたはコードを提供します

    しかし、レンダリング内で何もソート/グループ化しないことを実際に確認することは何もありません。パフォーマンスに非線形に影響を与える可能性があるすべてのフレームで順序付きリストを作成しているようです。通常、HW で高速化されたコードの場合、重大なボトルネックに到達するまでは問題ありませんが、その後、すべてが突然地獄に落ちます!!!

  3. レイヤー マップを別の 2D マップに保持する

    ソート/グループ化はまったく必要ありません。オブジェクトがあるレイヤーから別のレイヤーに移動する場合は、それに応じてブース レイヤーを更新するだけです

于 2014-01-22T12:39:37.547 に答える