void ForwardToFrame(unsigned long Frame, FILE* Log1, FILE* Log2) { unsigned long FrameNumber1=0, FrameNumber2=0; long Position1, Position2; while(FrameNumber1<Frame && FrameNumber2<Frame && !feof(Log1) && !feof(Log2)) { if(Frame-FrameNumber1>2) fseek(Log1, (Frame-FrameNumber1-2)*strlen("Frame n Begin End")-2, SEEK_CUR); if(Frame-FrameNumber2>2) fseek(Log2, (Frame-FrameNumber2-2)*strlen("Frame n Begin End")-2, SEEK_CUR); Position1=ftell(Log1); Position2=ftell(Log2); FrameNumber1=SkipFrame(Log1); FrameNumber2=SkipFrame(Log2); if(FrameNumber1>=Frame) fseek(Log1, Position1, SEEK_SET); if(FrameNumber2>=Frame) fseek(Log2, Position2, SEEK_SET); while(FrameNumber1<FrameNumber2) FrameNumber1=SkipFrame(Log1); while(FrameNumber2<FrameNumber1) FrameNumber2=SkipFrame(Log2); } }
void G_RunFrames1 (edict_t *ent, int start_frame, int end_frame, int *skip_frames, qboolean reverse) { int next_frame=ent->s.frame; if (reverse) next_frame = ent->s.frame-1; else next_frame = ent->s.frame+1; while (ent->s.frame != next_frame) { if (reverse) // run frames backwards { if (skip_frames && SkipFrame(next_frame, skip_frames)) // skip this frame { next_frame--; continue; } if ((next_frame >= start_frame) && (next_frame <= end_frame)) ent->s.frame=next_frame; else ent->s.frame = next_frame = end_frame; } else { if (skip_frames && SkipFrame(next_frame, skip_frames)) { next_frame++; continue; } if ((next_frame <= end_frame) && (next_frame >= start_frame)) ent->s.frame=next_frame; else ent->s.frame = next_frame = start_frame; } } }
void TargetEpocGameL() { char buff[24]; // fps count c string struct timeval tval; // timing int thissec = 0, frames_done = 0, frames_shown = 0; int target_fps, target_frametime, too_fast, too_fast_time; int i, underflow; TRawEvent blevent; MainInit(); buff[0] = 0; // just to keep the backlight on.. blevent.Set(TRawEvent::EActive); // loop? for(;;) { if(gamestate == PGS_Running) { // prepare window and stuff CGameWindow::ConstructResourcesL(); // if the system has something to do, it should better do it now User::After(50000); //CPolledActiveScheduler::Instance()->Schedule(); // pal/ntsc might have changed, reset related stuff if(Pico.m.pal) { target_fps = 50; if(!noticeMsgTime.tv_sec) strcpy(noticeMsg, "PAL@SYSTEM@/@50@FPS"); } else { target_fps = 60; if(!noticeMsgTime.tv_sec) strcpy(noticeMsg, "NTSC@SYSTEM@/@60@FPS"); } target_frametime = 1000000/target_fps; if(!noticeMsgTime.tv_sec && pico_was_reset) gettimeofday(¬iceMsgTime, 0); pico_was_reset = too_fast = 0; reset_timing = 1; while(gamestate == PGS_Running) { gettimeofday(&tval, 0); if(reset_timing) { reset_timing = 0; thissec = tval.tv_sec; frames_done = tval.tv_usec/target_frametime; } // show notice message? char *notice = 0; if(noticeMsgTime.tv_sec) { if((tval.tv_sec*1000000+tval.tv_usec) - (noticeMsgTime.tv_sec*1000000+noticeMsgTime.tv_usec) > 2000000) // > 2.0 sec noticeMsgTime.tv_sec = noticeMsgTime.tv_usec = 0; else notice = noticeMsg; } // second changed? if(thissec != tval.tv_sec) { #ifdef BENCHMARK static int bench = 0, bench_fps = 0, bench_fps_s = 0, bfp = 0, bf[4]; if(++bench == 10) { bench = 0; bench_fps_s = bench_fps; bf[bfp++ & 3] = bench_fps; bench_fps = 0; } bench_fps += frames_shown; sprintf(buff, "%02i/%02i/%02i", frames_shown, bench_fps_s, (bf[0]+bf[1]+bf[2]+bf[3])>>2); #else if(currentConfig.iFlags & 2) sprintf(buff, "%02i/%02i", frames_shown, frames_done); #endif thissec = tval.tv_sec; if((thissec & 7) == 7) UserSvr::AddEvent(blevent); // in is quite common for this implementation to leave 1 fame unfinished // when second changes. This creates sound clicks, so it's probably better to // skip that frame and render sound if(PsndOut && frames_done < target_fps && frames_done > target_fps-5) { SkipFrame(1); frames_done++; } // try to prevent sound buffer underflows by making sure we did _exactly_ // target_fps sound updates and copying last samples over and over again if(PsndOut && frames_done < target_fps) for(; frames_done < target_fps; frames_done++) { PsndOut = gameAudio->DupeFrameL(underflow); if(!PsndOut) { // sound output problems? strcpy(noticeMsg, "SOUND@OUTPUT@ERROR;@SOUND@DISABLED"); gettimeofday(¬iceMsgTime, 0); break; } if(underflow) break; } frames_done = frames_shown = 0; } if(currentConfig.iFrameskip >= 0) { // frameskip enabled for(i = 0; i < currentConfig.iFrameskip; i++) { SkipFrame(frames_done < target_fps); frames_done++; CGameWindow::DoKeys(tval); } } else if(tval.tv_usec > (frames_done+1)*target_frametime) { // auto frameskip // no time left for this frame - skip SkipFrame(1); frames_done++; CGameWindow::DoKeys(tval); too_fast = 0; continue; } else if(tval.tv_usec < (too_fast_time=frames_done*target_frametime)) { // we are too fast if(++too_fast > 2) { User::After(too_fast_time-tval.tv_usec); too_fast = 0; }// sleep, but only if we are _really_ fast } // draw vidDrawFrame(notice, buff, frames_shown); if(PsndOut && frames_done < target_fps) { PsndOut = gameAudio->NextFrameL(); if(!PsndOut) { // sound output problems? strcpy(noticeMsg, "SOUND@OUTPUT@ERROR;@SOUND@DISABLED"); gettimeofday(¬iceMsgTime, 0); } } frames_done++; frames_shown++; CGameWindow::DoKeys(tval); } // save SRAM if((currentConfig.iFlags & 1) && SRam.changed) { saveLoadGame(0, 1); SRam.changed = 0; } CGameWindow::SendClientWsEvent(EEventGamePaused); CGameWindow::FreeResources(); } else if(gamestate == PGS_Paused) {