1

タイル ベースのゲームを作成しており、フレームごとにマップをレンダリングする必要があります。現在、各タイルは 32X32 で、表示されるマップは 28X28 タイルです。パフォーマンスは恐ろしいです。最近、目に見えるタイルのみをレンダリングするようにしましたが、それでも FPS はあまり改善されませんでした。現在、レンダリングを高速化する方法を探しています。遅さの原因はレンダリング方法にあると考えています。すべてのタイルが個別に画面にブリットされます。これを行うことでより効果的だったのは何ですか?

4

1 に答える 1

2

pygame (私の知る限り) では、画面の更新は常にボトルネックの 1 つです。あなたのコードを見ることができなかったので、どのように画面を更新しているのかわかりません。変更されたスプライトのみをブリットすることから始めますが、画面上の変更された部分のみを更新する必要があります。基本的には、変更された四角形のみで使用するdisplay.flip()か使用するかの違いです。update_rects()地図をスクロールしているときは、まったく役に立ちません。この質問を見てください: Python でのこの小さな (155 行の長さの) Pacman ゲームの実行が非常に遅いのはなぜですか? 、類似のトピックがあります。

タイルといくつかのスプライトでコンパイルされたマップを持っていたときに試したことの1つは、現在表示されている部分とその周囲の約200ピクセルを含む領域のマップのプリコンパイルされた画像を常に保持して、ブリットできるようにすることでした。準備された「地面」(まだ更新された部分のみ)に含まれるすべてのタイルをブリットする必要はありません。もちろん、アクティブなスプライトの上に複数のレイヤーやマップのパーツがある場合は特に、かなりの考慮が必要です。それを考えて実行するのは興味深いことですが、それによってどれだけの利益が得られるかはわかりません。

考えられるまったく異なる解決策の 1 つ: 私は一度 pygame を使い始めました (その前に C++ で SDL を行っていたため)。最近、別の python ゲーム ライブラリであるpygletに誘導されました。これは、pygame ほど画面全体を更新する問題に悩まされることはありません (OpenGL アクセラレーションを使用しているためだと思います。まったくアクセラレートされていない eee-Netbook でも動作します)。pygame にまったく縛られていない場合は、pyglet を見てみるのも面白いかもしれません。

于 2012-11-28T18:00:23.893 に答える