1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
class fps_wait{
private:
average *ms_avg;
average *ms_avg2;
average *diff_avg;
average *diff_avg2;
average *diff_avg3;
double ms; // 1000/60 = 16.6666[...]
double fps; // 60
double skipped;
double starttick;
double nexttick;
double tmp;
double tmp2;
double tmp3;
double adap_delay;
double sum;
char *asd;
public:
double lasttick;
fps_wait(Uint32 fps_in = 60,Uint32 fps_pres = 1){
init(fps_in, fps_pres);
}
~fps_wait(){
delete ms_avg; delete ms_avg2; delete diff_avg; delete diff_avg2; delete diff_avg3;
delete asd;
}
void init(Uint32 fps_in,Uint32 fps_pres){
if (fps_in < 1){
ms = 1000/60;
fps = 60;}
else{
ms = double(1000)/double(fps_in);
fps = fps_in;}
starttick = SDL_GetTicks();
nexttick = 0;
tmp = 0; tmp2=0; tmp3=0;
ms_avg = new average(10*ms*fps_pres,true,ms,false);//fps*fps_pres);
ms_avg2 = new average(10*ms/2*fps_pres,true,ms,false);//fps*fps_pres);
diff_avg = new average(20,true,0,false);
diff_avg2 = new average(10,true,0,false);
diff_avg3 = new average(5,true,0,false);
lasttick = starttick - ms;
adap_delay = 0;
sum = 0;
skipped =0;
asd = new char(255);
}
void Wait_Next(){
tmp = SDL_GetTicks();
ms_avg->add(tmp - lasttick); // average
nexttick = (((tmp/ms)+1)*ms);
nexttick = nexttick - tmp;
lasttick = tmp; // updates the last position
adap_delay = (ms - ms_avg->davg); // diference between what-should-be and the average miliseconds between each read
sum += decimals(nexttick+adap_delay); // Acumulates those decimals that would be lost because SDL_Delay uses ms so 1.1 ms would acumulate 1ms every 10 1.1ms delays, then when it reaches 1 it adds it to the tota delay
// decimals() returns only the decimals, like 123.4567 would return 0.4567
if (sum>=1){adap_delay--;sum--;}
if (sum<=-1){adap_delay++;sum++;}
sprintf (asd, "tmp - lasttick = %f (%1.2f) | FPS = %f (%1.2f) | delay = %f | sum = %f\n", ms_avg->davg, double(ms), 1000/ms_avg->davg, fps, nexttick+adap_delay, sum); cout<<asd;
if ( nexttick+adap_delay > 0 ){
SDL_Delay (nexttick+adap_delay); // next + correction
}else{
skipped=nexttick+adap_delay;
}
}
double GetAvgFPS(){
return 1000/ms_avg->davg;
}
void Change_FPS_Wait(Uint32 fps_in,Uint32 fps_pres = 1){
delete ms_avg; delete ms_avg2; delete diff_avg; delete diff_avg2; delete diff_avg3;
init(fps_in, fps_pres);
}
};
|