cocos2dx内存管理
原文:http://www.cnblogs.com/sniperHW/p/3789837.html cocos2dx基于引用计数管理内存,所有继承自 cocos2dx的对象管理是树形结构的,可通过调用父亲节点的 提到cocos2dx的内存管理,就不得不提 我们随便查看一个函数: CCSprite* CCSprite::createWithTexture(CCTexture2D *pTexture) { CCSprite *pobSprite = new CCSprite(); if (pobSprite && pobSprite->initWithTexture(pTexture)) { pobSprite->autorelease(); return pobSprite; } CC_SAFE_DELETE(pobSprite); return NULL; } 注意到 下面是 void CCAutoreleasePool::addObject(CCObject* pObject) { m_pManagedObjectArray->addObject(pObject); CCAssert(pObject->m_uReference > 1,"reference count should be greater than 1"); ++(pObject->m_uAutoReleaseCount); pObject->release(); // no ref count,in this case autorelease pool added. } 向 应当注意避免对一个 我们来看看引擎的主循环 void CCDisplayLinkDirector::mainLoop(void) { if (m_bPurgeDirecotorInNextLoop) { m_bPurgeDirecotorInNextLoop = false; purgeDirector(); } else if (! m_bInvalid) { drawScene(); // release the objects CCPoolManager::sharedPoolManager()->pop(); } }在每帧中调用 drawScene()
,之后就调用
CCPoolManager::sharedPoolManager()->pop()
.
void CCPoolManager::pop() { if (! m_pCurReleasePool) { return; } int nCount = m_pReleasePoolStack->count(); m_pCurReleasePool->clear(); if(nCount > 1) { m_pReleasePoolStack->removeObjectAtIndex(nCount-1); // if(nCount > 1) // { // m_pCurReleasePool = m_pReleasePoolStack->objectAtIndex(nCount - 2); // return; // } m_pCurReleasePool = (CCAutoreleasePool*)m_pReleasePoolStack->objectAtIndex(nCount - 2); } /*m_pCurReleasePool = NULL;*/ } 好了关键函数就是 在这里我们发现了一点奇怪的地方,为啥有个 首先来看下 void CCPoolManager::push() { //if(!m_pCurReleasePool){ CCAutoreleasePool* pPool = new CCAutoreleasePool(); //ref = 1 m_pCurReleasePool = pPool; m_pReleasePoolStack->addObject(pPool); //ref = 2 pPool->release(); //ref = 1 //} } 然后我们跟踪程序的运行将断点放在 push
函数里,断点的第一次命中调用栈如下:
libcocos2d.dll!cocos2d::CCPoolManager::push() 行 145 C++ libcocos2d.dll!cocos2d::CCPoolManager::getCurReleasePool() 行 200 C++ libcocos2d.dll!cocos2d::CCPoolManager::addObject(cocos2d::CCObject * pObject=0x003e9938) 行 189 C++ libcocos2d.dll!cocos2d::CCObject::autorelease() 行 100 C++ libcocos2d.dll!cocos2d::CCDictionary::create() 行 396 C++ libcocos2d.dll!cocos2d::CCConfiguration::init() 行 60 C++ libcocos2d.dll!cocos2d::CCConfiguration::sharedConfiguration() 行 154 C++ libcocos2d.dll!cocos2d::CCDirector::setDefaultValues() 行 199 C++ libcocos2d.dll!cocos2d::CCDirector::init() 行 113 C++ libcocos2d.dll!cocos2d::CCDirector::sharedDirector() 行 97 C++ IslandFight.exe!AppDelegate::applicationWillEnterForeground() 行 143 C++ libcocos2d.dll!cocos2d::CCEGLView::WindowProc(unsigned int message=5,unsigned int wParam=0,long lParam=20972000) 行 444 C++ libcocos2d.dll!cocos2d::_WindowProc(HWND__ * hWnd=0x002a06aa,unsigned int uMsg=5,long lParam=20972000) 行 171 C++ 第二次调用栈:
libcocos2d.dll!cocos2d::CCPoolManager::push() 行 145 C++ libcocos2d.dll!cocos2d::CCDirector::init() 行 165 C++ libcocos2d.dll!cocos2d::CCDirector::sharedDirector() 行 97 C++ IslandFight.exe!AppDelegate::applicationWillEnterForeground() 行 143 C++ libcocos2d.dll!cocos2d::CCEGLView::WindowProc(unsigned int message=5,long lParam=20972000) 行 444 C++ libcocos2d.dll!cocos2d::_WindowProc(HWND__ * hWnd=0x002a06aa,long lParam=20972000) 行 171 C++ 也就是说总共创建了两个 接着我们将断点放到 继续观察程序的运行可以发现,在第一帧之后 我搜索cocos2dx 2.2.3和cocos2dx 3.0rc源代码,并无找到必须启用多个 研究cocos2dx不久,文中有理解不当的地方欢迎指正. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |