博客
关于我
我理解中的cocos2dx之Ref
阅读量:570 次
发布时间:2019-03-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的引用计数和自动回收池机制至关重要。正确使用这些工具可以帮助开发者避免内存泄漏,并提升应用的稳定性和性能。

    转载地址:http://cytvz.baihongyu.com/

    你可能感兴趣的文章
    SQL基本操作命令
    查看>>
    强制类型转换原理
    查看>>
    伪类选择器
    查看>>
    C# WinForm程序退出的方法
    查看>>
    ubuntu安装gem和fastlane
    查看>>
    ViroMedia集成android报错Lcom/facebook/react/bridge/WritableMap
    查看>>
    onFailure unexpected end of stream
    查看>>
    android 集成weex
    查看>>
    《C Prime Plus》(第六版) 第03章 编程练习 5 unsigned long int 格式化输出
    查看>>
    【echarts】中国地图china.js 在线引用地址
    查看>>
    Flex 布局的自适应子项内容过长导致其被撑大问题
    查看>>
    PL/SQL 动态Sql拼接where条件
    查看>>
    Lua-table 一种更少访问的安全取值方式
    查看>>
    虚函数
    查看>>
    菱形继承
    查看>>
    Error:Cannot read packageName from AndroidManifest.xml
    查看>>
    RTL设计- 多时钟域按顺序复位释放
    查看>>
    斐波那契数列两种算法的时间复杂度
    查看>>
    int main(int argc,char* argv[])详解
    查看>>
    【Android踩过的坑】7.Android Studio 点击启动项目时进入调试模式
    查看>>