关于cocos2d-x的AutoreleasePool

大家之所以觉得cocos2d-x容易上手入门,估计就是因为AutoreleasePool(个人以为)

PoolManager 管理 AutoreleasePool

class CC_DLL PoolManager
{
    AutoreleasePool *getCurrentPool() const;
    std::vector<AutoreleasePool*> _releasePoolStack;
};
class CC_DLL AutoreleasePool
{
    void addObject(Ref *object);
    void clear();
    bool contains(Ref* object) const;
    void dump();
}

AutoreleasePool 的实现会让大牛觉得不屑;

void DisplayLinkDirector::mainLoop()
{
...
        PoolManager::getInstance()->getCurrentPool()->clear();
}

直接看clear

void AutoreleasePool::clear()
{
    for (const auto &obj : _managedObjectArray)
    {
        obj->release();
    }
    _managedObjectArray.clear(); // 留意这里,这里清空了
}

可以看到,遍历并release并清空

所以一开始 _managedObjectArray.reserve(150); 已经足够。

关注 _managedObjectArray

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

见CCObject(3.0换成了Ref)

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

这就是 autorelease 的意义

以Speed动作对象为例

Speed* Speed::create(ActionInterval* action, float speed)
{
    Speed *ret = new (std::nothrow) Speed();
    if (ret && ret->initWithAction(action, speed))
    {
        ret->autorelease();
        return ret;
    }
    CC_SAFE_DELETE(ret);
    return nullptr;
}

实际上,AutoreleasePool autorelease 等和 引用计数没有什么关系。引用技术是release 和 retain 的技术。

时间: 2024-10-09 17:04:17

关于cocos2d-x的AutoreleasePool的相关文章

Cocos2d之&ldquo;引用计数&rdquo;内存管理机制实现解析

一.引言 本文主要分析cocos2d游戏开发引擎的引用计数内存管理技术的实现原理.建议读者在阅读本文之前阅读笔者之前一篇介绍如何使用cocos2d内存管理技术的文章--<Cocos2d之Ref类与内存管理使用详解>. 二.相关概念 引用计数 引用计数是计算机编程语言的一种内存管理技术,是指将资源(对象.内存或者磁盘空间等)的被引用计数保存起来,当引用计数变为零时就将资源释放的过程.使用引用计数技术可以实现自动内存管理的目的. 当实例化一个类时,对象的引用计数为1,在其他对象需要持有这个对象时,

iOS导入cocos2d游戏

一.xcode中在自己项目中引入cocos2dx,需要导入cocos2d_libs静态库.首先需要到官网下载cocos2d引擎,cocos2d引擎下载链接点击进入官网 二.将cocos2d引擎拷贝到工程目录,在工程中add Files..添加到工程中. 三.添加依赖库 四.对工程进行配置 1.Build Settings中配置 设置Valid Architectures 2.Build Options ->Enable Bitcode 设置为NO 3.设置Other Linker Flages

cocos2d::Vector

v3.0 beta加入 定义在"COCOS2DX_ROOT/cocos/base"的"CCVector.h"头文件中. template<class T>class CC_DLL Vector; cocos2d::Vector<T>是一个封装好的能动态增长顺序访问的容器. cocos2d::Vector<T>中的元素是按序存取的,它的低层实现数据结构是标准模版库中的标准顺序容器std::vector. 在Cocos2d-x v3.

Cocos2D中Action的进阶使用技巧(一)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! hopy ;) 大家对Cocos2d中动作的使用大概都非常清楚了,事实上本身action的概念也不复杂. 可是在某些情况下,一般的动作不能满足我们需求的时候,我们就必须使用更高级的Action方法来解决这个问题. 比方,串行化(不是序列化哦,这是两个全然不同的概念)不同Action的执行-有些童鞋可能会说非常easy,直接用CCActionSequence不就结了,可是等等我

Cocos2d入门--3-- 向量的应用

 Cocos2d入门--3-- 向量的应用 小球向一个方向持续运动的Demo HelloWorldScene.h ...... //设置一个protected的属性 protected: cocos2d::Vec2 _vec; ...... HelloWorldScene.cpp //这个是通过随机数设置向量的方向 _vec.set(random(-0.1f, 1.0f), random(-1.0f, 1.0f)); //通过normalize这个标准化函数,能够使得向量的大小为1 _vec.n

Cocos2d入门--1-- 初涉相关属性或代码

 Cocos2d入门--1-- 初涉相关属性或代码 Cocos2d vision:  cocos2d-x-3.8.1 万丈高楼,起于累土.对于一个游戏框架的学习,其实在于框架功能的使用积累,学会了如何在cocos2d游戏引擎的基础上使用它提供的各种功能,并灵活运用, 以及学会查阅Cocos2d官方提供的API文档.相信自己也能开发出自己喜爱或者让别人羡慕的游戏. 目录: 1>认识origin和visibleSize以及cocos2d的基础绘画类DrawNode的简单实用 2>认识 CCLOG(

UITableViewController 滚动引起的cocos2d动画暂停问题的解决

UITableViewController 滚动引起的cocos2d动画暂停问题的解决 之前在使用UITableViewController进行滚动时,cocos2d的动画会暂停,直至滚动完毕才会继续动画. 后来发现可以这样解决,想要了解更多,请查阅NSRunLoop相关知识. // .h NSTimer* m_timer; // .m- (void)updateCCDirector { [[CCDirector sharedDirector] drawScene]; if (!self.tab

step 5 autoreleasepool

自动释放池 作用 自动释放对象的 所有 autorelease 的对象,在出了作用域之后,会被自动添加到最近创建的自动释放池中 自动释放池被销毁或者耗尽时,会向池中所有对象发送 release 消息,释放池中对象 自动释放池,在 ARC & MRC 程序中,同样有效 1 自动释放池是什么时候创建的?什么时候销毁的? 2 创建,运行循环检测到事件并启动后,就会创建自动释放池 3 销毁:一次完整的运行循环结束之前,会被销毁 for (long i = 0; i < largeNumber; ++

cocos2d 游戏开发实战

文章转自:http://uliweb.clkg.org/tutorial/read/40 6   cocos2d 游戏开发实战 6.1   创建cocos2d项目 6.2   cocos2d v3 "hello world" 6.2.1   显示一个飞船 6.3   精灵 6.4   開始 space viking 之旅 6.4.1   添加 sneakyinput 6.5   精灵的移动效果,旋转效果 6.6   定时器效果 6.7   启动 cocos2d,默认竖屏 6.8   检

cocos2d::Map

v3.0 beta加入 定义在"COCOS2DX_ROOT/cocos/base"的"CCMap.h"头文件中. template <class K, class V> class CC_DLL Map; cocos2d::Map<K,V>是使用std::unordered_map作为底层结构的关联式容器. 而std::unordered_map是一个存储键值对的关联式容器,它可以通过它们的键快速检索对应的值. 使用unordered_map