PyOpenGL + Pygameはフルスクリーンで60 FPSに制限されています
-
10-07-2019 - |
質問
私は現在pygameで書かれたゲームエンジンに取り組んでおり、OpenGLサポートを追加したかったです。
pygameとOpenGLを連携させる方法を確認するテストを作成しました。ウィンドウモードで実行している場合、150〜200 fpsで実行されます。全画面で実行すると(ウィンドウのセットアップ時にFULLSCREENフラグを追加するだけでした)、60 fpsに低下しました。描画関数をさらに追加して、パフォーマンスが大幅に低下するかどうかを確認しましたが、常に60 fpsで実行されました。
OpenGLがフルスクリーンで実行されていること、またはこれがOpenGLの制限であることをOpenGLに伝えるために必要な特別なことはありますか?
(Windows XPで実行しています)
解決
Frouが指摘したように、これは display.flip()
を呼び出して画面を更新するときに、Pygameが垂直リトレースを待機しているためです。 Pygame display
ドキュメント注、 HWSURFACE
または DOUBLEBUF
フラグを使用して表示モードを設定すると、 display.flip()
は垂直リトレースを待機してからバッファの交換。
正直なところ、画面のリフレッシュレートよりも速いフレームレートを達成しようとする正当な理由はありません(ベンチマーク以外)。ディスプレイはとにかく60 fpsしか描画できないため、あなた(およびゲームをプレイしている人)は速度やパフォーマンスの違いに気付くことができません。さらに、垂直リトレースと同期しないと、画面のティアリング。
他のヒント
これは V-Sync の問題ですか?構成または環境に関する何かが、最大フレームレートをモニタのリフレッシュレートに制限している可能性があります。
フルスクリーンモードとウィンドウモードを切り替えるときにclock.tick()を変更していない場合、これはほぼ間違いなくvsyncの問題です。 LCDを使用している場合、100%確実です。
残念ながら、v-syncはSDL、Pyopengl、ディスプレイサーバー、ビデオドライバーを含む多くの場所で処理できます。 Windowsを使用している場合は、nvidiaコントロールパネルのvsyncトグルを調整してテストすることができます。Linuxのnvidia-settingsにも同様の可能性があります。他のメーカーのドライバーも同様の設定になっていると思いますが、それは推測です。