cocos-engine icon indicating copy to clipboard operation
cocos-engine copied to clipboard

387 spine 原生合批依旧存在问题

Open xxmda opened this issue 6 months ago • 7 comments

Cocos Creator version

3.8.7

System information

IOS ANROID

Issue description

#18674 未完全解决问题,依旧会出现批次无法合并的问题。究其原因是 node 的 active 的设置调用 addTimer 和 removeTimer,导致 node 顺序与 timer 更新顺序不一致导致合批异常。 test.zip

Relevant error log output

No response

Steps to reproduce

编译安卓 apk,运行例子,点击按钮发现批次增加

Minimal reproduction project

No response

xxmda avatar Jun 04 '25 05:06 xxmda

不同节点下添加spine,如果通过 addChild, removeChild 无法绕过问题,参考这个 issuse

bofeng-song avatar Jun 16 '25 03:06 bofeng-song

@xxmda 开发者若遇到 类似问题,有绕过去的方案: 没使用到dragonBones情况下,请修改 MiddlewareManager

  1. 添加 sort 方法,根据node的 id进行排序(引擎中新创建的node,id会自增1),排序规则:

    • 父亲节点相同,以node id的名称排序
    • 多级父节点的,查找父亲节点 相同的,然后再根据这个父亲节点下的相对应 子节点的 id 排序
  2. 修改 MiddlewareManager::updateOperateCache(), 返回值改成 bool,有数据变化,返回true,否则返回false

  3. MiddlewareManager::update(),调用updateOperateCache后,判断有修改,则调用sort排序

bofeng-song avatar Jun 16 '25 06:06 bofeng-song

@bofeng-song 游戏在地图上处理 spine 单位遮挡关系, 通过设置 siblingIndex 后,就会导致 timer 的顺序不同步了,就会导致批次的断开。 这种就没办法用 id 或者名称来解决了。

xxmda avatar Jun 16 '25 08:06 xxmda

siblingIndex

那用siblingIndex大小排序应该就可以了,这个和节点在children中的顺序一致,理论上光这个就够了。

bofeng-song avatar Jun 16 '25 08:06 bofeng-song

@bofeng-song 现在底层代码还是很漂亮的,做了很严格的解耦隔离,SkeletonRenderer并不能读取 Node,Timer 也不能对 SkeletonRenderer 和 Node 进行操作,按照这个方案是不是要建立三者的耦合。

xxmda avatar Jun 16 '25 08:06 xxmda

SkeletonRenderer

SkeletonRenderer可以获取到 RenderEntity, RenderEntity->getNode() Timer 获取,可以通过implement 某个class, 具体后面再设计;有需要的用户可以按照类似的思路先实现规避。引擎要考虑的不止 Spine所以工作量会比较大

bofeng-song avatar Jun 16 '25 08:06 bofeng-song

@bofeng-song 好的,辛苦了。临时处理方案先这么解决,坐等后续版本彻底解决这个问题

xxmda avatar Jun 16 '25 08:06 xxmda

这个问题下个版本能解决么

chelios001 avatar Sep 30 '25 03:09 chelios001

后面有空再抽空处理

bofeng-song avatar Sep 30 '25 03:09 bofeng-song

我来许愿了~希望3.8.8能解决这个问题~

cheliosx avatar Oct 16 '25 11:10 cheliosx