cocos2dx4.0闪退 cocos2d::Label::updateBuffer

此bug特征,平均闪退时间在玩游戏1小时后,玩家每天闪退3次以上,我实在是解决不了这个问题
bugly抓到的堆栈如下:
1

#00 pc 000000000130de40 /data/user/0/com.taptap/virtual/data/app/com.bin.game/lib/arm64/libcocos2dlua.so (vtable for __cxxabiv1::__class_type_info+16) [arm64-v8a::b33045a2a2854e1c8800be46b7a9929f]

2

#01 pc 0000000000864150 cocos2d::label::updateBuffer(cocos2d::TextureAtlas*, cocos2d::CustomCommand&) + 140 [arm64-v8a]

3

#02 pc 00000000008641d8 cocos2d::label::updateEffectUniforms(cocos2d::label::BatchCommand&, cocos2d::TextureAtlas*, cocos2d::Renderer*, cocos2d::Mat4 const&) + 64 [arm64-v8a]

4

#03 pc 0000000000864ad4 cocos2d::label::draw(cocos2d::Renderer*, cocos2d::Mat4 const&, unsigned int) + 1272 [arm64-v8a]

5

#04 pc 0000000000865018 cocos2d::label::visit(cocos2d::Renderer*, cocos2d::Mat4 const&, unsigned int) + 676 [arm64-v8a]

6

#05 pc 000000000089531c cocos2d::ProtectedNode::visit(cocos2d::Renderer*, cocos2d::Mat4 const&, unsigned int) + 324 [arm64-v8a]

7

#06 pc 00000000008953f8 cocos2d::ProtectedNode::visit(cocos2d::Renderer*, cocos2d::Mat4 const&, unsigned int) + 544 [arm64-v8a]

8

#07 pc 00000000008953f8 cocos2d::ProtectedNode::visit(cocos2d::Renderer*, cocos2d::Mat4 const&, unsigned int) + 544 [arm64-v8a]

9

#08 pc 00000000008953f8 cocos2d::ProtectedNode::visit(cocos2d::Renderer*, cocos2d::Mat4 const&, unsigned int) + 544 [arm64-v8a]

10

#09 pc 000000000087835c cocos2d::Node::visit(cocos2d::Renderer*, cocos2d::Mat4 const&, unsigned int) + 352 [arm64-v8a]

11

#10 pc 000000000087835c cocos2d::Node::visit(cocos2d::Renderer*, cocos2d::Mat4 const&, unsigned int) + 352 [arm64-v8a]

12

#11 pc 0000000000afd3d8 cocos2d::extension::ScrollView::visit(cocos2d::Renderer*, cocos2d::Mat4 const&, unsigned int) + 300 [arm64-v8a]

13

#12 pc 000000000087835c cocos2d::Node::visit(cocos2d::Renderer*, cocos2d::Mat4 const&, unsigned int) + 352 [arm64-v8a]

14

#13 pc 00000000009eb414 cocos2d::ui::Layout::stencilClippingVisit(cocos2d::Renderer*, cocos2d::Mat4 const&, unsigned int) + 752 [arm64-v8a]

15

#14 pc 00000000008953f8 cocos2d::ProtectedNode::visit(cocos2d::Renderer*, cocos2d::Mat4 const&, unsigned int) + 544 [arm64-v8a]

16

#15 pc 00000000008953f8 cocos2d::ProtectedNode::visit(cocos2d::Renderer*, cocos2d::Mat4 const&, unsigned int) + 544 [arm64-v8a]

17

#16 pc 000000000087835c cocos2d::Node::visit(cocos2d::Renderer*, cocos2d::Mat4 const&, unsigned int) + 352 [arm64-v8a]

18

#17 pc 000000000087835c cocos2d::Node::visit(cocos2d::Renderer*, cocos2d::Mat4 const&, unsigned int) + 352 [arm64-v8a]

19

#18 pc 000000000087835c cocos2d::Node::visit(cocos2d::Renderer*, cocos2d::Mat4 const&, unsigned int) + 352 [arm64-v8a]

20

#19 pc 00000000008999e8 cocos2d::Scene::render(cocos2d::Renderer*, cocos2d::Mat4 const&, cocos2d::Mat4 const*) + 396 [arm64-v8a]

21

#20 pc 0000000000979e40 cocos2d::Director::drawScene() + 384 [arm64-v8a]

22

#21 pc 000000000097c188 cocos2d::Director::mainLoop() + 128 [arm64-v8a]

23

#22 pc 000000009ceba140

玩久了闪退,很大原因在内存泄漏,可以检查看看是否有内存泄漏

根据堆栈调用,大致猜一下。看看哪个节点是ScrollView下挂着TextureAtlas的,应该是这个有问题

确实有内存泄漏,但是太多了,我不敢动它

确实,极有可能,我这就去排查

为啥这些问题,都是android的呢,iOS确很少呢?我的项目之前也遇到过这样的问题,所以我建议你检查你接入的SDK的回调执行时机,是不是一定是在openGL状态就绪后,再执行回调,因为java端调用runOnGLThread,并不能保证安全。

的确发现了安卓java回调lua的时候有点问题,已经修改了,等测试一段时间再看看

没用,java调用c++已经确定安全了,游戏内甚至没有使用TextureAtlas的地方了,依然在这个地方闪退

怎么确定是调用安全了呢,可以给一下你们的调用过程吗?

label里面用到了TextureAtlas。当然,这样的话,问题的范围就更大了,更不好确定了

而且,刚好,label继承自ProtectNode,拥有void Label::updateBuffer(TextureAtlas* textureAtlas, CustomCommand& customCommand)接口和void Label::updateEffectUniforms(BatchCommand &batch, TextureAtlas* textureAtlas, Renderer *renderer, const Mat4 &transform)接口,似乎很符合你这里显示的报错信息