关于cocos2d-x 3.3 的渲染问题


// Draw the Scene
void Director::drawScene()
{
// calculate “global” dt
calculateDeltaTime();

// skip one flame when _deltaTime equal to zero.
if(_deltaTime < FLT_EPSILON)
{
    return;
}


if (_openGLView)
{
    _openGLView->pollEvents();
}


//tick before glClear: issue #533
if (! _paused)
{
    _scheduler->update(_deltaTime);
    _eventDispatcher->dispatchEvent(_eventAfterUpdate);
}


glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


/* to avoid flickr, nextScene MUST be here: after tick and before draw.
 * FIXME: Which bug is this one. It seems that it can't be reproduced with v0.9
 */
if (_nextScene)
{
    setNextScene();
}


pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);

if (_runningScene)
{
    //clear draw stats
    _renderer->clearDrawStats();

    //render the scene
    _runningScene->render(_renderer);

    _eventDispatcher->dispatchEvent(_eventAfterVisit);
}


// draw the notifications node
if (_notificationNode)
{
    _notificationNode->visit(_renderer, Mat4::IDENTITY, 0);
}


if (_displayStats)
{
    showStats();
}
_renderer->render();  


_eventDispatcher->dispatchEvent(_eventAfterDraw);


popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);


_totalFrames++;


// swap buffers
if (_openGLView)
{
    _openGLView->swapBuffers();
}


if (_displayStats)
{
    calculateMPF();
}

}

上面的红色部分对游戏场景进行了一次渲染

但是绿色部分的代码如下:

void Scene::render(Renderer* renderer)
{
auto director = Director::getInstance();
Camera* defaultCamera = nullptr;
for (const auto& camera : _cameras)
{
Camera::_visitingCamera = camera;
if (Camera::_visitingCamera->getCameraFlag() == CameraFlag::DEFAULT)
{
defaultCamera = Camera::_visitingCamera;
continue;
}

    director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);
    director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, Camera::_visitingCamera->getViewProjectionMatrix());

    //visit the scene
    visit(renderer, Mat4::IDENTITY, 0);
    renderer->render();

    director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);
}
//draw with default camera
if (defaultCamera)
{
    Camera::_visitingCamera = defaultCamera;
    director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);
    director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, Camera::_visitingCamera->getViewProjectionMatrix());

    //visit the scene
    visit(renderer, Mat4::IDENTITY, 0);
    renderer->render();

    director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);
}
Camera::_visitingCamera = nullptr;

}

也进行了一次渲染

自己测试将最上面的_renderer->render();部分注释掉,也可以正常渲染

什么要这样设计,是否有重复渲染?之前的3.0版本没有这个问题。

不是有个continue么