- // second changed?\r
- if(thissec != tval.tv_sec) {\r
-#ifdef BENCHMARK\r
- static int bench = 0, bench_fps = 0, bench_fps_s = 0, bfp = 0, bf[4];\r
- if(++bench == 10) {\r
- bench = 0;\r
- bench_fps_s = bench_fps;\r
- bf[bfp++ & 3] = bench_fps;\r
- bench_fps = 0;\r
- }\r
- bench_fps += frames_shown;\r
- sprintf(fpsbuff, "%02i/%02i/%02i", frames_shown, bench_fps_s, (bf[0]+bf[1]+bf[2]+bf[3])>>2);\r
-#else\r
- if(currentConfig.EmuOpt & 2)\r
- sprintf(fpsbuff, "%02i/%02i", frames_shown, frames_done);\r
-#endif\r
- thissec = tval.tv_sec;\r
-\r
- if(PsndOut == 0 && currentConfig.Frameskip >= 0) {\r
- frames_done = frames_shown = 0;\r
- } else {\r
- // it is quite common for this implementation to leave 1 fame unfinished\r
- // when second changes, but we don't want buffer to starve.\r
- if(PsndOut && frames_done < target_fps && frames_done > target_fps-5) {\r
- updateKeys();\r
- SkipFrame(1); frames_done++;\r
- }\r
-\r
- frames_done -= target_fps; if (frames_done < 0) frames_done = 0;\r
- frames_shown -= target_fps; if (frames_shown < 0) frames_shown = 0;\r
- if (frames_shown > frames_done) frames_shown = frames_done;\r
- }\r
- }\r
-\r
- lim_time = (frames_done+1) * target_frametime;\r
- if(currentConfig.Frameskip >= 0) { // frameskip enabled\r
- for(i = 0; i < currentConfig.Frameskip; i++) {\r
- updateKeys();\r
- SkipFrame(1); frames_done++;\r
- if (PsndOut) { // do framelimitting if sound is enabled\r
- gettimeofday(&tval, 0);\r
- if(thissec != tval.tv_sec) tval.tv_usec+=1000000;\r
- if(tval.tv_usec < lim_time) { // we are too fast\r
- simpleWait(thissec, lim_time);\r
- }\r
- }\r
- lim_time += target_frametime;\r
- }\r
- } else if(tval.tv_usec > lim_time) { // auto frameskip\r
- // no time left for this frame - skip\r
- updateKeys();\r
- SkipFrame(tval.tv_usec < lim_time+target_frametime); frames_done++;\r
- continue;\r
- }\r
-\r
- updateKeys();\r
- PicoFrame();\r
-\r
-#if 0\r
- // debug\r
- {\r
- static unsigned char oldscr[320*240*2];\r
- FILE *f; char name[128]; int i;\r
- for (i = 0; i < 320*240*2; i++)\r
- if(oldscr[i] != ((unsigned char *)gp2x_screen)[i]) break;\r
- if (i < 320*240*2)\r
- {\r
- for (i = 0; i < 320*240*2; i++)\r
- oldscr[i] = ((unsigned char *)gp2x_screen)[i];\r
- sprintf(name, "%05i.raw", frame_count);\r
- f = fopen(name, "wb");\r
- if (!f) { printf("!f\n"); exit(1); }\r
- fwrite(gp2x_screen, 1, 320*240*2, f);\r
- fclose(f);\r
- }\r
- }\r
-#endif\r
-\r
- // check time\r
- gettimeofday(&tval, 0);\r
- if(thissec != tval.tv_sec) tval.tv_usec+=1000000;\r
-\r
- // sleep if we are still too fast\r
- if(PsndOut != 0 || currentConfig.Frameskip < 0)\r
- {\r
- // usleep sleeps for ~20ms minimum, so it is not a solution here\r
- gettimeofday(&tval, 0);\r
- if(thissec != tval.tv_sec) tval.tv_usec+=1000000;\r
- if(tval.tv_usec < lim_time)\r
- {\r
- // we are too fast\r
- simpleWait(thissec, lim_time);\r
- }\r
- }\r
-\r
- blit(fpsbuff, notice);\r
-\r
- frames_done++; frames_shown++;\r
- }\r
-\r
- // save SRAM\r
- if((currentConfig.EmuOpt & 1) && SRam.changed) {\r
- emu_SaveLoadGame(0, 1);\r
- SRam.changed = 0;\r
- }\r