void CG1Helper::m_displayFunc() { char WinTitle [100]; double Framerate = 0; double MSPF = 0; glClearColor(0.0f,0.0f,0.0f,1.0f); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); double m = GetMicroSec(); smProgramStep(); Framerate = 1000000.0/(GetMicroSec()-current_time); MSPF = (GetMicroSec()-m)*0.001; current_time=GetMicroSec(); #ifdef WIN32 sprintf_s(WinTitle, sizeof(WinTitle),"Computergraphik I Template /// %3.1f FPS (%3.4f ms per actual draw)", Framerate, MSPF); #else snprintf(WinTitle, sizeof(WinTitle),"Computergraphik I Template /// %3.1f FPS (%3.4f ms per actual draw)", Framerate, MSPF); #endif glutSetWindowTitle(WinTitle); if(smFrameBuffer->colorBuffer.getDataPointer()) { glBindTexture(GL_TEXTURE_2D,FBTexture); glTexSubImage2D(GL_TEXTURE_2D,0,0,0,smFrameBuffer->getWidth(),smFrameBuffer->getHeight(),GL_RGBA,GL_UNSIGNED_BYTE,smFrameBuffer->colorBuffer.getDataPointer()); glEnable(GL_TEXTURE_2D); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex2f(-1,-1); glTexCoord2f(1,0); glVertex2f( 1,-1); glTexCoord2f(1,1); glVertex2f( 1, 1); glTexCoord2f(0,1); glVertex2f(-1, 1); glEnd(); glDisable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,0); int scale = glcontextWidth/smFrameBuffer->getWidth(); if (scale>=3) drawGrid(glcontextWidth, glcontextHeight, scale); } glutSwapBuffers(); }
// エミュメイン void PSPEMU_DoFrame(void) { static uint32 ulRenderFrame = 0; static uint32 ulFPSCounter = 0; uint32 cur_time; uint32 frames_since_last, i; uint32 FramePeriod; uint32 Diff; // input key update InputUpdatePad(); // skip frames while disk accessed while(g_NESConfig.preferences.UseFDSDiskASkip && NES_DiskAccessed()) { NES_emulate_frame(FALSE); last_frame_time = cur_time = GetMicroSec(); } // get the current time cur_time = GetMicroSec(); if (cur_time < last_frame_time) { Diff = cur_time + (0xFFFFFFFF-last_frame_time); } else { Diff = cur_time - last_frame_time; } if (stKeyState.nSpeedMode == EMU_SPEED_NORMAL) { // NORMAL FramePeriod = NormalFramePeriodTime; } else if (stKeyState.nSpeedMode == EMU_SPEED_MODE1) { // MODE1 FramePeriod = Mode1FramePeriodTime; } else { // MODE2 FramePeriod = Mode2FramePeriodTime; } frames_since_last = Diff / FramePeriod; if (!frames_since_last) { // 前回から、次のフレームまで時間が経ってないので抜ける if(setting.batterypowersave) sceKernelDelayThread(1); //Sleep a little before looping return; } for(i = 1; i < frames_since_last; i+=1) { InputUpdateRapid(); NES_emulate_frame(FALSE); last_frame_time += FramePeriod; } isLate=(frames_since_last-1); //If frames_since_last is 1, no frame was skipped. InputUpdateRapid(); // emulate current frame NES_emulate_frame(TRUE); //>>davex framecount++; f60framecount++; //<<< ulRenderFrame++; if ((ulFPSCounter+1000000) < cur_time || ulFPSCounter > cur_time) { ulFPSCounter = cur_time; g_ulFPS = ulRenderFrame; ulRenderFrame = 0; } Scr_BltScreen(); last_frame_time += FramePeriod; }
// Freeseして処理終えたら呼び出す void PSPEMU_Thaw(void) { if(g_NESConfig.sound.enabled) wavout_enable=1; last_frame_time = GetMicroSec(); PSPEMU_SetFrameSpeed(); }