Эмулятор 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 (4194304).
  • cpu.T это циклы пройдены до сих пор.
  • PerfCountFrequency является результатом QueryPerformanceFrequency который я звонил, прежде чем войти в цикл.

Когда я сравниваю его с другим эмулятором (VBA), который играет с правильной скоростью, мой эмулятор работает быстрее. В чем здесь проблема?

5

Решение

Сон здесь неправильная функция. От https://msdn.microsoft.com/en-us/library/windows/desktop/ms686298(v=vs.85).aspx упоминается, что «если dwMilliseconds меньше, чем разрешение системных часов, поток может находиться в спящем режиме меньше указанного промежутка времени»

В DirectX может быть метод (VBLANK ??), но вы могли бы решить незначительные проблемы, определив, каким должно быть время следующего кадра, и, если режим сна слишком мал, сохраняйте режимы сна, пока он не превысит разрешение таймера.

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector