请教定时器不准确要怎么解决

3.4.2版本
//开始计时
this.schedule(this.getTimer,0.1,1000);

getTimer(){
let timeN = find(‘Canvas/Top/three/timeNum’);
let timeL = this.getLab(timeN);
this.timeTem = Math.ceil(((this.timeTem + 0.1)*10))/10;
timeL.string = ‘’+this.timeTem;
}
使用这种方法做出来,100秒 实际输出 108.2秒 相差太多了

芝麻开门

说实话,吾在入creator之前也研究过定时器,你这个更加精确说的不太对,调用的引擎回调,自然和引擎的精确程度一致,下面说说自己的见解

高精度:setTimeout 和 setInteval
高性能:时间轮 + requestAnimationFrame循环
中和:时间轮 + creator游戏循环

引擎的 schedule 就是用的时间轮实现的,所以要想高精度就用 js 的 setTimeout 和 setInteval 吧

1赞

你就说你是不是嵌入了死循环

我锁说的相对准确是解决楼主的问题
使用这种方法做出来,100秒 实际输出 108.2秒 相差太多了

在每一帧去中和这种长时间产生的误差。这样走100秒,实际上就是100-101秒样子。

setTimeout 和 setInteval是底层提供的,自然比游戏循环夹杂了其他逻辑的时间轮快,有时间多看看源码,且楼主本来说的就是schedule不准,你还推荐一个schedule实现的定时器 :joy:

你测我的实现了吗

我看代码就知道了,你用的schedule,楼主用的schedule需要测试吗?

把楼主的代码逻辑放在你的定时器没有任何区别,且楼主的代码本来就有问题,定时器本来就是追求的间隔相近或者相等,但是多个间隔延迟加起来自然会很大

没测过不要乱说,ok
张口就来

麻烦你告诉我同样是组件的schedule,你的组件schedule和楼主的有什么区别?

说明你开了开头,并没有看里面的实现。
算了呗

this.component.scheduleOnce执行update,你用的不是creator的定时器?

除了超出时间手动补回调,两个schedule没有任何区别,手动补回调也只是常识

你说的常识,在楼主看来,并不知道。
我也没说我的很牛逼。只是解决了一个小问题而已。

之后我一定说详细,我之前说requestAnimationFrame循环本就要依赖手动补回调,是我没说明白

settimeout 的确不准 还说高精准 其实很不准

相比于cocos的引擎循环时间轮,是要更准确一点,cocos的是游戏越卡定时器误差越大

要想精准,自己做个时间线,永远只使用new Date().getTime()来获取当前时间设置自己的时间戳

1赞

那就是时间轮,和cocos没区别,原生js也不支持多线程

0.1秒执行一次,不代表执行的时候就是0.1秒,只是接近.游戏是安帧执行,不可能刚好到执行那阵帧和你的时间一致!