cocos2dx3.10 ClippingNode存在的bug

前端之家收集整理的这篇文章主要介绍了cocos2dx3.10 ClippingNode存在的bug前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

先说bug触发的条件:

先为一个节点设置了剪裁,但是在动画中,需要更新这个剪裁的形状,然后再以这个新的形状设置剪裁。

bug代码

clip_front_->setStencil(pfront);

运行的时候,我收到了一个来自mac版本的运行抱怨,他抱怨以上代码总是崩。但是我的是以windows非库源码形式编译的,所以没有发生这个问题。

收到反馈后,我把代码拷贝到带cocos2dx源码运行的项目中,果不其然。。。。(在此奉劝大家,千万不要图省事,一定要以库源码的形式编译,因为这个库很多bug。。而你也有能力修正它)

我们来看setStencil的内部实现:

void ClippingNode::setStencil(Node *stencil)
{
CC_SAFE_RETAIN(stencil);
CC_SAFE_RELEASE(_stencil);

_stencil = stencil;
}


咋一看没什么问题,问题出来以前我也不觉得这里有啥问题。

现在我对任何不加入资源管理的离散节点的release表示怀疑,因为我不懂它内部运行的机制。

事实上当内部stencil正在使用的时候,简单的析构它一定会导致问题。assert还算好的,运行时崩溃才是让人崩溃的。因为你不能准确定位到问题发生的地方。

于是代码修正如下:

void ClippingNode::setStencil(Node *stencil)
{
CC_SAFE_RETAIN(stencil);
Node* ptemp = _stencil;
if (ptemp)
{
ptemp->stopAllActions();
ptemp->onExit();
}

_stencil = stencil;

CC_SAFE_RELEASE(ptemp);
}

node析构中的 !running assert消失了。问题解决。运行没有发现内存泄露

猜你在找的Cocos2d-x相关文章