【发布时间】:2016-05-30 22:12:33
【问题描述】:
背景:我在 F#/.net 中编写了一个 gameboy 模拟器。在 gameboy 中,vblank (~fps) 约为 60 Hz,并且与游戏速度相关,因此模拟器运行速度尽可能接近 60 fps 非常重要。
由于现代计算机可以以比 60 fps 快得多的速度运行我的模拟器,我需要降低模拟器的速度。我目前的方法是计算两个 VBlank 之间的时间,然后等待该 vblank 周期的剩余时间。
问题在于如何在不忙于循环 cpu 的情况下等待。由于我通常需要等待几毫秒(有时更多,有时更少),因此内置的 Thread.sleep 函数不是一个好的选择,因为除非您指定 0 等待时间,否则它将至少休眠约 15 毫秒,即方法很长(而且不准确)。我目前的方法是使用 sleep(0) ,这实际上只是一个花哨的自旋锁(其他线程可能会在其中运行,但您仍然可以最大限度地利用 cpu)。
解决这个问题的正确方法是什么?我正在考虑等待从计时器释放的信号量,但是计时器可以提供所需的时间分辨率吗?这不就是一个美妙的睡眠吗?
编辑:这被标记为 What Thread sleep method is most precise: Monitor.Wait vs System.Timer vs DispatchTimer vs Threading.Timer 的重复项,但我认为这不是精确度问题,而是为紧凑的游戏循环找到合适的解决方案。
【问题讨论】:
-
不,定时器不是一种花哨的睡眠。高精度/多媒体计时器将是正确处理此问题的方法
-
谷歌“NtSetTimerResolution”。
标签: .net windows performance emulation sleep