-
Creator 版本: 2.4.13
-
目标平台:
chrome 127.0 正常
Creator自带模拟器 闪退
Android Oppo PECM30 闪退 -
重现方式:
骨骼大于300的spine资源
skeletonA 第一次创建并设置skeletonData , setAnimation 一切正常
当一个技能播放完成回调触发了, 再次播放skeletonA的动作, skeletonA = skeletonData ,之后的几帧会闪退。 -
首个报错:
-
之前哪个版本是正常的: 2.0.9
-
手机型号: Oppo Pecm30
-
编辑器操作系统: window 10
-
重现概率:模拟器,手机 必现
首先 更新同一个skeleton动画,其实不需要重设skeletonData , 这个问题触发原因是业务上有写错地方,导致没有复用skeleton而是,重设了 skeletonA = skeletonData
目前用了复用就正常。
同时把我探索排查过程发现的反馈一下,
根据报错信息定位到引擎对skeletonData的重新赋值可能存在泄露
Js层的实现
CPP的实现
如图,js有对listener做了清理
但CPP中似乎没有清理,就把新的state给赋过来,导致旧的state原本应该变成垃圾内存,但如果它下面的listener没清理干净,是否就导致泄露了呢?
从报错看,update - > drain() 是从自更新触发的闪退
报错时,_state中 _eventQueueEntries.size 是有长度的,但里面有些引用已经是null的了
按照重现流程高频重设 skeletonData
我调试安卓时,断点了 _eventQueueEntries下面 trackEntry==null,还真会触发到。_eventQueueEntries里面很多数据占在数组中但具体内容都是丢失,看起来似乎这个state就是废弃的一样,从而推测它是否就是那个被新的state挤掉的,本该被垃圾回收掉的state依旧触发了update
看了一下3.8.3 目前cpp也是同样的写法 。希望官方有空排查一下
另外,如果其他开发者 如果遇到spine 真机闪退,web正常的话。
1.尽量避免大骨骼。 我150骨骼以下的,这操作不会出现闪退
2.检查是否在其他spine动画 结束回调时,调用了重设 skeleton = skeletonData ,
同时应该避免高频率的重设skeletonData