大坑,同一帧,组件多次update或者可能不会update

是的,有可能执行F的update移除A,B,C,后面就都乱套了

可以通过数据驱动设计来解决这个问题,确保在同一帧先操作数据,再直接操作实体。
举个栗子:

const flags = [true, false, true, true];

// 修改组件状态
flags[3] = false

// 同步逻辑
update() {
    // 确保所有数据已经修改完毕
    // ...

    // 进行处理
    if (comp.enable && !flags[3]) {
        comp.enable = true
        flags[3] = true
    }
}

这样处理的好处就是,数据在当前帧随便改,改完统一生效。
跟 cocos 的渲染处理机制类似,分为 berforeUpdate 和 afterUpdate。

嗯,修改问题的方式有很多种,你这种就改的比较彻底了。目前只打算把自已确保要每帧update的comp单独拎出来,走额外的分支,确保不会漏掉或者多次执行。

这种问题出现在什么应用场景下。

afk类即时战斗,同一帧多个spine特效移除添加,战斗时间异常,最近各种加日志,追查下来发现是update调用问题(这个问题断断续续查了几个月了 :sweat:

1赞


还有这个问题,也是查了好久才查出来。因为这些底层bug,战斗验证一直有问题,采取了别的临时验证方案

这不就是在遍历循环中添加或者删除一项的经典问题

是的,可能是引擎组考虑update性能问题,这里做了一些优化,反而引起了bug

@dumganhar

这是哪个版本啊,2.几的。
3.x应该没这个问题吧 :rofl:

2.4.12的,算是很新的版本了,3.x你们找下对应源码看看。2.x对应的是这两个文件:component-scheduler.js,mutable-forward-iterator.js

区别好像不是很大,估计是没动过这块。 :rofl:

哦豁,这就难受住了

跟 Unity 一样,引擎的 remove 都是一帧结束时批量调用的,不会出现你这个 case。真有这种低级错误的话早就修复了。

所以你是怎么做到,在 Update 调用的过程中移除 Component 的?把完整代码贴出来!

帖子还要审核的么 :sweat:

update的时候移除一个节点,节点上绑了其他comp,这不就是遍历过程中移除comp么

afk类即时战斗,同一帧多个spine特效移除添加

按理说,战斗的脚本(比如叫Fight)先添加,后续才会有特效之类Spine的添加移除,执行也是先update的Fight脚本,后面才是Fight界面里的其他组件

image
但是这行代码会把后面的comp移到前面去,造成Fight里面其他组件排序会在Fight脚本前面。如果Fight的update执行的时候移除了前面的特效的comp,i–,这时候就会出问题了。

不是啊,实际的移除操作是发生在当帧结束时的。如果是移到前面去,那有可能,但是 update 被调用两次时不太可能。