Gameboy模拟器玩得比预期的快

Gameboy emulator plays faster than expected

本文关键字:模拟器 Gameboy      更新时间:2023-10-16

我正在尝试制作一个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是我在进入循环之前调用的queryperformancfrequency的结果。

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

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

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