Próbuję stworzyć emulator gry, ale gra jest szybszy niż powinien.Emulator Gameboy gra szybciej niż się spodziewano
To jest kod czasu, którego używam w głównej pętli.
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
jest cykli na sekundę procesora gameboy (4194304).cpu.T
to cykle przekazywane do tej pory.PerfCountFrequency
to wynik QueryPerformanceFrequency, który wywołałem przed wejściem do pętli.
Kiedy porównuję to z innym emulatorem (VBA), który odtwarza z właściwą prędkością, mój emulator działa szybciej. Jaki jest tutaj problem?
Nie użyłbym 'QueryPerformancCounter()'. Słyszałem, że od czasu, gdy nowoczesne procesory dynamicznie zmieniają swoją prędkość w celu oszczędzania energii, nie zawsze jest to dokładne, chociaż nie mam na to konkretnego źródła. Generalnie używam std :: chrono :: steady_clock do profilowania, o ile jego ziarnistość jest wystarczająco mniejsza niż okresy próbowania czasu. – RyanP
Czy liczą się cykle procesora Gameboy poprawnie? –
@RyanP Zaraz po dodaniu pojawia się komunikat "Liczba błędów przekracza 100. Zatrzymywanie kompilacji (przy użyciu Visual Studio) .Następnie poczekam na inne rozwiązanie –
devil0150