2015-07-18 2 views
5

Я пытаюсь создать эмулятор gameboy, но он играет быстрее, чем нужно.Эмулятор 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), который играет на правильной скорости, мой эмулятор идет быстрее. В чем проблема?

+0

Я бы не использовал 'QueryPerformancCounter()'. Я слышал, что, поскольку современные процессоры динамически изменяют скорость для экономии энергии, это не всегда всегда точно, хотя у меня нет определенного источника для этого. Обычно я использую std :: chrono :: stable_clock для профилирования до тех пор, пока его гранулярность достаточно меньше периодов, которые вы пытаетесь выполнить. – RyanP

+0

Правильно ли вы считаете циклы процессоров Gameboy? –

+0

@RyanP Как только я включаю , я получаю сообщение «Количество ошибок превышает 100. Остановка компиляции. (Использование Visual Studio). Я подожду еще одно решение. – devil0150

ответ

1

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

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

Смежные вопросы