【cocos2d-x-3.1.1系列5】cocos2d-x 引用计数细节

看了引用计数之后  那时好像懂了   今天突然想起一个问题:

Scene也是继承自Ref ,然后也是静态生成一个autorelease后的对象  那计数就变成1了

class CC_DLL Scene : public Node

{

public:

/** creates a new Scene object */

static Scene *create();

{

Scene *Scene::create()

{

Scene *ret = new Scene();

if (ret
&& ret->init())

{

ret->autorelease();

return ret;

}

else

{

CC_SAFE_DELETE(ret);

return nullptr ;

}

}

}

}

main函数里面: 【每种颜色代表一个函数  颜色嵌套代表函数的调用 类似栈】

int APIENTRY _tWinMain (HINSTANCE hInstance ,

HINSTANCE hPrevInstance ,

LPTSTR    lpCmdLine ,

int       nCmdShow)

{

return Application::getInstance()->run();

其中run(){

while(!glview->windowShouldClose())

{

QueryPerformanceCounter(&nNow);

if (nNow.QuadPart
- nLast.QuadPart > _animationInterval.QuadPart)

{

nLast.QuadPart = nNow.QuadPart;

director->mainLoop();

其中mainLoop();

{

drawScene();

PoolManager::getInstance()->getCurrentPool()->clear();

for (const auto &obj
: _managedObjectArray)

     {

        obj->release();

     }

}

glview->pollEvents();

}

else

{

Sleep(0);

}

}

}

}

我们看到蓝色代码那里,PoolManager::getInstance()->getCurrentPool()->clear();

这句代码会调用obj->release();把每个加入autoreleasepool的对象进行release操作,好了问题就来了(不是挖掘面积)

Scene加入autorelease了  node继承的都加入了   Sprite也加入了  我们知道ref的构造函数是把引用计数自动变成1,那这里每一帧的绘画会把对象池里面的scene node sprite调用一次release 如果没有其他retain也就是变成0要回收了,但是不是这样的,实际还是可以显示出来的

有两个地方  一个是scene的runWithScene一个是继承node的sprite这些等等

1、scene的runWithScene

【每种颜色代表一个函数  颜色嵌套代表函数的调用 类似栈】

bool AppDelegate ::applicationDidFinishLaunching()
{

auto director
= Director::getInstance();

auto glview
= director->getOpenGLView();

if(!glview)
{

glview = GLView::create("WeChat
Airplane" );

glview->setFrameSize(600,800);

director->setOpenGLView(glview);

}

director->setDisplayStats( true);

director->setAnimationInterval(1.0 / 60);

glview->setDesignResolutionSize(480, 800, ResolutionPolicy::SHOW_ALL );

this->setResourceSearchResolution();

auto scene
= WelcomeScene::create();

director->runWithScene(scene);

runWithScene(scene){

pushScene( scene);

{

_scenesStack.pushBack( scene);

{

_data.push_back( object );

object ->retain();

}

}

}

return true;

}

从上面的代码  我们可以看到最好还是retain了   所以scene是在mainloop里面的autoreleasepool减1  clear一次 但是他在_scenesStack retain了

那么就不会被回收了  那所有的node其实都是添加到scene里面的,也就不会因为release Scene而导致node减1

2、继承node的sprite这些等等

我们知道都要addChild的  layer也好 node也好 sprite也好  都是要加进去的

void Node::addChild(Node *child)

{

CCASSERT( child != nullptr , "Argument
must be non-nil" );

this->addChild(child,
child->_localZOrder, child->_tag);

{

void Node ::insertChild( Node* child, int z)

{

_transformUpdated = true ;

_reorderChildDirty =true;

_children.pushBack(child);

void pushBack(T object )

{

CCASSERT (object
!= nullptr , "The
object should not be nullptr" );

_data.push_back( object );

object ->retain();

}

child->_setLocalZOrder( z);

}

}

}

从上面的调用来看  我们可以看到最后的调用还是用了object ->retain();
 所以mainloop里面autoreleasepool 调用release是把2变成1  然后autoreleasepool 已经把vector存的内容clear下一帧就不会调用了

时间: 2024-10-12 15:11:04

【cocos2d-x-3.1.1系列5】cocos2d-x 引用计数细节的相关文章

Cocos2d之“引用计数”内存管理机制实现解析

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

[F#, Basic] 轻松学习系列 ( 20 ) ─ 循环设计 之 计数循环 (二)

Visual F# 在前一文介绍的是 for -- to -- 的语法,今天再介绍?? for -- downto -- 的语法啰! ★ 语法说明: 1: for ... downto ... 计数循环 - 语法说明 2: for = downto do 3: ? ? ★ 范例程序: 1: // Nobel Hsieh ( http://www.dotblogs.com.tw/nobel12 ) 2: open System;; 3:? 4: // for ... downto ... 计数循环

实战c++中的vector系列--emplace_back造成的引用失效

上篇将了对于struct或是class为何emplace_back要优越于push_back,但是还有一些细节没有提及.今天就谈一谈emplace_back造成的引用失效. 直接撸代码了: #include <vector> #include <string> #include <iostream> using namespace std; int main() { vector<int> ivec; ivec.emplace_back(1); ivec.e

MapReduce 编程 系列十二 Reduce阶段内部细节和调节参数

Reduce计算分为若干阶段 1. copy(或者叫shuffle)阶段和merge阶段并行 之前Map产生的结果被存放在本地磁盘上,这时需要从reduce节点将数据从map节点复制过来.放得下进内存,比较大的则写到本地磁盘. 同时,有两个线程对已经获得的内存中和磁盘上的数据进行merge操作. 具体细节是: 通过RPC调用询问task tracker已经完成的map task列表,shuffle(洗牌)是对所有的task tracker host的洗牌操作,这样可以打乱copy数据的顺序,防止

Excel操作技巧系列:1 相对引用,绝对引用和混合引用

如今职场中,和数据打交道的话,几乎是不可避免的要接触到excel了. 说来有些惭愧,和女票吹嘘说过自己以前用vba写过excel小游戏,所以她认为我excel玩得很溜,来拜托我修改下excel数据,一道黑线划过,我也不好意思说我对excel的操作水平有限,硬着头皮也得拍胸脯说没问题.机智得我那次是把excel数据导入到了Sql Server,用熟悉的Sql语句来完成她要的修改,然后再导出数据回到excel给她.虽然最终目的是达到了,但也同时下定决心去学好excel的操作. 1.相对引用 B2:D

jdk8系列二、方法引用

一.方法引用 方法引用使得开发者可以直接引用现存的方法.Java类的构造方法或者实例对象.方法引用和Lambda表达式配合使用,使得java类的构造方法看起来紧凑而简洁,没有很多复杂的模板代码. 例子中,Car类是不同方法引用的例子,可以帮助读者区分四种类型的方法引用. package com.study.demo.TestRefernce; import java.util.Arrays; import java.util.List; import java.util.function.Sup

[ PHP 内核与扩展开发系列] 内存管理 —— 引用计数

对于 PHP 这种需要同时处理多个请求的程序来说,申请和释放内存的时候应该慎之又慎,一不小心便会酿成大错.另一方面,除了要安全申请和释放内存外,还应该做到内存的最小化使用,因为它可能要处理每秒钟数以千计的请求,为了提高系统整体的性能,每一次操作都应该只使用最少的内存,对于不必要的相同数据的复制则应该能免则免.我们来看下面这段 PHP 代码: <?php $a = 'Hello World'; $b = $a; unset($a); 第一条语句执行后,PHP 创建了 $a 这个变量,并为它申请了

如何在Cocos2D游戏中实现A*寻路算法(一)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 该篇博客由iOS课程团队的Johann Fradj发布,他现在是一个全职开发iOS的开发者.他是Hot Apps Factory(其是App Cooker的创造者)的共同创建

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.