Gameboy模拟器玩得比预期的快
Gameboy emulator plays faster than expected
我正在尝试制作一个gameboy模拟器,但是它的播放速度比它应该的要快。
这是我在主循环中使用的计时代码。
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 cpu(4194304)的每秒周期。 -
cpu.T
是经过的循环数。 -
PerfCountFrequency
是我在进入循环之前调用的queryperformancfrequency的结果。
当我将它与另一个以正确速度播放的模拟器(VBA)进行比较时,我的模拟器运行得更快。这里的问题是什么?
Sleep在这里是错误的函数。从https://msdn.microsoft.com/en-us/library/windows/desktop/ms686298(v=vs.85).aspx中,它提到"如果dwMilliseconds小于系统时钟的分辨率,线程可能会睡眠少于指定的时间长度"
DirectX可能有一个方法(VBLANK?? ?),但你可以通过计算出下一帧时间应该是什么来解决一些小问题,如果睡眠太小,保存睡眠,直到它超过计时器分辨率。
相关文章:
- 如何在c++中实现处理器调度模拟器
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 询问在设计我的手臂模拟器功能表示格式1
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 汽车仪表模拟器
- 键盘模拟器
- 用GTK创建逻辑门模拟器,如何制作放置区域
- 如何在 ns2 模拟器中修改节点的行为?
- opengl 飞行模拟器应用程序中的文本呈现问题
- 使用模拟器C++从RISC-V裸机程序调用printf系统调用时失败
- 具有原生C++库的 Android 免安装应用不会发布到运行 Android N 的设备/模拟器
- 使用 Qt 链接到 iOS 模拟器上的静态库时不兼容的架构
- 彩票模拟器正在返回垃圾价值,而不是用户乐透数字和获胜数字
- Clion Cmake项目不编译:Dyld Mach-O,而是为模拟器构建(不是MacOS)
- Opencv 功能匹配在 iPhone 上中断,但在模拟器上不会中断
- 如何在Android模拟器上显示垫子图像?使用NDK
- 实现简单的逻辑和延迟模拟器
- 如何使用Cmake为SimuroSot模拟器构建(从DevCpp转换)Win32 DLL
- 逗号分隔的数字在模拟器上正确显示,但在iPad上没有显示
- Gameboy模拟器玩得比预期的快