FPSとかの続きの続き

以前の話で prevTick = nowTick とする方法だとFPSが安定したとか書いてたけど、ふらつく原因はそれ以外のところにありました。んでもってその方法だと他のプロセスで高負荷をかけるとゲームがゆっくり簡単になっちゃうのはやっぱだめだろうってことで再修正。
あと60Hz以外で垂直同期を切れないような環境や、垂直同期モードなのにウェイトがきかないような環境のために強制的にタイマ同期を行うオプションをつけた。ついでにタイマ同期のときにFPSをうまく60にする方法も取り入れてみた。またここ参照。16.666… * 3 = 50 であることを利用して、時間を3倍して1フレームを50msと考える。
そういうわけで今のソースはこんな感じ。


const Uint32 INTERVAL = 50;

float fps;
int frame;
Uint32 nowTick;
Uint32 prevTick = 0;
Uint32 deltaTick;

while(true){
nowTick = SDL_GetTicks()*3;
deltaTick = nowTick - prevTick;
if(FPSの数値を更新する){
fps = 1000.0f*3 / deltaTick;
if(タイマ同期のとき){
if(deltaTick < INTERVAL){
fps = 1000.0f*3 / INTERVAL;
}
}
}
frame = (int)deltaTick / INTERVAL;
if(VSyncのとき){
if(frame < 1){
frame = 1;
}else if(frame > 5){
frame = 5;
}
prevTick = nowTick;
}else{ //タイマ同期のとき
if(frame < 1){
frame = 1;
SDL_Delay((prevTick+INTERVAL-nowTick)/3);
prevTick += INTERVAL;
}else{
if(frame > 5){ frame = 5; }
prevTick = nowTick;
}
}
for(int i=0; i