まだタイマによるFPS調整の話

なんか違う。
タイマがms単位でしか時間を取得できない以上、1フレーム=16.666…ms の小数点以下の誤差を補完することなど原理的に不可能だ。時間を3倍にすればそれは当然3の倍数になるので、スリープをかけるときに3で割れば相殺されてしまう。前のコードでは1フレームが17ms未満で処理されているときに、1000*3/50=60 という綺麗な数字で表示されるようにしているにすぎない。実際には端数切捨てで結局50/3=16ms固定の同期になっている。
本当に60FPSを保ちたければやはり高精度タイマを使うか17、17、16の同期テーブルを持つべき。そしてFPSを綺麗に見せるにはある程度のフレーム間で平均をとればよい。1フレーム時間というのは誤差変動が大きいので、1フレームだけとってFPSを求めるようとするから値がふらついてしまうのだ。

ということでコードを修正していたのだがなんかおかしい。


SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0);
で垂直同期が切れないんだが。引数間違ってる?どうなってんだSDL・・・。
結局

if(glewGetExtension("WGL_EXT_swap_control") == GL_TRUE){
wglSwapIntervalEXT(0);
}
で対処。
あと表示FPSは端数切捨てだと59〜60でふらつくので四捨五入。
コードはいろいろ変わってしまってまだ何かあるかもしれないのでまた今度。