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()一样。
我去测试了一下他的论据,发现“结果”还真跟他说的一样,循环调用GetRunningTime()返回的并不是连续的整数。
这个“结果”似乎真的可以论证那个方法是没用的,但奇怪的事就是发生了,这方法偏偏就是行的通,虽然不知道为什么。
PreciseSleep情况下GetRunningTime()的返回值就是连续的整数
Sleep情况下GetRunningTime()的返回值就不是连续整数
不知道是什么原因导致了这个现象,但这个方法就是能行。在实际应用中,PreciseSleep(1)确实比Sleep(1)快很多。编程里的怪问题就没少过,还得是实践才是硬道理啊。