Cocos Creator 3.8.4 社区公测帖 - 2024.8.22

这玩意能不能多加2个参数 现在不太够用 ,老是要拼接

昨天遇到个很麻烦的问题,之前的3.8.5和3.8.3都没出现过,2D项目,原生端的node.setPosition后 position 和 worldPosition不同步,导致的渲染出来的效果和实际上有区别,而且不容易复现,

image

上面是出错之后断点的信息,这个节点是在屏幕中心点偏上的位置,按道理说 worldPosition的x 应该是 1350/2 左右,但是实际上是没修改position之前的值。暂时查到是 node的globalFlagChangeVersion不匹配导致的,比如globalFlagChangeVersion == 1的时候修改了位置,globalFlagChangeVersion = 2的时候子节点渲染的时候globalFlagChangeVersion已经变了,导致node->getChangedFlags()是0,也就不会去刷新位置,没有能复现的demo,都是发生在处理网络消息的时候批量刷新节点位置,想问下这个版本有做什么修改,可能会导致这个问题吗?越是卡顿的机器越容易出现

2赞

我提交修复了 https://github.com/cocos/cocos-engine/pull/17548 。我测试了是没问题,你也帮忙 review 一下。谢谢。

这个我们得看一下修改记录。

试了下,应该是没有问题的

设置 position 相关的代码贴一下看看。我不清楚是否和这个有关:注意:Node 的一些 set 接口行为的修正 。但从你的描述来看时间点对不上。那个修改是之前的 3.8.5 版本就带上了。

应该不是,问题应该是出现在C++这里,脚本那边已经过了,不像是用法不对,只会在控制台调用代码或者是网络消息处理的时候修改位置才有可能出现,同样的代码加到按钮的点击回调里面不会有问题,我再去加些日志看看吧,能找到问题就跟着升级,找不到只能降回去了 :sweat_smile:

这样设计就考虑到没法满足所有的需求。用户根据自己的需要使用自己的数据结构,比如 json 什么的。

再加2个参数可以满足 95%的需求了


调了一整天,终于查到问题了,不清楚为什么要加上这条,不过会出很多问题,建议注释掉吧,总结下来就是AfterRender之后修改节点位置,会发现C++中节点的position被修改了,但是worldPosition不会被更新,关键原因是子节点渲染的时候父节点还没有修改位置,AfterRender之后才修改,这时候父节点永远没有机会再刷新worldPosition,原因描述起来有点多,这个版本对线程函数这里有几处修改,感觉考虑的都不是很全面,原生端踩了好多坑

5赞

之前考虑在AfterRender中处理回调,主要是考虑尽可能快地在当前帧中处理异步消息,避免延迟到下一帧处理。

从目前看,的确可能有一定的风险,你可以先注释这行处理,我们再根据你提供的信息思考一下解决方案。

感谢您在这个社区版本中提供了好几个重要的bug反馈。而且非常详细并提供很高质量的分析过程。

1赞

能解决问题就好,也是希望版本稳定,这样可以安心升级,避免踩坑

4赞

反馈一个无意中遇到的spine原生平台崩溃问题 排查了很久;连续调用2次setMix方法 第二次调用传入一个spine中没有的动画名就会直接崩溃 100%必现。

1赞

我这边会看下,有demo能快速复现吗?我自己重新整一个要花点时间

你好,你的是在原生上出现的?我在原生的ios上,在381开始,setDesignXXX,后就是不会触发resize事件的。请问有复现的demo?
我直接在ts代码 ,通过点击按钮触发 setDesignXxx是没法复现你的问题的。381上应该开始就这样的

3.8.3先引擎默认设置为竖版,然后进游戏后设置为横版,setDesignResolutionSize加screen.on(“window-resize”, this.setResetScreenSize, this); 加+(void)setOrientation:(NSString*)dir{} ,然后退到后台等个5秒钟,再从后台切回来必现(或者切切场景场景也有横竖版的切换)。我这不好剥离,3.8.4改成 window.addEventListener(“resize”, this.setResetScreenSize.bind(this, “resize”)); 后好了就没再测了

Demo.zip (444.1 KB)

感谢提供demo,分析后发现是底层第三方库,spine自身的问题

针对该问题,引擎做了安全保护,绕过这个问题

原来的老方法还能使用,我现在还在用老方法

在这个 PR 中修复了,顺带发现一个类似原因的 bug(在 Director::EVENT_AFTER_DRAW 事件回调中修改位置,在原生上不生效的问题),并添加了对应的测试例。

麻烦有空的时候,再验证看看是否还有问题。感谢。

1赞