cocos2dx源码分析:组渲染指令GroupCommand

一个GroupCommand可以产生一个新的渲染队列,当GroupCommand对象创建时,他会去渲染器Renderer里面申请一个渲染队列,并取得渲染队列的id,这个id就是渲染队列在渲染组_renderGroups中的下标

GroupCommand::GroupCommand()
{
    _type = RenderCommand::Type::GROUP_COMMAND;
    /*申请一个渲染队列id*/
    _renderQueueID = Director::getInstance()->getRenderer()->getGroupCommandManager()->getGroupID();
}
int GroupCommandManager::getGroupID()
{
    //Reuse old id
    /*优先尝试使用旧的id*/
    if (!_unusedIDs.empty())
    {
        int groupID = *_unusedIDs.rbegin();
        _unusedIDs.pop_back();
        _groupMapping[groupID] = true;
        return groupID;
    }

    //Create new ID
//    int newID = _groupMapping.size();
    /*在渲染器中创建一个新的渲染队列,并返回队列id*/
    int newID = Director::getInstance()->getRenderer()->createRenderQueue();
    _groupMapping[newID] = true;

    return newID;
}
int Renderer::createRenderQueue()
{
    /*创建一个渲染队列,返回渲染队列的下标*/
    RenderQueue newRenderQueue;
    _renderGroups.push_back(newRenderQueue);
    return (int)_renderGroups.size() - 1;
}

当要像这个渲染组添加渲染对象时,先把组渲染指令添加到默认渲染队列中,然后将这个组设置到渲染器中的渲染组队列的栈顶,然后添加渲染对象,添加完毕后从栈顶移除这个组

    /*添加组渲染指令*/
    renderer->addCommand(&_spriteWrapperCommand);
    /*将当前组置为栈顶*/
    renderer->pushGroup(_spriteWrapperCommand.getRenderQueueID());
    /*添加渲染对象*/
    Sprite::draw(renderer, transform, flags);
    /*从栈顶移除*/
    renderer->popGroup();

当处理组渲染指令时,可以通过组的渲染队列id找到渲染队列,然后处理这个渲染队列,这是一个递归渲染的过程。

    else if(RenderCommand::Type::GROUP_COMMAND == commandType)
    {
        flush();
        int renderQueueID = ((GroupCommand*) command)->getRenderQueueID();
        visitRenderQueue(_renderGroups[renderQueueID]);
    }

你可能感兴趣的:(cocos2d-x)