我理解中的cocos2dx之Ref
发布日期:2021-05-14 02:24:22 浏览次数:11 分类:精选文章

本文共 2568 字,大约阅读时间需要 8 分钟。

Cocos2D X内存管理机制详解

Cocos2D X中的内存管理机制非常关键,它通过引用计数和自动回收池(Autorelease Pool)确保程序的高效运行。


引用计数机制

Cocos2D X的内存管理核心是Ref类,其通过引用计数(reference count)来管理对象的生命周期。

与retain()和release()函数相关的操作

  • retain()函数

    每当一个Ref对象被retain()调用时,引用计数 _referenceCount 会增加1。这通常用于延长对象的生命周期,确保它不会被立即释放。

    void Ref::retain() {    CCASSERT(_referenceCount > 0, "reference count should be greater than 0");    ++_referenceCount;}
  • release()函数

    release()被调用时,引用计数减少1。当计数变为0时,Ref会释放自己的内存:

    void Ref::release() {    CCASSERT(_referenceCount > 0, "reference count should be greater than 0");    --_referenceCount;    if (_referenceCount == 0) {        #if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)            auto poolManager = PoolManager::getInstance();            if (!poolManager->getCurrentPool()->isClearing() &&                poolManager->isObjectInPools(this)) {                CCASSERT(false, "The reference shouldn't be 0 because it is still in autorelease pool.");            }        #endif        #if CC_REF_LEAK_DETECTION            untrackRef(this);        #endif        delete this;    }}
  • 自动回收池(Autorelease Pool)

    自动回收池通过将对象加入并管理一个内存容器,延迟释放对象直到需要的时候。

    Ref* Ref::autorelease() {    PoolManager::getInstance()->getCurrentPool()->addObject(this);    return this;}

    自动回收池的实现

    内存池通过以下方式工作:

    void AutoreleasePool::addObject(Ref* object) {    _managedObjectArray.push_back(object);}

    内存池在清理时会释放所有被管理对象:

    void AutoreleasePool::clear() {    #if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)        _isClearing = true;    #endif    for (const auto &obj : _managedObjectArray) {        obj->release();    }    _managedObjectArray.clear();    #if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)        _isClearing = false;    #endif}

    内存管理流程

  • 循环中的内存管理

    Cocos2D X运行一个大型循环来处理绘图、事件和其他任务。在循环体内,内存会被定期清理:

    Application::getInstance()->run();... while (!glview->windowShouldClose()) {    QueryPerformanceCounter(&nNow);    if (nNow.QuadPart - nLast.QuadPart > _animationInterval.QuadPart) {        nLast.QuadPart = nNow.QuadPart - (nNow.QuadPart % _animationInterval.QuadPart);        director->mainLoop();        glview->pollEvents();    } else {        Sleep(1);    }}
  • 主循环中的清理过程

    DisplayLinkDirectormainLoop()中,内存池会被清理:

    void DisplayLinkDirector::mainLoop() {    if (_purgeDirectorInNextLoop) {        _purgeDirectorInNextLoop = false;        purgeDirector();    } else if (! _invalid) {        drawScene();        PoolManager::getInstance()->getCurrentPool()->clear();    }}

  • 保障内存安全

    Cocos2D X的内存管理机制通过严格的引用计数和自动回收池确保内存不会泄漏。开发者无需手动管理对象生命周期,系统会自动处理对象的保留和释放。


    要实现高效的内存管理,理解Cocos2D X的引用计数和自动回收池机制至关重要。正确使用这些工具可以帮助开发者避免内存泄漏,并提升应用的稳定性和性能。

    上一篇:我理解中的cocos2dx之Node
    下一篇:cocos2dx 自定义进度条的实现!

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年04月17日 02时40分05秒