void sub__limit(double fps){
if (new_error) return;
static double prev=0;
double ms,now,elapsed;//cannot be static
if (fps<=0.0){error(5); return;}
ms=1000.0/fps;
if (ms>60000.0){error(5); return;}//max. 1 min delay between frames allowed to avoid accidental lock-up of program
recalculate:
now=GetTicks();
if (prev==0.0){//first call?
prev=now;
return;
}
if (now<prev){//value looped?
prev=now;
return;
}
elapsed=now-prev;//elapsed time since prev
if (elapsed==ms){
prev=prev+ms;
return;
}
if (elapsed<ms){
int64 wait;//cannot be static
wait=ms-elapsed;
if (!wait) wait=1;
if (wait>=10){
Sleep(9);
evnt(0);//check for new events
}else{
Sleep(wait);
}
//recalculate time
goto recalculate;
}
//too long since last call, adjust prev to current time
//minor overshoot up to 32ms is recovered, otherwise time is re-seeded
if (elapsed<=(ms+32.0)) prev=prev+ms; else prev=now;
}