Я пытаюсь создать эмулятор 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), который играет на правильной скорости, мой эмулятор идет быстрее. В чем проблема?
Я бы не использовал 'QueryPerformancCounter()'. Я слышал, что, поскольку современные процессоры динамически изменяют скорость для экономии энергии, это не всегда всегда точно, хотя у меня нет определенного источника для этого. Обычно я использую std :: chrono :: stable_clock для профилирования до тех пор, пока его гранулярность достаточно меньше периодов, которые вы пытаетесь выполнить. – RyanP
Правильно ли вы считаете циклы процессоров Gameboy? –
@RyanP Как только я включаю, я получаю сообщение «Количество ошибок превышает 100. Остановка компиляции. (Использование Visual Studio). Я подожду еще одно решение. –
devil0150