代码改变世界

内存计数机制

2013-03-26 23:41  Chan08  阅读(143)  评论(0编辑  收藏  举报

为什么要有内存计数机制:

在C/C++中,内存对于开发人员是开放的我们可以随意操作,这就意味着我们能用C/C++写出很强大的工程,所有事物永远都是一把双刃剑,有利就会有弊端。虽说我们可以随意操作内存,

但是内存的管理给我们增加了不少负担。

在这个领域里我们就比C#以及java多了一个课题,它就是我们怎么更好的使用内存,更合理的释放内存,方法有很多种,其中就有今天要讨论的计数机制。

今天我们就看看cocos2d-x是如何做这些事情的吧!

首先要明白我们用cocos2d-x是用来创造游戏的,那么很多情况我们不能用了资源就立即释放。

如:

我们创建一个Scene,然后我们在这个Scene添加一个精灵,添加精力就得使用new关键字,这个时候我们通过cocos2d-x源码可以得出(这种按F12的事情我这里就不再重复了),此时内存计数是1。

我们有了精灵那么我就得把他添加到当前节点也就是当前的Scene上,通过cocos2d-x源码我们继续可以知道此时计数就是2,这里为什么要加1我们稍后再说。

在cocos2d-x中我用了就要释放,这个时候我们就应该调用release,查看源码这个时候计数器变为1.

从上面过程我们知道最后我们释放了计数器是1,但是cocos2d-x中计数器要变为0的时候才能释放。怎么回事呢?

我们把话题方到刚才说过,我们创建的游戏,如果场景还在界面上,就意味着我们要不停的绘制,如果释放了那还得了。这里不让计数器变为0就是这个原因。

那么什么时候我们可以释放掉内存,其实这个是cocos2d-x应该做的事情,我们在编码中必须保证该场景退出后内存计数器为1就行了。当当前场景结束掉后,cocos2d-x会释放掉父容器,

这个过程我们通过源码可以看到它会去遍历父容器里面所有的子节点,如果计数器大于0的它都会释放一次。注意是释放一次。也就是说在场景退出后我们计数器如果大于1那么就会有内存泄漏。

这个后果大家都知道。所以我们必须在用了后release掉。

 

欢迎讨论和提意见