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:
parent
827f0d5fd1
commit
17c16bfc5b
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
16
main/game.c
16
main/game.c
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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++ )
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -372,7 +372,7 @@ ReshowScores:
|
|||
looper = 0;
|
||||
|
||||
while(!done) {
|
||||
timer_delay(400);
|
||||
timer_delay2(20);
|
||||
gr_set_current_canvas(NULL);
|
||||
#ifdef OGL
|
||||
gr_flip();
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue