2015-07-18 105 views
5

Bir gameboy öykünücüsü yapmaya çalışıyorum, ancak olması gerekenden daha hızlı çalışıyor.Gameboy emülatörü beklenenden daha hızlı oynar

Bu, ana döngüde kullanıyorum zamanlama kodudur.

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 işlemci (4194304) saniye başına devir olarak verilmektedir.
  • cpu.T şu ana kadar geçen döngülerdir.
  • PerfCountFrequency, döngüye girmeden önce aradığım QueryPerformanceFrequency sonucudur.

Bunu doğru hızda oynayan başka bir öykünücüyle (VBA) karşılaştırdığımda, öykünücüm daha hızlı ilerler. Burada sorun nedir?

+0

QueryPerformancCounter() 'ı kullanmazdım. Modern CPU'ların güç tasarrufları için hızlarını dinamik olarak değiştirdiğinden beri bunun her zaman kesin olmadığını, ancak bunun için kesin bir kaynağım olmadığını duydum. Genel olarak, parçacığı zamanlamaya çalıştığınız dönemlerden yeterince küçük olduğu sürece, profil oluşturmak için std :: chrono :: steady_clock'u kullanırım. – RyanP

+0

Gameboy CPU döngülerini doğru olarak mı sayıyorsunuz? –

+0

@RyanP 'u eklediğimde "Hata sayısı 100'ü geçiyor. Derlemeyi durduruyorum. (Visual Studio'nun Kullanılması) .Şimdi için başka bir çözüm bekleyeceğim. – devil0150

cevap

1

Burada yanlış işlev uykudır. https://msdn.microsoft.com/en-us/library/windows/desktop/ms686298(v=vs.85).aspx'dan, "dwMilliseconds, sistem saatinin çözünürlüğünden daha azsa, iş parçacığı belirtilen süreden daha az bir süre için uyuyabilir" ifadesinden bahseder.

DirectX bir yönteme (VBLANK ??) sahip olabilir, ancak Bir sonraki kare zamanın ne olması gerektiğine bakarak küçük meselelerin dışında ve uyku çok küçükse, zamanlayıcı çözünürlüğünün üzerine çıkıncaya kadar Uykulardan tasarruf sağlar.