【cocos2d-x-3.1.1系列5】cocos2d-x 引用计数细节

【cocos2d-x-3.1.1系列5】cocos2d-x 引用计数细节,第1张

概述看了引用计数之后  那时好像懂了   今天突然想起一个问题: Scene也是继承自Ref ,然后也是静态生成一个autorelease后的对象  那计数就变成1了 class CC_DLL Scene : public Node { public:     /** creates a new Scene object */     static Scene *create(); { Scene * 看了引用计数之后 那时好像懂了 今天突然想起一个问题: Scene也是继承自Ref ,然后也是静态生成一个autorelease后的对象 那计数就变成1了 classCC_DLLScene:publicNode { public: /** creates a new Scene object */ staticScene*create(); { Scene *Scene::create() { Scene *ret =newScene(); if(ret && ret->init()) { ret->autorelease(); returnret; } else { CC_SAFE_DELETE(ret); returnnullptr; } } } }
main函数里面: 【每种颜色代表一个函数 颜色嵌套代表函数的调用 类似栈】 intAPIENTRY_tWinMain(HINSTANCEhInstance, HINSTANCEhPrevInstance, LPTSTRlpCmdline, intnCmdshow) { returnApplication::getInstance()->run(); 其中run(){ while(!glvIEw->windowshouldClose()) { queryPerformanceCounter(&nNow); if(nNow.QuadPart - nLast.QuadPart > _animationInterval.QuadPart) { nLast.QuadPart = nNow.QuadPart; director->mainLoop(); 其中mainLoop(); { drawScene(); PoolManager::getInstance()->getCurrentPool()->clear(); for(constauto&obj : _managedobjectArray)
{
obj->release();
}
} glvIEw->pollEvents(); } else Sleep(0); } } } }
我们看到蓝色代码那里,PoolManager::getInstance()->getCurrentPool()->clear(); 这句代码会调用obj->release();把每个加入autoreleasepool的对象进行release *** 作,好了问题就来了(不是挖掘面积) Scene加入autorelease了 node继承的都加入了 Sprite也加入了 我们知道ref的构造函数是把引用计数自动变成1,那这里每一帧的绘画会把对象池里面的scene node sprite调用一次release 如果没有其他retain也就是变成0要回收了,但是不是这样的,实际还是可以显示出来的 有两个地方 一个是scene的runWithScene一个是继承node的sprite这些等等
1、scene的runWithScene 【每种颜色代表一个函数 颜色嵌套代表函数的调用 类似栈】 boolAppDelegate::applicationDIDFinishLaunching() { autodirector =Director::getInstance(); autoglvIEw = director->getopenGLVIEw(); if(!glvIEw) { glvIEw =GLVIEw::create("WeChat Airplane"); glvIEw->setFrameSize(600,800); director->setopenGLVIEw(glvIEw); } director->setdisplayStats(true); director->setAnimationInterval(1.0 / 60); glvIEw->setDesignResolutionSize(480,800,ResolutionPolicy::SHOW_ALL); this->setResourceSearchResolution(); autoscene =WelcomeScene::create(); director->runWithScene(scene); runWithScene(scene){ pushScene(scene); { _scenesStack.pushBack(scene); { _data.push_back(object); object->retain(); } } } returntrue; }
从上面的代码 我们可以看到最好还是retain了 所以scene是在mainloop里面的autoreleasepool减1 clear一次 但是他在_scenesStack retain 那么就不会被回收了 那所有的node其实都是添加到scene里面的,也就不会因为release Scene而导致node减1
2、继承node的sprite这些等等 我们知道都要addChild的 layer也好 node也好 sprite也好 都是要加进去的 voIDNode::addChild(Node *child) { CCASSERT( child !=nullptr,"Argument must be non-nil"); this->addChild(child,child->_localZOrder,child->_tag); { voIDNode::insertChild(Node*child,intz)
{
_transformUpdated =true;
_reorderChildDirty =true;
_children.pushBack(child);
voIDpushBack(Tobject) { CCASSERT(object !=nullptr,"The object should not be nullptr"); _data.push_back(object); object->retain(); }
child->_setLocalZOrder(z);
}
} }
从上面的调用来看 我们可以看到最后的调用还是用了object->retain(); 所以mainloop里面autoreleasepool 调用release是把2变成1 然后autoreleasepool已经把vector存的内容clear下一帧就不会调用了 总结

以上是内存溢出为你收集整理的【cocos2d-x-3.1.1系列5】cocos2d-x 引用计数细节全部内容,希望文章能够帮你解决【cocos2d-x-3.1.1系列5】cocos2d-x 引用计数细节所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1003323.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存