同期待ち(同期を待つわけでは無い)のコードをfps表示と同じクラスにぶち込んだ方が利用しやすいだろうということで整理していたら,何やらfpsが安定しなくなった。60fpsで回しているのに58ちょっとになったり61を超えることもしばしば。これはよろしくない。
重いというわけでは無く,原因は待ち中のループ時に入れているSleep処理らしい。ちょっと寝過ぎているのか早起きなのか数周分のズレが発生している様子。処理をコメントアウトしたり猶予の数値変えたりすると60fpsで安定する。
とりあえず2ミリ秒くらい猶予設けて,ついでに寝たフラグで整流してみたら安定を取り戻したけど,なんかちょっとスッキリしないので辛い。
タイマー自体はStopwatchクラスで計測しているので,Frequencyでとってきた1秒あたりの数値を任意設定した希望fpsで割ったものを1フレームとして計算しているので,Sleepさんが欲しがるミリ秒としての数値としては相応しくないので,コードを分化する前はElapsedMillisecondsを突っ込んで済ませていたのだけど,現在はFrequencyと希望fpsから計算した1ミリ秒あたりのカウント数から現在のラップタイムを導き出している……とか書いていたらなんか普通にタイマー参照すれば無駄な計算無くなるんじゃないかって気がしてきた。
次回やってみよう。
あと問題があるとすれば,キー入力に先行入力の気配がある。長いこと押されていても,1フレームで入力を受け付けるのは1回までにしたいのだけど,fpsを極端に落とすと(たとえば1fpsとかにする)ちょっと長押しするだけではっきりわかるくらい別のキー入力まで長押ししたキーの処理が続く。30fpsでもたまに感じて,60fpsではあまり感じることはない……とはいえ,発生しているようなので,これは何とかしたい。STGの自機移動のように押しっぱなしで反応するタイプのゲーム用にチューンした結果これではいかんですよ。