Cocos Creator 3.8.4 社区公测帖 - 2024.8.22

这样设计就考虑到没法满足所有的需求。用户根据自己的需要使用自己的数据结构,比如 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赞

感谢你的反馈,对引擎的稳定做了重要贡献。

1赞

按你的流程,我验证了,在383,384均无法监听到。不确定是否和设备有关

现在这样是可以解决的,我之前的处理比较暴力,是patch的TS中director.tick函数,将resetHasChangedFlags()放到frameMove和AfterDraw中间了,其实我比较疑惑的地方是,在这个版本中scheduler的update中已经根据处理_functionsToPerform的处理时间做了优化帧率的考虑,如果说_functionsToPerform是跑满16ms的时候,有剩余的函数没有执行,在同一帧继续执行剩余的函数,帧率是不是也没得到优化呢

我也准备用老方法了 方便些

原生平台默认是开启 GFX 线程分离功能的,即 JS 逻辑线程和 GFX Device 线程(调用 GL 接口的线程)是两个不同改的线程,JS 逻辑线程能够比 GFX Device 线程多跑一帧。
因此在 AfterRender 或者 AfterPresent 是后,当前帧是不会受到垂直同步而 wait 的,会立马进入下一帧的逻辑。而当前可能只花费 < 16 ms 的时间,利用这块多余时间,让 JS 逻辑线程多做一些工作,避免到下一帧流程中处理。因为下一帧的时候,你可以看 Engine::tick 的逻辑,还会有锁帧的一些逻辑。
其实这个考虑,就是竟可能让当前帧产生的异步任务在当前帧有时间结余的情况下去立即处理。这样能够在两个线程错开执行的时候,利用 JS 线程的空余时间。

Scheduler::update 中 _functionsToPerform 的处理,是当前帧 tick 之前处理的,其实他是处理上一帧产生的异步任务。Scheduler::update 前面还有锁帧的逻辑。

因此,在帧末尾加上异步任务的处理,其实是为了加快当前帧的异步处理,不拖到下一帧,也把当前帧的异步任务的执行的时间考虑在当前帧内,而不是下一帧中。

1赞

了解了,多谢解答 :+1:

找到引擎的原因了,打包web时,没start-scene的Bundle。这个什么时候能解决啊?