394 |
void |
void |
395 |
Game::run (LevelPack *lp, int ilevel) |
Game::run (LevelPack *lp, int ilevel) |
396 |
{ |
{ |
397 |
|
class Avg { |
398 |
|
enum {N=20}; |
399 |
|
double dtimes[N]; |
400 |
|
int idx; |
401 |
|
public: |
402 |
|
Avg() : idx(0) { fill(dtimes, dtimes+N, 0.010); } |
403 |
|
void add(double dtime) { |
404 |
|
dtimes[idx++] = dtime; |
405 |
|
idx = idx % N; |
406 |
|
} |
407 |
|
double get() { |
408 |
|
double s=0; |
409 |
|
for (int i=0; i<N; s+=dtimes[i++]); |
410 |
|
return s/N; |
411 |
|
} |
412 |
|
}; |
413 |
|
static Avg average_dtime; |
414 |
|
|
415 |
level_pack = lp; |
level_pack = lp; |
416 |
|
|
417 |
icurrent_level = ilevel; |
icurrent_level = ilevel; |
436 |
; //SDL_Delay(sleeptime); |
; //SDL_Delay(sleeptime); |
437 |
|
|
438 |
dtime=(SDL_GetTicks()-last_tick_time)/1000.0; |
dtime=(SDL_GetTicks()-last_tick_time)/1000.0; |
439 |
|
|
440 |
|
double adtime = average_dtime.get(); |
441 |
|
average_dtime.add(dtime); |
442 |
|
if (abs(adtime-dtime)/adtime < 0.1) { |
443 |
|
// less than 10% deviation from average frame time? |
444 |
|
dtime = adtime; |
445 |
|
} |
446 |
|
|
447 |
if (dtime > 500.0) /* Time has done something strange, perhaps |
if (dtime > 500.0) /* Time has done something strange, perhaps |
448 |
run backwards */ |
run backwards */ |
449 |
dtime = 0.0; |
dtime = 0.0; |