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?
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
Gameboy CPU döngülerini doğru olarak mı sayıyorsunuz? –
@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