Cocos2d-x   发布时间:2022-05-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了【cocos2d-x-3.1.1系列5】cocos2d-x 引用计数细节大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
看了引用计数之后 那时好像懂了 今天突然想起一个问题:
Scene也是继承自Ref ,然后也是静态生成一个autorelease后的对象 那计数就变成1了
classCC_DLLScene:publicNode
{
public:
/** creates a new Scene object */
staticScene*create();
{
Scene *Scene::create()
{
Scene *ret =newScene();
if(ret && ret->init())
{
ret->autorelease();
returnret;
}
else
{
CC_SAFE_deletE(ret);
returnnullptr;
}
}
}
}

@H_359_2@main函数里面: 【每种颜色代表一个函数 颜色嵌套代表函数的调用 类似栈】
intAPIENTRY_tWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPTSTRlpCmdLine,
intnCmdShow)
{
returnApplication::geTinstance()->run();
其中run(){
while(!glview->windowShouldClose())
{
QueryPerfoRMANceCounter(&nNow);
if(nNow.QuadPart - nLast.QuadPart > _animationInterval.QuadPart)
{
nLast.QuadPart = nNow.QuadPart;
director->mainLoop();
其中@H_961_358@mainLoop();
{
drawScene();
PoolManager::geTinstance()->getCurrentPool()->clear();
for(constauto&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
【每种颜色代表一个函数 颜色嵌套代表函数的调用 类似栈】
boolAppDelegate::applicationDidFinishLaunching() {
autodirector =Director::geTinstance();
autoglview = 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();
autoscene =WelcomeScene::create();
director->runWithScene(scenE);
runWithScene(scenE){
pushScene(scene);
{
_scenesStack.pushBACk(scene);
{
_data.push_BACk(object);
object->retain();
}
}
}
returntrue;
}

从上面的代码 我们可以看到最好还是retain了 所以scene是在mainloop里面的autoreleasepool减1 clear一次 但是他在_scenesStack retain
那么就不会被回收了 那所有的node其实都是添加到scene里面的,也就不会因为release Scene而导致node减1

2、继承node的sprite这些等等
我们知道都要addChild的 layer也好 node也好 sprite也好 都是要加进去的
voidNode::addChild(Node *child)
{
CCassERT( child !=nullptr,"Argument must be non-nil");
this->addChild(child,child->_localZOrder,child->_tag);
{
voidNode::insertChild(Node*child,intz)
{
_transformupdated =true;
_reorderChildDirty =true;
_children.pushBACk(child);

voidpushBACk(Tobject)
{
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下一帧就不会调用了

大佬总结

以上是大佬教程为你收集整理的【cocos2d-x-3.1.1系列5】cocos2d-x 引用计数细节全部内容,希望文章能够帮你解决【cocos2d-x-3.1.1系列5】cocos2d-x 引用计数细节所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。