cocos2dx - ActionManager内存泄露
来源:互联网 发布:淘宝买虚拟产品 编辑:程序博客网 时间:2024/06/05 01:06
ActionManager memory leak
cocos2d-x3.7
都3.7了还有这样的bug,真是好难过,不过还是好开源的,谁都可以贡献一下
问题描述:
当创建一个node,并让它run一个action的时,如果这个node没有添加到任何其它节点(即没有父节点),那么改node和action将一直不会被释放。
原因:
在node调用runAction
时,会将动画交给ActionManager来管理,即调用ActionManager::addAction
,看该函数的实现:
void ActionManager::addAction(Action *action, Node *target, bool paused){ //... if (! element) { element = (tHashElement*)calloc(sizeof(*element), 1); element->paused = paused; target->retain(); //!!!watch out!!! element->target = target; HASH_ADD_PTR(_targets, target, element); } //...
注意这里会把node给retain一次,那它是在哪里release的呢,看下面:
void ActionManager::update(float dt){ //... elt = (tHashElement*)(elt->hh.next); if (_currentTargetSalvaged && _currentTarget->actions->num == 0) { deleteHashElement(_currentTarget); } //...}void ActionManager::deleteHashElement(tHashElement *element){ ccArrayFree(element->actions); HASH_DEL(_targets, element); element->target->release(); // release node free(element);}
也就是说,当一个node在运行一个action时会被retain(referenceCount+1),在action运行完成后就会被release(referenceCount-1)。这么看起来没什么问题,但是当这个node不在running状态时,即没有添加到任何节点,通过create创建下一帧应该被自动释放,如果这时候给它运行了一个动画(ActionManager::addAction
时第三个参数paused为true),再看update函数:
void ActionManager::update(float dt){ if (! _currentTarget->paused) //动画不会被执行 { //... } //... elt = (tHashElement*)(elt->hh.next); if (_currentTargetSalvaged && _currentTarget->actions->num == 0) { deleteHashElement(_currentTarget); } //...}
此时动画一直不会执行,也就是说动画不会完成,那么actions->num
不可能等于0,则该节点就一直不会被释放。
解决方法:
void ActionManager::update(float dt){ //... elt = (tHashElement*)(elt->hh.next); if (_currentTargetSalvaged && _currentTarget->actions->num == 0) { deleteHashElement(_currentTarget); } //if some node refrence 'target', it's refrence count >= 2 (issues #14050) else if (_currentTarget->target->getReferenceCount() == 1) { deleteHashElement(_currentTarget); } //...}
那么问题来了:为什么会有这样的行为呢——创建一个node,不加到任何节点,还给它run一个action?
这里解释过一遍了:https://github.com/cocos2d/cocos2d-x/pull/14090
0 0
- cocos2dx - ActionManager内存泄露
- cocos2dx ActionManager动作管理
- cocos2dx源码分析:ActionManager
- cocos2dx ccbreader内存泄露
- Cocos2dx Animation Packer 内存泄露
- cocos2dx ActionManager播放动画回调问题
- ActionManager
- cocos2dx Action 的学习Cocos2d-x v3.3 ActionManager详解
- cocos2dx开发的时候使用vld检测内存泄露
- 【笔记】VLD + cocos2dx 内存泄露检测(一)
- 内存泄露
- 内存泄露
- 内存泄露
- 内存泄露
- 内存泄露
- 内存泄露
- 内存泄露
- 内存泄露
- VC 判断程序是否启动.
- <LeetCode><Easy> 125 Valid Palindrome
- AFNetworking向服务端上传空文件
- DirectShow SDK下载
- 补:LCYZ NOIP模拟赛T3代码 : 倍增LCA || LCT动态树[虽然NOIP知识但还是五星QAQ]
- cocos2dx - ActionManager内存泄露
- apt-install 的一些常用依赖
- android之EditText
- iOS UITableView 相关知识
- [sicily]1750. 运动会
- Oprofile的安装与使用
- java 字符编码方式
- 单页面应用在REST调用下的登录模块的设计与实现
- 二叉树的建立 插入 删除