2015-07-18 24 views
5

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?

+0

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

+0

Czy liczą się cykle procesora Gameboy poprawnie? –

+0

@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

Odpowiedz

1

Sen jest tu nieprawidłową funkcją. Od https://msdn.microsoft.com/en-us/library/windows/desktop/ms686298(v=vs.85).aspx wspomina, że ​​"jeśli dwMlisekundy jest mniejsza niż rozdzielczość zegara systemowego, wątek może spać mniej niż określony czas"

DirectX może mieć metodę (VBLANK ??), ale możesz pracować pomijanie drobnych problemów przez ustalenie, co powinno być następnym razem, a jeśli sen jest zbyt mały, oszczędzanie Śpi, dopóki nie osiągnie rozdzielczości timera.