Gameboy模拟器播放比预期的更快

我正在试图制作一个游戏模拟器,但是它的播放速度比它应该的快。

这是我在主循环中使用的时间码。

if (cpu.T >= CLOCKSPEED / 40) // if more than 1/40th of cycles passed { // Get milliseconds passed QueryPerformanceCounter(&EndCounter); unsigned long long counter = EndCounter.QuadPart - LastCounter.QuadPart; MSperFrame = 1000.0f * ((double)counter / (double)PerfCountFrequency); LastCounter = EndCounter; // if 1/40th of a second hasn't passed, wait until it passes if (MSperFrame < 25) Sleep(25 - MSperFrame); MSperFrame = 0; cpu.T -= CLOCKSPEED / 40; } 
  • CLOCKSPEED是gameboy cpu(4194304)的每秒周期数。
  • cpu.T是循环直到现在。
  • PerfCountFrequency是我在进入循环之前调用的QueryPerformanceFrequency的结果。

当我将其与另一个以正确速度播放的仿真器(VBA)进行比较时,我的仿真器运行速度更快。 这里有什么问题?

睡眠在这里是错误的功能。 从https://msdn.microsoft.com/en-us/library/windows/desktop/ms686298(v=vs.85).aspx它提到“如果dwMilliseconds小于系统时钟的分辨率,线程可能睡眠时间少于指定的时间长度“

DirectX可能有一个方法(VBLANK ??),但是你可以通过计算下一个帧时间应该是什么来解决小问题,如果睡眠太小,保存睡眠,直到超过定时器分辨率。