schedule的问题

this.schedule(this._changeBar, 0.02, 49)
setTimeout(() => {
this.unschedule(this._changeBar)
}, 1000);

按道理来说 this._changeBar会被执行50次,但是执行了30多次就停了

你打印下log看看

打了log才说的

setTimeout(() => {
this.unschedule(this._changeBar)
}, 1000); 是不是这段代码引起的

1秒后停到,那个0.02间隔启动一次启动50次也是一秒

你是想它执行50次就停止 干啥还写个timer来停止。。

你不觉得这个有问题吗

因为 this.schedule(callback, interval); 这个interval 不是严格的你设定的值
回调函数真正的调用时间间隔 >= interval,schedule是每次主循环的时候调用,主循环时间间隔又不一定是0.02s
当调用了30+次回调函数后 时间已经有1S了 所以定时器被this.unschedule 关掉了

以上纯属个人意见,正确度:八九不离十吧

反正我用update计时了

今天刚好碰到。。。。。。

源码里没有计算时间差导致的,设置的间隔越小,产生的误差越大。

1赞

https://github.com/cocos-creator/engine/blob/19698da168bb0e2c10dd75f48cc192029fc4a9be/cocos2d/core/CCScheduler.js#L199

因为schdule的interval时间是按照帧时间来算的。

按照60帧,每帧时间0.017s,小于0.02s,则推迟到下一帧,下一帧0.034s,大于0.02s,则执行。
所以在0.02s的interval下,相当于每2帧执行1次,则执行到30帧(1s)后结束。

解决方案:建议0.1s以下的时间间隔采用间隔帧执行,即interval=0

例如我自己写的一个间隔帧执行的方法(ts版本):

static run_by_interval_frame(f: Function, nc: cc.Component, all_count: number, interval: number = 1) {
    let c = 0
    nc.schedule(() => {
        if (c === 0) { f() }
        c += 1
        if (c >= interval) { c = 0 }
    }, 0, (all_count - 1) * interval)
}

https://github.com/fkworld/cocos-game-framework/blob/master/assets/Script/framework/G.ts#L91

这样就不能控制时间了吧。直接用 setInterval 也可以的。

我觉得这应该算个bug

    + 1