Cocos内存管理机制

寒假回家期间,在家下了一份cocos源码,在阅读的过程中也整理一下cocos的架构设计和实现,也算是为国隔离。
这次先讲一讲cocos对于UI元素的内存管理机制。之后本专栏还会写一些cocos其他模块的解析,例如渲染、事件分发等。
众所周知,C++是一种比较底层的语言,由于它目前还不支持垃圾回收机制,因此在堆上分配一个对象之后,必须在代码逻辑中由delete回收,否则就会导致内存泄漏问题。尤其对于游戏引擎来说,如果在每一帧的循环代码中出现内存泄漏,很容易内存就会爆掉。
C++11中可以使用shared_ptr来对指针进行引用计数,当引用为0时,自动释放指针指向的内存。但是shared_ptr为保证线程安全,运用互斥锁导致了一定性能损失,再加上使用shared_ptr的方式并不是很自然,因此Cocos没有用它来进行内存管理。

相反,Cocos设计了一种基于引用计数的方法来更简便和自然地保证创建的UI元素不会发生内存泄漏,在这里予以介绍。
在Cocos的UI中,所有的UI节点都是继承自Node类,Node又继承自Ref类,它负责UI节点的引用计数,类的声明如下:

class CC_DLL Ref
{
public:
    void retain();
    void release();
    Ref* autorelease();
    unsigned int getReferenceCount() const;

protected:
    Ref();

public:
    virtual ~Ref();

protected:
    /// count of references
    unsigned int _referenceCount;
    friend class AutoreleasePool;
};

其中_referenceCount中就记录了该对象的引用计数,初始值为1。retain和release分别负责增加和减少Ref对象的引用计数,代码如下:

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

void Ref::release()
{
    CCASSERT(_referenceCount > 0, "reference count should be greater than 0");
    --_referenceCount;

    if (_referenceCount == 0)
        delete this;
}

调用release时,在减掉引用计数后,如果引用计数已经是0,则会清空掉自己所指向的内存。

猜你喜欢

转载自www.cnblogs.com/wickedpriest/p/12238338.html