Introduced timer_delay2 as replacement for timer_delay to sleep according to given FPS rate considering calc time between frames

This commit is contained in:
zicodxx 2007-11-21 12:46:09 +00:00
parent 827f0d5fd1
commit 17c16bfc5b
11 changed files with 38 additions and 28 deletions

View file

@ -1,5 +1,9 @@
D1X-Rebirth Changelog
20071121
--------
arch/sdl/key.c, arch/sdl/timer.c, include/timer.h, main/game.c, main/kconfig.c, main/kmatrix.c, main/netlist.c, main/newmenu.c, main/scores.c, main/titles.c: Introduced timer_delay2 as replacement for timer_delay to sleep according to given FPS rate considering calc time between frames
20071106
--------
main/config.c, main/game.c, main/game.h, main/menu.c, main/newdemo.c: Correctly saving Reverse Stereo setting; Added Demo playback help keys; aligned Demo recording to 20 frames per second to save lots of hard drive space

View file

@ -511,10 +511,7 @@ int key_inkey()
key = key_data.keybuffer[key_data.keyhead];
key_data.keyhead = add_one(key_data.keyhead);
}
//added 9/3/98 by Matt Mueller to free cpu time instead of hogging during menus and such
else timer_delay(1);
//end addition - Matt Mueller
return key;
}

View file

@ -32,3 +32,23 @@ void timer_delay(fix seconds)
{
SDL_Delay(f2i(fixmul(seconds, i2f(1000))));
}
// Replacement for timer_delay which considers calc time the program needs between frames (not reentrant)
void timer_delay2(int fps)
{
static u_int32_t last_render_time=0;
if (last_render_time > SDL_GetTicks()) // Fallback for SDL_GetTicks() wraparound
last_render_time = 0;
else
{
int FrameDelay = (1000/fps) // ms to pause between frames for desired FPS rate
- (SDL_GetTicks()-last_render_time)/(F1_0/1000) // Substract the time the game needs to do it's operations
- 10; // Substract 10ms inaccuracy due to OS scheduling
if (FrameDelay > 0)
SDL_Delay(FrameDelay);
last_render_time = SDL_GetTicks();
}
}

View file

@ -69,6 +69,7 @@ extern fix timer_get_approx_seconds();
//NOT_USED extern unsigned int timer_get_millisecondsX(); // Assume interrupts disabled
void timer_delay(fix seconds);
void timer_delay2(int fps);
//==========================================================================
// Use to access the BIOS ticker... ie... i = TICKER

View file

@ -774,22 +774,10 @@ void calc_frame_time()
// sleep for one frame to free CPU cycles if GameArg.SysUseNiceFPS is active.
if (GameArg.SysUseNiceFPS)
{
// Timer which sleeps for the time between frames but substracts 10ms timer inaccuracy.
// CPU usage not optimized, but more reliable to get desired FPS and smooth gameplay.
// Should probably replaced by a better solution.
int FrameDelay = (1000/GameArg.SysMaxFPS) // ms to pause between frames for desired FPS rate
- FrameTime/(F1_0/1000) // Substract the time the game needs to do it's operations
- 10; // Substract 10ms inaccuracy due to OS scheduling
if (FrameDelay > 0)
SDL_Delay(FrameDelay);
}
timer_delay2(GameArg.SysMaxFPS);
while (FrameTime < f1_0 / GameArg.SysMaxFPS)
{
// if (GameArg.SysUseNiceFPS)
// timer_delay(f1_0 / GameArg.SysMaxFPS - FrameTime);
timer_value = timer_get_fixed_seconds();
FrameTime = timer_value - last_timer_value;
}
@ -1499,7 +1487,7 @@ int do_game_pause()
while (Game_paused)
{
timer_delay(1);
timer_delay2(20);
#ifdef OGL
show_boxed_message(msg);
#endif

View file

@ -677,7 +677,7 @@ void kconfig_sub(kc_item * items,int nitems, char * title)
while(1)
{
timer_delay(400);
timer_delay2(20);
#ifdef OGL
gr_flip();

View file

@ -312,7 +312,7 @@ void kmatrix_view(int network)
done = 0;
while(!done) {
timer_delay(400);
timer_delay2(20);
kmatrix_redraw();
for (i=0; i<4; i++ )

View file

@ -236,7 +236,7 @@ void show_game_rules(netgame_info game)
done = 0;
while(!done) {
timer_delay(400);
timer_delay2(20);
gr_set_current_canvas(NULL);
#ifdef OGL
gr_flip();

View file

@ -838,7 +838,7 @@ int newmenu_do3_real( char * title, char * subtitle, int nitems, newmenu_item *
#endif
while(!done) {
timer_delay(400);
timer_delay2(20);
#ifdef OGL
gr_flip();
@ -1631,7 +1631,7 @@ ReadFileNames:
#endif
while(!done) {
timer_delay(400);
timer_delay2(20);
ocitem = citem;
ofirst_item = first_item;
gr_update();
@ -2038,7 +2038,7 @@ int newmenu_listbox1( char * title, int nitems, char * items[], int allow_abort_
#endif
while(!done) {
timer_delay(400);
timer_delay2(20);
#ifdef OGL
gr_flip();
nm_draw_background1(NULL);

View file

@ -372,7 +372,7 @@ ReshowScores:
looper = 0;
while(!done) {
timer_delay(400);
timer_delay2(20);
gr_set_current_canvas(NULL);
#ifdef OGL
gr_flip();

View file

@ -126,7 +126,7 @@ int show_title_screen( char * filename, int allow_keys )
gr_free_bitmap_data (&title_bm);
break;
}
timer_delay(400);
timer_delay2(20);
}
gr_free_bitmap_data (&title_bm);
@ -753,7 +753,7 @@ int show_briefing(int screen_num, char *message)
}
while (timer_get_fixed_seconds() < start_time + KEY_DELAY_DEFAULT/2)
;
timer_delay(400);
timer_delay2(20);
#ifdef OGL
gr_flip();
show_fullscr(&briefing_bm);
@ -876,7 +876,7 @@ int show_briefing(int screen_num, char *message)
}
while (timer_get_approx_seconds() < start_time + KEY_DELAY_DEFAULT/2)
;
timer_delay(400);
timer_delay2(20);
#ifdef OGL
gr_flip();
show_fullscr(&briefing_bm);