cocos2d-x游戏开发(六)自动释放池

前端之家收集整理的这篇文章主要介绍了cocos2d-x游戏开发(六)自动释放池前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

欢迎转载:http://blog.csdn.net/fylz1125/article/details/8519887


上一篇文章写了引用计数和自动释放的大概流程,其中略过了自动释放池,这里简单述说。

前面提到CCObject的autorelease函数

  1. CCObject*CCObject::autorelease(void)@H_403_41@
  2. {@H_403_41@
  3. CCPoolManager::sharedPoolManager()->addObject(this);@H_403_41@
  4. returnthis;@H_403_41@
  5. }@H_403_41@

这里的sharedPoolManager()函数表明CCPoolManager是个单例类。

题外话:cocos2d-x里面大量的用到了单例模式,每个单例类都有个明显的标志,就是它的实例获取函数,从命名规则上看都是sharedxxx()形式。

跟进这个addObject函数

?
    voidCCPoolManager::addObject(CCObject*pObject)@H_403_41@
  1. getCurReleasePool()->addObject(pObject);@H_403_41@
  2. }@H_403_41@

这里就到了CCPoolManager,来看下这个类

?
    classCC_DLLCCPoolManager@H_403_41@
  1. CCArray*m_pReleasePoolStack;@H_403_41@
  2. CCAutoreleasePool*m_pCurReleasePool;@H_403_41@
  3. @H_403_41@
  4. CCAutoreleasePool*getCurReleasePool();@H_403_41@
  5. public:@H_403_41@
  6. CCPoolManager();@H_403_41@
  7. ~CCPoolManager();@H_403_41@
  8. voidfinalize();@H_403_41@
  9. voidpush();@H_403_41@
  10. voidpop();@H_403_41@
  11. voidremoveObject(CCObject*pObject);@H_403_41@
  12. voidaddObject(CCObject*pObject);@H_403_41@
  13. @H_403_41@
  14. staticCCPoolManager*sharedPoolManager();@H_403_41@
  15. staticvoidpurgePoolManager();@H_403_41@
  16. friendclassCCAutoreleasePool;@H_403_41@
  17. };@H_403_41@
这里可以看到它维护一个自动释放池CCAutoreleasePool,还有个CCArray变量,是个栈结构,来管理自动释放池。

看下实现:

?
    #include"CCAutoreleasePool.h"@H_403_41@
  1. #include"ccMacros.h"@H_403_41@
  2. NS_CC_BEGIN@H_403_41@
  3. //自动释放池管理员实例@H_403_41@
  4. staticCCPoolManager*s_pPoolManager=NULL;@H_403_41@
  5. CCAutoreleasePool::CCAutoreleasePool(void)@H_403_41@
  6. {@H_403_41@
  7. m_pManagedObjectArray=newCCArray();//自动释放的对象放在这个Array里面@H_403_41@
  8. m_pManagedObjectArray->init();@H_403_41@
  9. }@H_403_41@
  10. CCAutoreleasePool::~CCAutoreleasePool(void)@H_403_41@
  11. CC_SAFE_DELETE(m_pManagedObjectArray);@H_403_41@
  12. }@H_403_41@
  13. voidCCAutoreleasePool::addObject(CCObject*pObject)@H_403_41@
  14. m_pManagedObjectArray->addObject(pObject);//实质上的添加函数,加到对象管理数组里面@H_403_41@
  15. CCAssert(pObject->m_uReference>1,"referencecountshouldbegreaterthan1");//断言@H_403_41@
  16. ++(pObject->m_uAutoReleaseCount);@H_403_41@
  17. pObject->release();//norefcount,inthiscaseautoreleasepooladded.@H_403_41@
  18. voidCCAutoreleasePool::removeObject(CCObject*pObject)@H_403_41@
  19. for(unsignedinti=0;i<pObject->m_uAutoReleaseCount;++i)@H_403_41@
  20. m_pManagedObjectArray->removeObject(pObject,false);@H_403_41@
  21. voidCCAutoreleasePool::clear()@H_403_41@
  22. if(m_pManagedObjectArray->count()>0)@H_403_41@
  23. //CCAutoreleasePool*pReleasePool;@H_403_41@
  24. #ifdef_DEBUG@H_403_41@
  25. intnIndex=m_pManagedObjectArray->count()-1;@H_403_41@
  26. #endif@H_403_41@
  27. CCObject*pObj=NULL;@H_403_41@
  28. CCARRAY_FOREACH_REVERSE(m_pManagedObjectArray,pObj)@H_403_41@
  29. if(!pObj)@H_403_41@
  30. break;@H_403_41@
  31. --(pObj->m_uAutoReleaseCount);@H_403_41@
  32. //(*it)->release();@H_403_41@
  33. //delete(*it);@H_403_41@
  34. #ifdef_DEBUG@H_403_41@
  35. nIndex--;@H_403_41@
  36. #endif@H_403_41@
  37. m_pManagedObjectArray->removeAllObjects();@H_403_41@
  38. //--------------------------------------------------------------------@H_403_41@
  39. //@H_403_41@
  40. //CCPoolManager@H_403_41@
  41. CCPoolManager*CCPoolManager::sharedPoolManager()//获取管理员实例@H_403_41@
  42. if(s_pPoolManager==NULL)@H_403_41@
  43. s_pPoolManager=newCCPoolManager();//如果没有实例,调构造函数@H_403_41@
  44. returns_pPoolManager;@H_403_41@
  45. voidCCPoolManager::purgePoolManager()@H_403_41@
  46. CC_SAFE_DELETE(s_pPoolManager);@H_403_41@
  47. CCPoolManager::CCPoolManager()@H_403_41@
  48. m_pReleasePoolStack=newCCArray();//栈结构,管理自动释放池@H_403_41@
  49. m_pReleasePoolStack->init();@H_403_41@
  50. m_pCurReleasePool=0;@H_403_41@
  51. CCPoolManager::~CCPoolManager()@H_403_41@
  52. finalize();@H_403_41@
  53. //weonlyreleasethelastautoreleasepoolhere@H_403_41@
  54. m_pCurReleasePool=0;@H_403_41@
  55. m_pReleasePoolStack->removeObjectAtIndex(0);@H_403_41@
  56. CC_SAFE_DELETE(m_pReleasePoolStack);@H_403_41@
  57. voidCCPoolManager::finalize()@H_403_41@
  58. if(m_pReleasePoolStack->count()>0)@H_403_41@
  59. //CCAutoreleasePool*pReleasePool;@H_403_41@
  60. CCObject*pObj=NULL;@H_403_41@
  61. CCARRAY_FOREACH(m_pReleasePoolStack,pObj)//遍历对象池栈,清空所有对象池@H_403_41@
  62. if(!pObj)@H_403_41@
  63. break;@H_403_41@
  64. CCAutoreleasePool*pPool=(CCAutoreleasePool*)pObj;@H_403_41@
  65. pPool->clear();@H_403_41@
  66. voidCCPoolManager::push()//管理员的push方法,将对象池栈压栈。当前对象池为NULL时才调用push函数@H_403_41@
  67. CCAutoreleasePool*pPool=newCCAutoreleasePool();//ref=1@H_403_41@
  68. m_pCurReleasePool=pPool;@H_403_41@
  69. m_pReleasePoolStack->addObject(pPool);//ref=2@H_403_41@
  70. pPool->release();//ref=1@H_403_41@
  71. voidCCPoolManager::pop()//管理员的pop方法,将对象池栈弹栈,其实就是释放对象@H_403_41@
  72. if(!m_pCurReleasePool)@H_403_41@
  73. return;@H_403_41@
  74. intnCount=m_pReleasePoolStack->count();@H_403_41@
  75. m_pCurReleasePool->clear();@H_403_41@
  76. if(nCount>1)@H_403_41@
  77. m_pReleasePoolStack->removeObjectAtIndex(nCount-1);@H_403_41@
  78. //if(nCount>1)@H_403_41@
  79. //{@H_403_41@
  80. //m_pCurReleasePool=m_pReleasePoolStack->objectAtIndex(nCount-2);@H_403_41@
  81. //return;@H_403_41@
  82. //}@H_403_41@
  83. m_pCurReleasePool=(CCAutoreleasePool*)m_pReleasePoolStack->objectAtIndex(nCount-2);@H_403_41@
  84. /*m_pCurReleasePool=NULL;*/@H_403_41@
  85. voidCCPoolManager::removeObject(CCObject*pObject)@H_403_41@
  86. CCAssert(m_pCurReleasePool,"currentautoreleasepoolshouldnotbenull");@H_403_41@
  87. m_pCurReleasePool->removeObject(pObject);@H_403_41@
  88. voidCCPoolManager::addObject(CCObject*pObject)@H_403_41@
  89. getCurReleasePool()->addObject(pObject);//将对象添加到当前的对象池@H_403_41@
  90. CCAutoreleasePool*CCPoolManager::getCurReleasePool()//获取当前对象池,@H_403_41@
  91. if(!m_pCurReleasePool)@H_403_41@
  92. push();//对象池由一个栈维护。当前对象池为空,则push一下,push函数会new一个对象池,然后添加到栈里@H_403_41@
  93. returnm_pCurReleasePool;@H_403_41@
  94. NS_CC_END@H_403_41@

好了,就这些。

一个对象添加自动释放池后在什么时机被释放,这里不写了。后面有机会再写。

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