2024/01/18(木) [n年前の日記]
#3 [prog] スクリーンセーバのフレームレートが安定しない
C/C++ と OpenGL でWindows用スクリーンセーバを作っているところだけど、何故かフレームレートが安定しない。
スクリーンセーバ設定ウインドウを表示して、「プレビュー」をクリックした時は、60FPSで動いてくれるのだけど。実際に時間が経ってスクリーンセーバとして呼び出されると、40 - 50FPS で描画されてしまう。おそらくはバッググラウンドで何かがせっせと動いていて負荷がかかっているか、もしくはアイドル状態になるとCPUその他が省電力に切り替わってパフォーマンスが出ないのではないかと想像しているけれど…。
何にせよ、処理落ちっぽい見た目になって動きがギクシャクしてしまうので、前回のフレームと今回のフレームの時間差をミリ秒で取得してオブジェクトの速度に反映させてしまうことにした。時間取得は timeGetTime() を利用。1000 で割って、0.xxxx の値にして、1秒間あたりの移動量に掛けてやる。この値をそのフレームの移動速度にする。
_【Windows】実行時間の計測 #Windows - Qiita
_C/C++ programming technique @ catfish
_C言語/C++ 処理時間計測 入門
これで多少はマシになった。まだちょっとギクシャク感はあるけれど、明らかな処理落ち状態よりマシだろう…。
スクリーンセーバ設定ウインドウを表示して、「プレビュー」をクリックした時は、60FPSで動いてくれるのだけど。実際に時間が経ってスクリーンセーバとして呼び出されると、40 - 50FPS で描画されてしまう。おそらくはバッググラウンドで何かがせっせと動いていて負荷がかかっているか、もしくはアイドル状態になるとCPUその他が省電力に切り替わってパフォーマンスが出ないのではないかと想像しているけれど…。
何にせよ、処理落ちっぽい見た目になって動きがギクシャクしてしまうので、前回のフレームと今回のフレームの時間差をミリ秒で取得してオブジェクトの速度に反映させてしまうことにした。時間取得は timeGetTime() を利用。1000 で割って、0.xxxx の値にして、1秒間あたりの移動量に掛けてやる。この値をそのフレームの移動速度にする。
_【Windows】実行時間の計測 #Windows - Qiita
_C/C++ programming technique @ catfish
_C言語/C++ 処理時間計測 入門
これで多少はマシになった。まだちょっとギクシャク感はあるけれど、明らかな処理落ち状態よりマシだろう…。
[ ツッコむ ]
以上です。