cocos-engine
cocos-engine copied to clipboard
387 spine 原生合批依旧存在问题
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
不同节点下添加spine,如果通过 addChild, removeChild 无法绕过问题,参考这个 issuse
@xxmda 开发者若遇到 类似问题,有绕过去的方案: 没使用到dragonBones情况下,请修改 MiddlewareManager
-
添加 sort 方法,根据node的 id进行排序(引擎中新创建的node,id会自增1),排序规则:
- 父亲节点相同,以node id的名称排序
- 多级父节点的,查找父亲节点 相同的,然后再根据这个父亲节点下的相对应 子节点的 id 排序
-
修改 MiddlewareManager::updateOperateCache(), 返回值改成 bool,有数据变化,返回true,否则返回false
-
MiddlewareManager::update(),调用updateOperateCache后,判断有修改,则调用sort排序
@bofeng-song 游戏在地图上处理 spine 单位遮挡关系, 通过设置 siblingIndex 后,就会导致 timer 的顺序不同步了,就会导致批次的断开。 这种就没办法用 id 或者名称来解决了。
siblingIndex
那用siblingIndex大小排序应该就可以了,这个和节点在children中的顺序一致,理论上光这个就够了。
@bofeng-song 现在底层代码还是很漂亮的,做了很严格的解耦隔离,SkeletonRenderer并不能读取 Node,Timer 也不能对 SkeletonRenderer 和 Node 进行操作,按照这个方案是不是要建立三者的耦合。
SkeletonRenderer
SkeletonRenderer可以获取到 RenderEntity, RenderEntity->getNode() Timer 获取,可以通过implement 某个class, 具体后面再设计;有需要的用户可以按照类似的思路先实现规避。引擎要考虑的不止 Spine所以工作量会比较大
@bofeng-song 好的,辛苦了。临时处理方案先这么解决,坐等后续版本彻底解决这个问题
这个问题下个版本能解决么
后面有空再抽空处理
我来许愿了~希望3.8.8能解决这个问题~