More precise and stable FPS limiter, not using the SDL semaphore system.

Also removed the "3D operation detected" dialog which is useless.
This commit is contained in:
Luigi__ 2009-04-01 19:40:39 +00:00
parent 56f013a04c
commit 36a45e8cfc
2 changed files with 30 additions and 16 deletions

View File

@ -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;
}

View File

@ -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();