`
473687880
  • 浏览: 535227 次
文章分类
社区版块
存档分类
最新评论

cocos2d-x3.0之object内存管理

 
阅读更多

看object类的实现就行了。

首先映入眼帘的是它们:

protected:
    /// count of references
    unsigned int        _reference;
    /// count of autorelease
    unsigned int        _autoReleaseCount;

然后我们先看下_reference都在哪里被引用:


就是两个函数retain和release在修改它。

    /**
     * Retains the ownership.
     *
     * This increases the object's reference count.
     *
     * @see release, autorelease
     * @js NA
     */
    inline void retain()
    {
        CCASSERT(_reference > 0, "reference count should greater than 0");
        ++_reference;
    }

    /**
     * Release the ownership immediately.
     *
     * This decrements the object's reference count.
     *
     * If the reference count reaches 0 after the descrement, this object is
     * destructed.
     *
     * @see retain, autorelease
     * @js NA
     */
    inline void release()
    {
        CCASSERT(_reference > 0, "reference count should greater than 0");
        --_reference;

        if (_reference == 0)
            delete this;
    }

API提供的注释说的很清楚,retain增加引用,release减少,当减为0就释放,这种引用计数的方法到处可见,比如windows里对资源的管理。

但_autoReleaseCount怎么用的呢?

我们发现它是protected的,吐槽,改为【private的,用setter/getter比较友好。

这个东东是代码到处可见的addObejct里面会改变滴:

void AutoreleasePool::addObject(Object* object)
{
    _managedObjectArray->addObject(object);

    CCASSERT(object->_reference > 1, "reference count should be greater than 1");
    ++(object->_autoReleaseCount);
    object->release(); // no ref count, in this case autorelease pool added.
}

看到上一篇文章的clone吗,就会调到这里:

Array* Array::clone() const  
{  
    Array* ret = new Array();  
    ret->autorelease();

autorelease里面:

Object* Object::autorelease()
{
    PoolManager::sharedPoolManager()->addObject(this);
    return this;
}

void PoolManager::addObject(Object* object)
{
    getCurReleasePool()->addObject(object);
}
void AutoreleasePool::addObject(Object* object)
{
    _managedObjectArray->addObject(object);

    CCASSERT(object->_reference > 1, "reference count should be greater than 1");
    ++(object->_autoReleaseCount);
    object->release(); // no ref count, in this case autorelease pool added.
}

注意object在构造的时候

Object::Object()
: _luaID(0)
, _reference(1) // when the object is created, the reference count of it is 1
, _autoReleaseCount(0)
{
    static unsigned int uObjectCount = 0;

    _ID = ++uObjectCount;
}

两个引用是不一样的,程序里会适当地调用retain,不然在autorelease会释放一次,这要保证reference>0不然要被释放掉。

嗯,赶脚好麻烦,估计这部分要被干掉,用C++11自带的智能指针。

分享到:
评论

相关推荐

    cocos2d-x 3.0

    cocos2d-x 3.0中的cc::Animate类可以轻松管理这些帧,通过`createWithFrames`方法创建动画,并使用`runAction`将动画添加到精灵上。 3. 物理引擎:如果游戏需要更真实的物理效果,比如重力、碰撞检测,可以集成Box...

    Cocos2d-x 3.0的俄罗斯方块代码

    7. **内存管理**:学习C++的智能指针(如std::shared_ptr)和Cocos2d-x的自动释放池,确保资源有效管理和释放。 8. **多平台适配**:理解Cocos2d-x的跨平台特性,如何针对不同设备进行优化,包括屏幕适配和触控事件...

    Cocos2d-x3.0正式版 练练看 源码

    3. **改进的内存管理**:Cocos2d-x3.0采用了一种新的内存管理系统,优化了对象生命周期管理和内存分配,减少了内存泄漏和不必要的内存消耗。 4. **多平台支持**:作为一款跨平台框架,Cocos2d-x3.0支持iOS、Android...

    cocos2d-x-3.0 类图

    这是我重新弄的cocos2d-x-3.0的类图.之前别人兄台弄的,有些不全面,有些地方错误.我这个可以说是最新的了.每个类添加了中文的详细注解,同时也添加了中文的类名称翻译.这样对cocos2d-x-3.0的框架比较好上手. 有兴趣的...

    cocos2d-x 3.0-alpha0 Lib文件

    6. **性能优化**:3.0-alpha0版本在内存管理和CPU使用上进行了深度优化,减少了内存占用,提升了运行速度,这对于移动设备上的游戏至关重要。 7. **跨平台**:cocos2d-x一直以其跨平台性著称,3.0-alpha0版本继续...

    cocos2d-x3.0rc0 中文API

    《cocos2d-x 3.0中文API详解》 cocos2d-x是一个开源的、跨平台的游戏开发框架,广泛应用于2D游戏、实验性的3D游戏以及各种交互式应用的开发。3.0版本的发布带来了许多新特性和改进,其中中文API文档的推出更是为...

    animatepacker +cocos2d-x3.0接口封装

    本文将深入探讨如何将animatepacker的功能与cocos2d-x3.0进行接口封装,以实现更高效、便捷的动画管理。 animatepacker是一款专为2D动画设计的打包工具,它允许开发者将多帧序列图片合并成一张大图(也称为精灵表或...

    兄弟连cocos2d-x3.0 final视频教程完整版

    ### Cocos2d-x3.0 Final视频教程知识点解析 #### 一、Cocos2d-x简介 Cocos2d-x是一款开源的游戏开发框架,它支持多种编程语言,包括C++、JavaScript和Lua等。该框架特别适用于移动平台游戏的开发,支持iOS、...

    Cocos2d-x 3.0 过渡学习

    在Cocos2d-x 3.0的过渡学习中,首先需要了解到的是类命名的变化。在3.0版本中,以"CC"为前缀的类名被移除,例如CCSprite类被简化为Sprite,CCNode类被简化为Node,CCDirector类被简化为Director。这意味着,在升级到...

    cocos2d-x3.0导出自定义类到lua的测试源文件

    《cocos2d-x3.0中自定义类与Lua交互的深度解析》 在cocos2d-x 3.0版本中,开发者们经常需要将C++自定义的类暴露给Lua脚本使用,以便在游戏中实现更复杂的逻辑和交互。这篇文档将详细解释如何将C++自定义类导出到Lua...

    Cocos2d-x3.0游戏实例《别救我》源码

    Cocos2d-x3.0提供了丰富的图形绘制、动画处理、物理引擎、音频播放等功能,以及事件系统和场景管理,使得开发者可以专注于游戏逻辑,而不是底层技术实现。 2. **tmx文件**:tg1.tmx是一个Tile Map XML文件,通常...

    SneakyJoystick-Cocos2d-x 3.0rc0

    《SneakyJoystick-Cocos2d-x 3.0rc0:打造高效游戏控制体验》 Cocos2d-x是一款流行的开源游戏开发框架,它使用C++编写,支持多种平台,包括iOS、Android以及Windows等。在游戏开发中,交互性是至关重要的,而...

    cocos2d-x 3.0 类关系图

    这是cocos2d-x 3.0 类关系图, 这个制作者是:gamecocos2dx 他做的Xmind,我导出的PNG格式,我推荐还是看Xmind,里面还有一些注释 gamecocos2dx Xmind下载地址:...

    cocos2d-x 3.0 +cocostudio 1.4 奇怪的大冒险

    《cocos2d-x 3.0与cocostudio 1.4:打造奇怪的大冒险》 在游戏开发领域,cocos2d-x 和 cocostudio 是两款强大的工具,尤其适用于初学者。cocos2d-x 是一个开源的2D游戏引擎,广泛应用于iOS、Android以及Windows等多...

    cocos2d-x 3.0创建项目

    下载并解压Cocos2d-x 3.0的压缩包,然后将`[cocos-root]/tools/cocos2d-console/bin/`路径添加到环境变量Path中。这使得你可以从任何目录调用cocos命令行工具。 3. **验证环境**: 打开命令行终端,切换到`cocos...

    cocos2d-x 3.0 骨骼动画 demo

    《cocos2d-x 3.0 骨骼动画技术详解及应用实践》 cocos2d-x 是一个广泛使用的开源游戏开发框架,而3.0版本在原有的基础上引入了骨骼动画功能,大大增强了2D游戏的角色表现力和动态效果。本篇文章将围绕“cocos2d-x ...

    cocos2d-x 3.0 离线文档

    《cocos2d-x 3.0 离线文档》是针对游戏开发框架cocos2d-x 3.0版本的一份详尽参考资料,它以HTML格式提供,方便开发者在无网络环境下查阅。cocos2d-x是一个开源的游戏开发框架,基于C++,并支持多平台,包括iOS、...

    Cocos2d-x3.0final自学教程贪食蛇项目源码

    《Cocos2d-x3.0final自学教程贪食蛇项目源码》是针对游戏开发初学者的一个宝贵资源,它提供了使用Cocos2d-x3.0final版本开发经典游戏"贪食蛇"的完整代码。Cocos2d-x是一个跨平台的2D游戏开发框架,广泛应用于iOS、...

    cocos2d-x 3.0简单例子(超详细)

    【cocos2d-x 3.0 简介】 cocos2d-x是一个开源的、跨平台的游戏开发框架,广泛应用于2D游戏、实验性的交互应用和其他视觉媒体的开发。它基于cocos2d-x是由cocos2d-iphone扩展而来的,支持C++编程语言,同时也兼容Lua...

    cocos2d-x 3.0-alpha0 SDK头文件和DLL文件

    《cocos2d-x 3.0-alpha0 SDK:头文件与DLL的解析与应用》 Cocos2d-x是一款广泛使用的开源游戏开发框架,它基于C++,为开发者提供了跨平台的游戏开发能力,覆盖了iOS、Android、Windows等多个平台。在cocos2d-x 3.0-...

Global site tag (gtag.js) - Google Analytics