3.8.3 scheduleOnce bug

你们是用3.x版本运行的吗

3.8.3版本

我3.72版本 从顺序来看 确实很奇怪 你可以跟一下断点 看注册的定时器怎么执行顺序错了

懂了!,但是为什么要依赖定时器顺序啊

原因我都说了呀。。。 for 循环执行后删除timer出问题的

只是我以为是3x版本都出问题,没想到是3.8.3版本的问题,是我描述的不够详细

定位到问题了,两重数组,数组移动下标出错,你现在要解决的这个问题的话,可以重写unscheduleForTimer函数,让他延迟一下

let afterUpdateFuc = () => {

for (let one of cacheList) {

   unscheduleForTimer.apply(one[0], one[1])

}

cacheList.length =0

}

director.on(Director.EVENT_AFTER_UPDATE, afterUpdateFuc)

let cacheList: any[] = []

//@ts-ignore

let unscheduleForTimer: Function = Scheduler.prototype.unscheduleForTimer

//@ts-ignore

Scheduler.prototype.unscheduleForTimer = function (…args) {

cacheList.push([this, args])

}

2赞

1赞

在这个 PR 修复了:fix logic error when removing an array element in loop by minggo · Pull Request #17215 · cocos/cocos-engine · GitHub

我是2.4.5,真是大乌龙了,哈哈哈


已知会出现 element为null 的情况,具体复现代码还没有,但是这一步已经会出现卡死错误了

跟着引擎组的改,定制一下引擎,他那个是最终解决方案

修改这边的for 循环倒置,之后的删除不会影响前面的定时器,这个pr估计不能解决问题

如果硬要解决的话,你可以先检查一下element是否被移除

那个 PR 就是解决循环过程中元素被删除的问题。

就改这里么?改这里解决不了问题的吧?

是的,改这里。你遇到的具体问题是什么呢?

所以这个问题怎么解决啊,3.8.3提出的问题为啥我3.8.5还有这个错,我是在预制体体里面引用其他预制体就可能会出现。我现在就是在移除那里新加了对element的判断 先让编辑器不卡死。各位大佬现在是怎么个方案。我不想使用定制引擎