【cocos2d-x-3.1.1系列4】cocos2d-x3.1.1.渲染过程源码简略过程

前端之家收集整理的这篇文章主要介绍了【cocos2d-x-3.1.1系列4】cocos2d-x3.1.1.渲染过程源码简略过程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
缩略渲染过程@H_301_3@

@H_301_3@
1、@H_301_3@
DisplayLinkDirector@H_301_3@ @H_301_3@ ::mainLoop()@H_301_3@

{@H_301_3@

drawScene@H_301_3@

}@H_301_3@

@H_301_3@

@H_301_3@

@H_301_3@
2、@H_301_3@

@H_301_3@

@H_301_3@

@H_301_3@
程序的主循环@H_301_3@

-->@H_301_3@DisplayLinkDirector@H_301_3@@H_301_3@::drawScene()@H_301_3@

{@H_301_3@

_runningScene->visit@H_301_3@

_renderer->render();@H_301_3@

}@H_301_3@
3、@H_301_3@

在@H_301_3@drawScene@H_301_3@里面的一句代码@H_301_3@_runningScene->visit@H_301_3@

@H_301_3@

-@H_301_3@-@H_301_3@>visit(_renderer,Mat4::IDENTITY,@H_301_3@@H_301_3@false@H_301_3@@H_301_3@);@H_301_3@

{@H_301_3@

if(!_children.empty())@H_301_3@

{@H_301_3@

sortAllChildren();@H_301_3@

this->draw@H_301_3@

}@H_301_3@

else@H_301_3@

{@H_301_3@

this->draw}@H_301_3@

}@H_301_3@
4、@H_301_3@

递归@H_301_3@visit@H_301_3@

Sprite@H_301_3@@H_301_3@::draw@H_301_3@()@H_301_3@

{@H_301_3@

产生渲染命令@H_301_3@

}@H_301_3@
5、@H_301_3@

产生渲染命令@H_301_3@

@H_301_3@

-->@H_301_3@voidRenderer@H_301_3@@H_301_3@::visitRenderQueue(const@H_301_3@@H_301_3@RenderQueue&@H_301_3@@H_301_3@queue)@H_301_3@

{@H_301_3@

if(@H_301_3@@H_301_3@RenderCommand::Type@H_301_3@@H_301_3@::QUAD_COMMAND@H_301_3@@H_301_3@)@H_301_3@

else@H_301_3@@H_301_3@if@H_301_3@@H_301_3@(RenderCommand@H_301_3@@H_301_3@::Type@H_301_3@@H_301_3@::GROUP_COMMAND@H_301_3@@H_301_3@)@H_301_3@

@H_301_3@else@H_301_3@@H_301_3@if@H_301_3@@H_301_3@(RenderCommand@H_301_3@@H_301_3@::Type@H_301_3@@H_301_3@::CUSTOM_COMMAND)@H_301_3@

else@H_301_3@@H_301_3@if@H_301_3@@H_301_3@(RenderCommand@H_301_3@@H_301_3@::Type@H_301_3@@H_301_3@::BATCH_COMMAND@H_301_3@@H_301_3@==commandType)@H_301_3@

else@H_301_3@@H_301_3@if@H_301_3@@H_301_3@(RenderCommand@H_301_3@@H_301_3@::Type@H_301_3@@H_301_3@::MESH_COMMAND@H_301_3@@H_301_3@==commandType)@H_301_3@

else@H_301_3@

@H_301_3@

}@H_301_3@

@H_301_3@

@H_301_3@

@H_301_3@

@H_301_3@

在@H_301_3@drawScene@H_301_3@里面的一句代码@H_301_3@_renderer->render();@H_301_3@

排序渲染队列执行opengl@H_301_3@命令@H_301_3@@H_301_3@

void@H_301_3@@H_301_3@ DisplayLinkDirector@H_301_3@@H_301_3@ ::mainLoop()@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ if@H_301_3@@H_301_3@ (_purgeDirectorInNextLoop)@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
_purgeDirectorInNextLoop =@H_301_3@@H_301_3@ false@H_301_3@@H_301_3@ ;@H_301_3@@H_301_3@
purgeDirector();@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ else@H_301_3@@H_301_3@ if@H_301_3@@H_301_3@ (! _invalid)@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
drawScene();@H_301_3@@H_301_3@
@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ // release the objects@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ PoolManager@H_301_3@@H_301_3@ ::getInstance()->getCurrentPool()->clear();@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@

@H_301_3@@H_301_3@
上面是主循环函数 有个drawScene 跟踪进去@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ // draw the scene@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ if@H_301_3@@H_301_3@ (_runningScene)@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
_runningScene->visit(_renderer,@H_301_3@@H_301_3@ Mat4@H_301_3@@H_301_3@ ::IDENTITY,@H_301_3@@H_301_3@ false@H_301_3@@H_301_3@ );@H_301_3@@H_301_3@
_eventDispatcher->dispatchEvent(_eventAfterVisit);//事件分发 在每一帧的绘制里面@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ _renderer->render();@H_301_3@

@H_301_3@@H_301_3@

@H_301_3@@H_301_3@
上面的visit是产生渲染队列的,上面有个render跟踪进去@H_301_3@@H_301_3@

@H_301_3@@H_301_3@
void@H_301_3@@H_301_3@ Renderer@H_301_3@@H_301_3@ ::render()@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ //Uncomment this once everything is rendered by new renderer@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);@H_301_3@@H_301_3@

@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ //TODO setup camera or MVP@H_301_3@@H_301_3@
_isRendering =@H_301_3@@H_301_3@ true@H_301_3@@H_301_3@ ;@H_301_3@@H_301_3@
@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ if@H_301_3@@H_301_3@ (_glViewAssigned)@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ // cleanup@H_301_3@@H_301_3@
_drawnBatches = _drawnVertices = 0;@H_301_3@@H_301_3@

@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ //Process render commands@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ //1. Sort render commands based on ID@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ for@H_301_3@@H_301_3@ (@H_301_3@@H_301_3@ auto@H_301_3@@H_301_3@ &renderqueue : _renderGroups)@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
renderqueue.sort();@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@
visitRenderQueue(_renderGroups[0]);@H_301_3@@H_301_3@
flush();@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@
clean();@H_301_3@@H_301_3@
_isRendering =@H_301_3@@H_301_3@ false@H_301_3@@H_301_3@ ;@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@

@H_301_3@@H_301_3@
渲染队列排序 之后到函数@H_301_3@@H_301_3@
void@H_301_3@@H_301_3@ Renderer@H_301_3@@H_301_3@ ::visitRenderQueue(@H_301_3@@H_301_3@ const@H_301_3@@H_301_3@ RenderQueue@H_301_3@@H_301_3@ &@H_301_3@@H_301_3@ queue@H_301_3@@H_301_3@ )@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ ssize_t@H_301_3@@H_301_3@ size =@H_301_3@@H_301_3@ queue@H_301_3@@H_301_3@ .size();@H_301_3@@H_301_3@
@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ for@H_301_3@@H_301_3@ (@H_301_3@@H_301_3@ ssize_t@H_301_3@@H_301_3@ index = 0; index < size; ++index)@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ auto@H_301_3@@H_301_3@ command =@H_301_3@@H_301_3@ queue@H_301_3@@H_301_3@ [index];@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ auto@H_301_3@@H_301_3@ commandType = command->getType();@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ if@H_301_3@@H_301_3@ (@H_301_3@@H_301_3@ RenderCommand@H_301_3@@H_301_3@ ::@H_301_3@@H_301_3@ Type@H_301_3@@H_301_3@ ::@H_301_3@@H_301_3@ QUAD_COMMAND@H_301_3@@H_301_3@ == commandType)@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ auto@H_301_3@@H_301_3@ cmd =@H_301_3@@H_301_3@ static_cast@H_301_3@@H_301_3@ <@H_301_3@@H_301_3@ QuadCommand@H_301_3@@H_301_3@ *>(command);@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ //Batch quads@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ if@H_301_3@@H_301_3@ (_numQuads + cmd->getQuadCount() > VBO_SIZE)@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ CCASSERT@H_301_3@@H_301_3@ (cmd->getQuadCount()>= 0 && cmd->getQuadCount() < VBO_SIZE,@H_301_3@@H_301_3@ "VBO is not big enough for quad data,please break the quad data down or use customized render command"@H_301_3@@H_301_3@ );@H_301_3@@H_301_3@
@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ //Draw batched quads if VBO is full@H_301_3@@H_301_3@
drawBatchedQuads();@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@
@H_301_3@@H_301_3@
_batchedQuadCommands.push_back(cmd);@H_301_3@@H_301_3@
@H_301_3@@H_301_3@
memcpy(_quads + _numQuads,cmd->getQuads(),@H_301_3@@H_301_3@ sizeof@H_301_3@@H_301_3@ (@H_301_3@@H_301_3@ V3F_C4B_T2F_Quad@H_301_3@@H_301_3@ ) * cmd->getQuadCount());@H_301_3@@H_301_3@
convertToWorldCoordinates(_quads + _numQuads,cmd->getQuadCount(),cmd->getModelView());@H_301_3@@H_301_3@
@H_301_3@@H_301_3@
_numQuads += cmd->getQuadCount();@H_301_3@@H_301_3@

@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ else@H_301_3@@H_301_3@ if@H_301_3@@H_301_3@ (@H_301_3@@H_301_3@ RenderCommand@H_301_3@@H_301_3@ ::@H_301_3@@H_301_3@ Type@H_301_3@@H_301_3@ ::@H_301_3@@H_301_3@ GROUP_COMMAND@H_301_3@@H_301_3@ == commandType)@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
flush();@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ int@H_301_3@@H_301_3@ renderQueueID = ((@H_301_3@@H_301_3@ GroupCommand@H_301_3@@H_301_3@ *) command)->getRenderQueueID();@H_301_3@@H_301_3@
visitRenderQueue(_renderGroups[renderQueueID]);@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ else@H_301_3@@H_301_3@ if@H_301_3@@H_301_3@ (@H_301_3@@H_301_3@ RenderCommand@H_301_3@@H_301_3@ ::@H_301_3@@H_301_3@ Type@H_301_3@@H_301_3@ ::@H_301_3@@H_301_3@ CUSTOM_COMMAND@H_301_3@@H_301_3@ == commandType)@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
flush();@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ auto@H_301_3@@H_301_3@ cmd =@H_301_3@@H_301_3@ static_cast@H_301_3@@H_301_3@ <@H_301_3@@H_301_3@ CustomCommand@H_301_3@@H_301_3@ *>(command);@H_301_3@@H_301_3@
cmd->execute();@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ else@H_301_3@@H_301_3@ if@H_301_3@@H_301_3@ (@H_301_3@@H_301_3@ RenderCommand@H_301_3@@H_301_3@ ::@H_301_3@@H_301_3@ Type@H_301_3@@H_301_3@ ::@H_301_3@@H_301_3@ BATCH_COMMAND@H_301_3@@H_301_3@ == commandType)@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
flush();@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ auto@H_301_3@@H_301_3@ cmd =@H_301_3@@H_301_3@ static_cast@H_301_3@@H_301_3@ <@H_301_3@@H_301_3@ BatchCommand@H_301_3@@H_301_3@ *>(command);@H_301_3@@H_301_3@
cmd->execute();@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ else@H_301_3@@H_301_3@ if@H_301_3@@H_301_3@ (@H_301_3@@H_301_3@ RenderCommand@H_301_3@@H_301_3@ ::@H_301_3@@H_301_3@ Type@H_301_3@@H_301_3@ ::@H_301_3@@H_301_3@ MESH_COMMAND@H_301_3@@H_301_3@ == commandType)@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
flush();@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ auto@H_301_3@@H_301_3@ cmd =@H_301_3@@H_301_3@ static_cast@H_301_3@@H_301_3@ <@H_301_3@@H_301_3@ MeshCommand@H_301_3@@H_301_3@ *>(command);@H_301_3@@H_301_3@
cmd->execute();@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ else@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ CCLOGERROR@H_301_3@@H_301_3@ (@H_301_3@@H_301_3@ "Unknown commands in renderQueue"@H_301_3@@H_301_3@ );@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@
3.0之前是visit后就draw,而draw是真正的OpenGL操作。也就是说,每访问一个对象,先计算节点的渲染数据,然后马上渲染。
3.0也是在visit后就draw,但是draw并不进行OpenGL操作。3.0抽象了一个RenderCommand,在draw的时候其实是生成一个渲染命令,渲染命令其实就是对渲染所需要的数据的封装。RenderCommand作为基类,只包含了两个成员,一个是命令类型_type,这个很必要,正是靠这个来获取子类对象的具体类型的,这里没有用运行时类型,应该是考虑到效率;另一个是z深度_globalOrder,这个也很必要,渲染的时候必然要对节点排序,而z序是唯一的依据。
3.0包含了以下几个RenderCommand的子类:
1,CustomCommand:
顾名思义,是客户自定义的。
使用CustomCommand还有Layer,LableAtlas,LabelBMFont

2,QuadCommand:
和CustomCommand不同,这个类包含了很多属性:纹理_textureID,Program _shader,混合函数_blendType,定点数据_quad,模型视图矩阵_mv,还有一个材质属性_materialID。。
值得一提的是3.0主要是对QuadCommand进行了优化,实际上游戏中也大多数是这种情况。在Render::render()函数中,如果当前是QuadCommand,则顶点和Command放入数组,如果是其它,则先渲染此前的QuadCommand数组,然后再渲染当前命令。
使用CustomCommand命令的类有Sprite,ParticleSystemQuad,而Sprite应该是游戏中最常用的类,所以3.0的优化还是很有意义的。

3,BatchCommand
看名字就知道,BatchCommand是CCSpriteBatchNode的改进,而事实上,也的确是CCSpriteBatchNode和CCPaticleBatchNode使用了BatchCommand。BatchCommand的属性和QuadCommand很相似,不过没有了顶点数据_quad,变成了_textureAtlas,其渲染函数也和此前的差别不大,都是材质三剑客(shader,texutre,blend)

4,GroupCommand:
这是一个Command组合,但是GroupCommand只有一个属性_renderQueueID,而GroupCommand的所有子Command其实存放在Render中。GroupCommand像其它Command一样,存放在同一个队列中,遍历的时候,如果是GroupCommand,则获取其_renderQueueID,然后根据_renderQueueID找到指定的RenderCommand队列,进而渲染这个队列。可见,在Render中,可以包含多个Command队列,一些是根节点队列(没有父Command),其它的是指定ID的GroupCommand的子命令队列。
使用GroupCommand的主要有RenderTexture,因为RenderTexture包含了两次分隔的渲染操作,一次是begin(),一次是end()。


命令从哪里来的呢????
这个是刚刚的visit函数
void@H_301_3@@H_301_3@ @H_301_3@ Node@H_301_3@@H_301_3@ ::visit(@H_301_3@@H_301_3@ Renderer@H_301_3@@H_301_3@ *@H_301_3@@H_301_3@ renderer@H_301_3@@H_301_3@ ,@H_301_3@@H_301_3@ const@H_301_3@@H_301_3@ @H_301_3@@H_301_3@ Mat4@H_301_3@@H_301_3@ &@H_301_3@@H_301_3@ parentTransform@H_301_3@@H_301_3@ ,@H_301_3@@H_301_3@ bool@H_301_3@@H_301_3@ @H_301_3@ parentTransformUpdated@H_301_3@@H_301_3@ )@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ // quick return if not visible. children won't be drawn.@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ if@H_301_3@@H_301_3@ (!_visible)@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ return@H_301_3@@H_301_3@ ;@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@

@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ bool@H_301_3@@H_301_3@ dirty = _transformUpdated ||@H_301_3@@H_301_3@ parentTransformUpdated@H_301_3@@H_301_3@ ;@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ if@H_301_3@@H_301_3@ (dirty)@H_301_3@@H_301_3@
_modelViewTransform =@H_301_3@@H_301_3@ this@H_301_3@@H_301_3@ ->transform(@H_301_3@@H_301_3@ parentTransform@H_301_3@@H_301_3@ );@H_301_3@@H_301_3@
_transformUpdated =@H_301_3@@H_301_3@ false@H_301_3@@H_301_3@ ;@H_301_3@@H_301_3@

@H_301_3@@H_301_3@

@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ // IMPORTANT:@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ // To ease the migration to v3.0,we still support the Mat4 stack,@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ // but it is deprecated and your code should not rely on it@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ Director@H_301_3@@H_301_3@ * director =@H_301_3@@H_301_3@ Director@H_301_3@@H_301_3@ ::getInstance();@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ CCASSERT@H_301_3@@H_301_3@ (@H_301_3@@H_301_3@ nullptr@H_301_3@@H_301_3@ != director,@H_301_3@@H_301_3@ "Director is null when seting matrix stack"@H_301_3@@H_301_3@ );@H_301_3@@H_301_3@
director->pushMatrix(@H_301_3@@H_301_3@ MATRIX_STACK_TYPE@H_301_3@@H_301_3@ ::@H_301_3@@H_301_3@ MATRIX_STACK_MODELVIEW@H_301_3@@H_301_3@ );@H_301_3@@H_301_3@
director->loadMatrix(@H_301_3@@H_301_3@ MATRIX_STACK_TYPE@H_301_3@@H_301_3@ ::@H_301_3@@H_301_3@ MATRIX_STACK_MODELVIEW@H_301_3@@H_301_3@ ,_modelViewTransform);@H_301_3@@H_301_3@

@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ int@H_301_3@@H_301_3@ i = 0;@H_301_3@@H_301_3@

@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ if@H_301_3@@H_301_3@ (!_children.empty())@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
sortAllChildren();@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ // draw children zOrder < 0@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ for@H_301_3@@H_301_3@ ( ; i < _children.size(); i++ )@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ auto@H_301_3@@H_301_3@ node = _children.at(i);@H_301_3@@H_301_3@

@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ if@H_301_3@@H_301_3@ ( node && node->_localZOrder < 0 )@H_301_3@@H_301_3@
node->visit(@H_301_3@@H_301_3@ renderer@H_301_3@@H_301_3@ ,_modelViewTransform,dirty);@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ else@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ break@H_301_3@@H_301_3@ ;@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ // self draw@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ this@H_301_3@@H_301_3@ ->draw(@H_301_3@@H_301_3@ renderer@H_301_3@@H_301_3@ ,dirty);@H_301_3@@H_301_3@

@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ for@H_301_3@@H_301_3@ (@H_301_3@@H_301_3@ auto@H_301_3@@H_301_3@ it=_children.cbegin()+i; it != _children.cend(); ++it)@H_301_3@@H_301_3@
(*it)->visit(@H_301_3@@H_301_3@ renderer@H_301_3@@H_301_3@ ,dirty);@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ else@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ this@H_301_3@@H_301_3@ ->draw(@H_301_3@@H_301_3@ renderer@H_301_3@@H_301_3@ ,dirty);@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@

@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ // reset for next frame@H_301_3@@H_301_3@
_orderOfArrival = 0;@H_301_3@@H_301_3@
@H_301_3@@H_301_3@
director->popMatrix(@H_301_3@@H_301_3@ MATRIX_STACK_TYPE@H_301_3@@H_301_3@ ::@H_301_3@@H_301_3@ MATRIX_STACK_MODELVIEW@H_301_3@@H_301_3@ );@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@

@H_301_3@@H_301_3@

@H_301_3@@H_301_3@
看到源码如果没有儿子了 那么调用draw Node:draw是空的 因为node不画 画的是sprite这些@H_301_3@@H_301_3@
上面代码的这一句@H_301_3@@H_301_3@ this@H_301_3@@H_301_3@ ->draw(@H_301_3@@H_301_3@ renderer@H_301_3@@H_301_3@ ,dirty);@H_301_3@@H_301_3@

@H_301_3@@H_301_3@

@H_301_3@@H_301_3@
void@H_301_3@@H_301_3@ @H_301_3@ Sprite@H_301_3@@H_301_3@ ::draw(@H_301_3@@H_301_3@ Renderer@H_301_3@@H_301_3@ *@H_301_3@@H_301_3@ renderer@H_301_3@@H_301_3@ ,@H_301_3@@H_301_3@ const@H_301_3@@H_301_3@ @H_301_3@@H_301_3@ Mat4@H_301_3@@H_301_3@ &@H_301_3@@H_301_3@ transform@H_301_3@@H_301_3@ ,@H_301_3@@H_301_3@ bool@H_301_3@@H_301_3@ @H_301_3@ transformUpdated@H_301_3@@H_301_3@ )@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ // Don't do calculate the culling if the transform was not updated@H_301_3@@H_301_3@
_insideBounds =@H_301_3@@H_301_3@ transformUpdated@H_301_3@@H_301_3@ ?@H_301_3@@H_301_3@ renderer@H_301_3@@H_301_3@ ->checkVisibility(@H_301_3@@H_301_3@ transform@H_301_3@@H_301_3@ ,_contentSize) : _insideBounds;@H_301_3@@H_301_3@

@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ if@H_301_3@@H_301_3@ (_insideBounds)@H_301_3@@H_301_3@
{@H_301_3@@H_301_3@
_quadCommand.init(_globalZOrder,_texture->getName(),getGLProgramState(),_blendFunc,&_quad,1,@H_301_3@@H_301_3@ transform@H_301_3@@H_301_3@ );@H_301_3@@H_301_3@
@H_301_3@@H_301_3@ renderer@H_301_3@@H_301_3@ ->addCommand(&_quadCommand);@H_301_3@@H_301_3@
#if@H_301_3@@H_301_3@ @H_301_3@ CC_SPRITE_DEBUG_DRAW@H_301_3@@H_301_3@
_customDebugDrawCommand.init(_globalZOrder);@H_301_3@@H_301_3@
_customDebugDrawCommand.func = CC_CALLBACK_0(Sprite::drawDebugData,@H_301_3@@H_301_3@ this@H_301_3@@H_301_3@ );@H_301_3@@H_301_3@
renderer->addCommand(&_customDebugDrawCommand);@H_301_3@@H_301_3@
#endif@H_301_3@@H_301_3@ @H_301_3@ //CC_SPRITE_DEBUG_DRAW@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@
}@H_301_3@@H_301_3@
原文链接:https://www.f2er.com/cocos2dx/346955.html

猜你在找的Cocos2d-x相关文章