예제 #1
0
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();
}
예제 #2
0
// エミュメイン
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;
}
예제 #3
0
// Freeseして処理終えたら呼び出す
void PSPEMU_Thaw(void)
{
	if(g_NESConfig.sound.enabled) wavout_enable=1;
	last_frame_time = GetMicroSec();
	PSPEMU_SetFrameSpeed();
}