diff --git a/desmume/src/gtk-glade/desmume.cpp b/desmume/src/gtk-glade/desmume.cpp index f798f6ced..7055a9025 100755 --- a/desmume/src/gtk-glade/desmume.cpp +++ b/desmume/src/gtk-glade/desmume.cpp @@ -25,6 +25,8 @@ gboolean EmuLoop(gpointer data); static BOOL regMainLoop = FALSE; +#define TICKS_PER_FRAME 17 + static BOOL noticed_3D=FALSE; volatile BOOL execute = FALSE; @@ -121,6 +123,7 @@ void desmume_cycle() Uint32 fps, fps_SecStart, fps_FrameCount; +Uint32 ticksPrevFrame = 0, ticksCurFrame = 0; static void Draw() { } @@ -128,15 +131,18 @@ static void Draw() gboolean EmuLoop(gpointer data) { int i; - if (!noticed_3D) { + /*if (!noticed_3D) { GtkWidget * dlg = glade_xml_get_widget(xml, "w3Dop"); gtk_widget_show(dlg); noticed_3D=TRUE; - } + }*/ if(desmume_running()) /* Si on est en train d'executer le programme ... */ { static int limiter_frame_counter = 0; + + ticksCurFrame = SDL_GetTicks(); + fps_FrameCount += Frameskip + 1; if(!fps_SecStart) fps_SecStart = SDL_GetTicks(); if(SDL_GetTicks() - fps_SecStart >= 1000) @@ -158,16 +164,24 @@ gboolean EmuLoop(gpointer data) notify_Tools(); gtk_widget_queue_draw(pDrawingArea); gtk_widget_queue_draw(pDrawingArea2); + + if(!glade_fps_limiter_disabled) + { + while((ticksCurFrame - ticksPrevFrame) < TICKS_PER_FRAME) + ticksCurFrame = SDL_GetTicks(); + } + + ticksPrevFrame = ticksCurFrame; - if ( !glade_fps_limiter_disabled) { + /* if ( !glade_fps_limiter_disabled) { limiter_frame_counter += 1; if ( limiter_frame_counter >= FPS_LIMITER_FRAME_PERIOD) { limiter_frame_counter = 0; - /* wait for the timer to expire */ + /* wait for the timer to expire *-/ SDL_SemWait( glade_fps_limiter_semaphore); } - } + }*/ return TRUE; } diff --git a/desmume/src/gtk-glade/main.cpp b/desmume/src/gtk-glade/main.cpp index 30412a21a..90a312b39 100755 --- a/desmume/src/gtk-glade/main.cpp +++ b/desmume/src/gtk-glade/main.cpp @@ -40,7 +40,7 @@ /* * The frame limiter semaphore */ -SDL_sem *glade_fps_limiter_semaphore; +//SDL_sem *glade_fps_limiter_semaphore; int glade_fps_limiter_disabled = 0; GtkWidget * pWindow; @@ -393,17 +393,17 @@ joinThread_gdb( void *thread_handle) { * * @return The interval to the next call (required by SDL) */ -static Uint32 +/*static Uint32 glade_fps_limiter_fn( Uint32 interval, void *param) { SDL_sem *sdl_semaphore = (SDL_sem *)param; - /* signal the semaphore if it is getting low */ + /* signal the semaphore if it is getting low *-/ if ( SDL_SemValue( sdl_semaphore) < 4) { SDL_SemPost( sdl_semaphore); } return interval; -} +}*/ /* ***** ***** MAIN ***** ***** */ @@ -554,12 +554,12 @@ common_gtk_glade_main( struct configured_features *my_config) { /* setup the frame limiter and indicate if it is disabled */ glade_fps_limiter_disabled = my_config->disable_limiter; - if ( !glade_fps_limiter_disabled) { - /* create the semaphore used for fps limiting */ + /* if ( !glade_fps_limiter_disabled) { + /* create the semaphore used for fps limiting *-/ glade_fps_limiter_semaphore = SDL_CreateSemaphore( 1); /* start a SDL timer for every FPS_LIMITER_FRAME_PERIOD - * frames to keep us at 60 fps */ + * frames to keep us at 60 fps *-/ limiter_timer = SDL_AddTimer( 16 * FPS_LIMITER_FRAME_PERIOD, glade_fps_limiter_fn, glade_fps_limiter_semaphore); @@ -569,17 +569,17 @@ common_gtk_glade_main( struct configured_features *my_config) { SDL_DestroySemaphore( glade_fps_limiter_semaphore); glade_fps_limiter_disabled = 1; } - } + }*/ /* start event loop */ gtk_main(); desmume_free(); - if ( !glade_fps_limiter_disabled) { - /* tidy up the FPS limiter timer and semaphore */ + /* if ( !glade_fps_limiter_disabled) { + /* tidy up the FPS limiter timer and semaphore *-/ SDL_RemoveTimer( limiter_timer); SDL_DestroySemaphore( glade_fps_limiter_semaphore); - } + }*/ /* Unload joystick */ uninit_joy();