我正在尝试做一个游戏仿真器,但它的播放速度比它应该更快。
这是我在主循环中使用的计时代码。
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是游戏程序cpu (4194304)每秒的周期。cpu.T是经过循环的。PerfCountFrequency是我在进入循环之前调用的QueryPerformanceFrequency的结果。当我将它与以正确速度播放的另一个模拟器(VBA)进行比较时,我的仿真器运行得更快。这里有什么问题?
发布于 2015-07-21 05:50:10
睡眠在这里是错误的。在https://msdn.microsoft.com/en-us/library/windows/desktop/ms686298(v=vs.85).aspx中,它提到“如果dwMilliseconds小于系统时钟的分辨率,线程的睡眠时间可能小于指定的时间长度”。
DirectX可能有一个方法(VBLANK??),但是您可以通过计算下一个帧的时间来解决一些小问题,如果睡眠太小,则将睡眠保存到超出定时器分辨率为止。
https://stackoverflow.com/questions/31494913
复制相似问题