8 static uint64 desiredfps;
10 void RefreshThrottleFPS(void)
12 uint64 f=FCEUI_GetDesiredFPS();
13 // great, a bit faster than before
17 tfreq<<=16; /* Adjustment for fps returned from FCEUI_GetDesiredFPS(). */
20 static uint64 GetCurTime(void)
26 ret=(uint64)tv.tv_sec*1000000;
31 INLINE void SpeedThrottle(void)
33 static uint64 ttime,ltime;
39 if( (ttime-ltime) < (tfreq/desiredfps) )
43 if( (ttime-ltime) >= (tfreq*4/desiredfps))
46 ltime+=tfreq/desiredfps;
53 static int usec_aim = 0, usec_done = 0;
54 static int skip_count = 0;
56 INLINE void SpeedThrottle(void)
58 static struct timeval tv_prev;
59 struct timeval tv_now;
60 int delta_nom = PAL ? 19997 : 16639; // ~50.007, 19.997 ms/frame : ~60.1, 16.639 ms/frame
63 if (usec_done == 0) { // first time
65 gettimeofday(&tv_prev, 0);
69 gettimeofday(&tv_now, 0);
71 usec_aim += delta_nom;
72 if (tv_now.tv_sec != tv_prev.tv_sec)
74 usec_done += tv_now.tv_usec - tv_prev.tv_usec;
77 if (Settings.frameskip >= 0)
79 if (skip_count >= Settings.frameskip)
86 else if (usec_done > usec_aim + 1024*4)
89 if (usec_done - usec_aim > 1024*32)
90 usec_done = usec_aim = 1; // too much behind, try to recover..
99 while (usec_done < usec_aim)
101 gettimeofday(&tv_now, 0);
103 if (tv_now.tv_sec != tv_prev.tv_sec)
104 usec_done += 1000000;
105 usec_done += tv_now.tv_usec - tv_prev.tv_usec;
108 usec_done = usec_done - usec_aim + 1; // reset to prevent overflows