ども、こんにちわ~
いよいよ寒くなってきましたね~
今年二度目のにわか風邪を引いているZAKIです
何やら連続記事投稿記録が伸びているようですね
記録を伸ばすためにも、みんながんがん投稿しちゃってください
さて、今回のテーマは
「FPS制御 ~概要編2~」です
2(ツー)です2(ツー)。
前回はFPSの動機について話しましたが、
今回は仕組みについてです
そんなもんいいから、ソースみせれ!って人は
こちらへどうぞ
さて、それではどうやったら1秒間のフレーム数を固定にできるのか
答えは簡単、
1フレームにかける時間を一定にすればいいんです
1秒間に60フレーム(FPS:60)処理するとしましょう
そうすると、1フレームにかける時間は
1秒 ÷ 60回 = 0.0166666......秒
ミリ秒単位に直すと約16秒。
1フレームは最大約16ミリ秒かかればいいのです
じゃあ、16ミリ秒まてばいいかというと、そうでもないんです
ゲームでキャラを動かしたり、描画したりする時間も含めないと、
? ミリ秒(描画などの処理時間) + 16ミリ秒(待ち時間) = 16 +? ミリ秒
という感じで待ちすぎてしまいます
なので、
処理した時間を測って、その分引いてやる必要があるんです
処理時間を計るにはどうすればいいでしょう?
普通、時間を計る時には前の時刻と今の時刻を引き算しますよね?
プログラムでも同じで
処理開始時間と処理終了時間を引き算してやればいいのです
開始時間が90で終了時間が100だとすると
16ミリ秒(待ち時間) - {100(終了時間) - 90(開始時間)} = 16ミリ秒 - 10ミリ秒(処理時間)
= 6ミリ秒
となり、
この場合は次のフレームまで6ミリ秒待ってやればいいのです
この処理を毎回行うことで1秒間のフレーム数を固定することが出来ます
もし、答えがマイナスになったときは、
処理時間のみで1フレームの最大時間を越えたことになるので、
待つ必要がありません
ただ、
その時の対処法が二つありまして、(僕が知る限りなのですが
-
そのまますぐに次のフレームの処理を始める場合
-
描画処理の部分を飛ばして次のフレームの処理を始める場合
の二つがあります。
前者の場合は
1フレームの時間が増えて、処理する回数が減るため、スローモーションのような状態になります
これを
「処理落ち」と言います
後者の場合は描画を処理する負担が減るので、ほとんどの場合で1フレームの時間内に次のフレームに移れますが、
描画回数が減るので、画面には瞬間移動のように映ります
これを
「コマ落ち」といいます。
格闘ゲームなど
見た目のタイミング等が重要な場合は前者が向いているでしょうし、
3Dゲームなど
描画部分に強い負担がかかる場合には後者が向いているんじゃないでしょうか
どちらがよいかはゲーム内容によって変わるので、一概には言えないですね
長々と説明してきましたが、これが一連の処理の流れになります
ほんとになっがいww
文章のデコレーションで死に掛けました
次回はいよいよプログラムの解説へはいっていきたいと思います
それでは今回はこの辺で。
あでゅー
ノシ
[0回]
PR
COMMENT
よくやった