コード例 #1
0
ファイル: FPS.cpp プロジェクト: Asmodean-/dsfix
void _stdcall updateFramerate(unsigned int cmd) {	
	// If rendering was performed, update animation step-time
	if((cmd == 2) || (cmd == 5)) {
		// FPS regulation based on previous render
		double maxFPS = (double)Settings::get().getCurrentFPSLimit();
		double minFPS = 10.0f;
		double currentTime = getElapsedTime();
		double deltaTime = currentTime - lastRenderTime;
		lastRenderTime = currentTime;

		// Update step-time
		updateAnimationStepTime((float)deltaTime, (float)minFPS, (float)maxFPS);
	}
}
コード例 #2
0
ファイル: FPS.cpp プロジェクト: wT-/dsfix
// Render Loop
//----------------------------------------------------------------------------------------
void renderLoop(void) {
	bool run = true;
	DWORD threadID = GetCurrentThreadId();

	int taskFunc;
	DWORD task;

	//Pointers conversion
	DWORD pGetTaskF = convertAddress(0x00577330);
	DWORD pCleanTaskF = convertAddress(0x00577450);

	QueryPerformanceFrequency(&timerFreq);
	QueryPerformanceCounter(&counterAtStart);
	float lastTime = 0.0f;

	// Render loop
	do {
		// Get Job & state
		_asm { 
			PUSH 1
			MOV ECX, HighGraphics
			CALL pGetTaskF				//Get task pointer
			MOV task, EAX				//Store task pointer (EAX)
			MOV ECX, [EAX+0x0C]			//Get task function
			MOV taskFunc, ECX			//Store function
		}
		if (task == (HighGraphics+0x08))	//No task
			break;		

		switch (taskFunc) {
			// Exit loop
		case 0:
			_asm {
				MOV EDI, TaskFuncPtr
				MOV EAX, [EDI]
				MOV EDX, [EAX+0x0C]
				MOV ECX, EDI
				CALL EDX
			}
			run = false;
			break;
			// Start Watch-dog Thread
		case 1:
			_asm {
				MOV ESI, task
				MOV EDI, TaskFuncPtr
				MOV ECX, [ESI+0x2C]
				MOV EDX, [ESI+0x28]
				MOV EAX, [EDI]
				PUSH ECX
				MOV ECX, [ESI+0x24]
				PUSH EDX
				MOV EDX, [EAX+0x08]
				PUSH ECX
				MOV ECX, EDI
				CALL EDX
			}
			break;
			// Update and/or Render
		case 2: 
			_asm {
				MOV ESI, task
				MOV EDI, TaskFuncPtr
				MOV ECX, [ESI+0x24]
				MOV EAX, [EDI]
				MOV EDX, [EAX+0x10]
				PUSH ECX
				MOV ECX, EDI
				CALL EDX
			}
			break;
			// Do nothing (was debug log)
		case 3:
			_asm {
				MOV EDI, TaskFuncPtr
				MOV EAX, [EDI]
				MOV EDX, [EAX+0x14]
				MOV ECX, TaskFuncPtr
				CALL EDX
			}
			break;
			// Do nothing (was debug log)		
		case 4:
			_asm {
				MOV EDI, TaskFuncPtr
				MOV EAX, [EDI]
				MOV EDX, [EAX+0x18]
				MOV ECX, TaskFuncPtr
				CALL EDX
			}
			break;
			// Force Render (caused by watchdog timeout)
		case 5:
			_asm {
				MOV EDI, TaskFuncPtr
				MOV EAX, [EDI]
				MOV EDX, [EAX+0x1C]
				MOV ECX, TaskFuncPtr
				CALL EDX
			}
			break;
		default:
			break;
		}

		// If rendering was performed, update animation step-time
		if((taskFunc == 2) || (taskFunc == 5)) {
			// FPS regulation
			float maxFPS = (float)Settings::get().getCurrentFPSLimit();
			float minFPS = 10.0f;
			float currentTime = getElapsedTime();
			float deltaTime = currentTime - lastTime;

			// Update step-time
			updateAnimationStepTime((float)deltaTime, minFPS, maxFPS);

			lastTime = currentTime;
		}

		// Task cleanup
		_asm {
			MOV ESI, task
			PUSH ESI
			MOV ECX, HighGraphics
			CALL pCleanTaskF
		}

	} while (run);
}