pygameのフレームレートを速くする


10

ゲームをプロファイリングすると、趣味のゲームの実行時間の大部分がブリットコールとフリップコールの間にあることがわかります。現在、約13 fpsでのみ動作しています。私のビデオカードはかなりまともなので、私の推測では、pygameはそれを使用していません。

これを速くするためにpygameで設定する必要があるグラフィック/表示オプションを誰かが知っていますか?それとも、pygameを選んだので、これは私が一緒に暮らさなければならないものですか?

回答:


12

全画面モードで実行している場合はpygame.HWSURFACE、ディスプレイを初期化するときにフラグを使用して、pygameにハードウェアサーフェスを使用するように指示できます。ハードウェアサーフェイスが使用できない場合、pygameはソフトウェアサーフェイスを静かに使用すると思います。

あなたは、ハードウェアの面を使用していない場合は、使用することを検討pygame.display.update(rectangle)するのではなくpygame.display.flip()。これにより、ディスプレイ全体ではなく、指定された長方形のみが更新されます。ゲームが実際にディスプレイ全体を更新する必要がない限り、パフォーマンスはかなり向上します。

ハードウェアまたはOpenGLサーフェスを使用している場合は、ハードpygame.DOUBLEBUFウェアダブルバッファリングを使用するものもあります。つまり、描画関数は2つのバッファーのいずれかに描画し、flip()表示されているバッファーを入れ替えます。


5

pygameの1つのボトルネックは、実際にはフォントのレンダリングです。同じテキスト(同じフォント/色)を複数回レンダリングするのではなく、一度レンダリングされたサーフェスをキャッシュして再利用してください。Font.render()をたくさん使用している場合は、これを考慮してください。


4

talljoshの答えに加えて、私はさらにいくつかの提案を投げ入れたいと思います:

可能な限り回転とスケーリングを避けてください。そのような操作は純粋にCPU上で行われ、非常に遅くなる傾向があります。

直接ピクセル読み取り/変更を行う場合は、Surface.get_buffer()メソッドを使用するのではなく、Surface.set_at()/get_at()メソッドを使用して操作します。


2

テストコンソールの出力をコメント化します。これにより、特にCodyが前述したように、回転とスケーリングの間で出力している場合は、フレームレートが大幅に低下する可能性があります。


2

Pygameがビデオカードの3Dアクセラレーション機能を使用しないのは正しいことです。これは、同じ制限を持つSDLに基づいているためです。一つの選択肢は、のようなシステムであなたのゲームを書き換えることであるpyglet のみグラフィックスのための同様のライブラリを見つけること、またはこのためにOpenGLのコードを自分で書くことが、ネイティブのOpenGLは、スプライトを加速サポートしています。


ピグレットは素晴らしいです。
共産主義者のダック

1

信じられないほど簡単なことの1つは、psycoを使用することです。それがどれだけ役立つかわかりませんが、必要なのは

 import psyco
 psyco.full()

実行を開始するには、試してみるのもよいでしょう。


Psycoは、現代の慣用的なPythonコードではあまり役に立ちません。JITが必要な場合はPyPyを使用してください(ただし、PyGameがそこで機能しているかどうかはわかりません)。
coderanger、2011年

PygameはPyPyの下では動作しませんが、Pygletは動作します。
coderanger、2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.