GHub脚本实现精确Sleep()

22 阅读1分钟
function PreciseSleep(timeout)
    local t = GetRunningTime()
    repeat until (GetRunningTime()-t)>=timeout
end

GHub脚本API提供的Sleep(timeout)并不精确,Sleep(1)的实际睡眠时间在1~16ms不等。由于一些场景下需要很精确的睡眠,所以想出了这个解决方法。

后来发现Logitech Lua script for high precision sleep里有人更早想到类似方法,但下面却被一个人反驳了,说实际精度还是和Sleep()一样。

image.png

我去测试了一下他的论据,发现“结果”还真跟他说的一样,循环调用GetRunningTime()返回的并不是连续的整数。

image.png

这个“结果”似乎真的可以论证那个方法是没用的,但奇怪的事就是发生了,这方法偏偏就是行的通,虽然不知道为什么。

PreciseSleep情况下GetRunningTime()的返回值就是连续的整数 image.png

Sleep情况下GetRunningTime()的返回值就不是连续整数 image.png

不知道是什么原因导致了这个现象,但这个方法就是能行。在实际应用中,PreciseSleep(1)确实比Sleep(1)快很多。编程里的怪问题就没少过,还得是实践才是硬道理啊。