自作ドラクエの続き。


マップスクロール処理の作り込みに手を出し始め、ティアリング対策及びfps制御の実装を進めていく中で、更なる壁にぶち当たる。


課題はmsオーダーの精度が求められるタイマー制御部分。


どうやら、VB6で扱えるタイマーは、デバッグで計測してみた結果とネット上の情報を統合してみると、5〜10msは平気で遅れる事が分かった。


基本的に設定通り動く事はなく、遅れる事がほとんど。


これに引っ張られて画面更新が遅延している(遅延していそう)、という事が分かった。


今回は16,16,17msと1msがズレるだけでもティアリングが発生してしまう為、この遅れを何とかしなければならない。


まず試した事として、タイマー処理の精度を上げられないか。


タイマー制御にはGetTickCountと呼ばれるAPIを使っており、Windowsが起動した時間をmsオーダーで返してくれる関数があるので、この戻り値を使ってfps制御を行っていた。


調べてみるとこの処理を高精度化できるAPI(関数名は忘れた...)があり、それを実装してみた。


これにより劇的にタイマー精度が上がった様に感じるが、それでもティアリングは時々発生する。


この時とにかく妥協を許さない覚悟で作っていた。


今冷静に考えると、とにかく「私はスムーズなスクロールをしたいんだ!」と、肝心のドラクエの事は忘れていた様に思う。


ここの修正に更に1〜2年要した。


社会人プログラマゆえ、自分の時間が限られているので、どうしても日中仕事があり帰宅後の作業になるので進捗は悪く、その結果時間がかかってしまった。


そしてこの方法ではどうにもならないという結論に至り、更なる高精度なタイマーを求めてネット検索の旅に出る。


もうこれはmsオーダーで制御はダメ、μsecオーダーの制御が必要だと判断。

更には遅れが発生した場合も考慮して、その分を次のfps制御に対して補正する様な仕組みも必要と考え出す。


つまり、16,16,17msと制御していく中で、実際の処理が17,16,17msとズレたとする。


その場合、多い1msを次で補正する為に、15,16,17msとしていくイメージ。

そして次の動作が遅れたり早まったりしたら、更に次の制御を補正していく、そんな制御。


更に、μsecのタイマー制御となると「マルチメディアタイマー」なるものがあり、どうやらこれを使うと良さそう。


ちょうど良いサンプルを見つけたので早速中身を見てみたが、どうも分からない。

というかサンプルはOCX形式、つまりdllの様なイメージで、VB6に参照プログラムとして組み込んで与えられた機能内でしか使えない仕様となっていた為、採用は見送った。


※OCXの詳細は分からないが、おそらくVC等の別言語でつくられた、いわば関数とオブジェクトのセットで、要は他人がコンパイル済みの動作を提供してくれる、そんな感じのもだと思う。


そして色々と検索した結果、究極の方法が見つかる。


それはCPUのクロック回数を取得するというもの。

cpuのクロック回数に周波数をかけてやると、μsecオーダーで時間が計測できる。


欠点としてはCPU依存の為、古いCPUだと非対応の場合もあるが(2008年以前との情報)、これを使わない手はないと思い実装してみる事にした。


CPUクロック回数と遅れた場合の補正処理、これも中々苦戦した。


また続きは次回。