当先锋百科网

首页 1 2 3 4 5 6 7

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


layoutSubviews在以下情况下会被调用:

1、init初始化不会触发layoutSubviews
2、addSubview会触发layoutSubviews
3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
4、滚动一个UIScrollView会触发layoutSubviews
5、旋转Screen会触发父UIView上的layoutSubviews事件
6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

- (void) layoutSubviews
{
    [renderer_resizeFromLayer:(CAEAGLLayer*)self.layer];
    // ... ...
    cocos2d::Director::getInstance()->drawScene();
}


 通过代码可以看到,这些条件也调用了drawScene(),我们来一行一行来读懂这些代码含义

void Director::drawScene()
{
    // calculate "global" dt,计算_deltaTime的值,即上一次渲染和这一次渲染的时间间隔
    calculateDeltaTime();
    
    // skip one flame when _deltaTime equal to zero. 时间间隔等于0忽悠
    if(_deltaTime < FLT_EPSILON)
    {
        return;
    }

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

    //tick before glClear: issue #533
    if (! _paused)
    {
        // 调用定时器
        _scheduler->update(_deltaTime);
        // clang++ -std=c++11 1.cpp 这个函数中用了lamda表达式
        // 对cocos2dx 3.0 event不明白的请看
        // http://blog.csdn.net/star530/article/details/18325493
        _eventDispatcher->dispatchEvent(_eventAfterUpdate);
    }

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    /* to avoid flickr, nextScene MUST be here: after tick and before draw.
     XXX: Which bug is this one. It seems that it can't be reproduced with v0.9 */
    if (_nextScene)
    {
        // 只有调用pushScene或replaceScene才会触发该函数
        // 旧的scene release onExit, 新的 retain onEnter
        setNextScene();
    }
    // 参考http://blog.csdn.net/carl_zhong/article/details/12321703
    kmGLPushMatrix();

    // global identity matrix is needed... come on kazmath!
    kmMat4 identity;
    kmMat4Identity(&identity);

    // draw the scene
    if (_runningScene)
    {
        
        // 渲染
        _runningScene->visit(_renderer, identity, false);
        // 
        _eventDispatcher->dispatchEvent(_eventAfterVisit);
    }

    // draw the notifications(通知) node
    if (_notificationNode)
    {
        _notificationNode->visit(_renderer, identity, false);
    }

    if (_displayStats)
    {
        showStats();
    }
    // 渲染、后面会重点研究
    _renderer->render();
    _eventDispatcher->dispatchEvent(_eventAfterDraw);

    kmGLPopMatrix();

    _totalFrames++;

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

    if (_displayStats)
    {
        // 计算帧数
        calculateMPF();
    }
}

   

cocos2dx 2.0.4 的实现为

   

// calculate "global" dt
    calculateDeltaTime();


    //tick before glClear: issue #533
    if (! m_bPaused)
    {
        m_pScheduler->update(m_fDeltaTime);
    }


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    if (m_pNextScene)
    {   
        setNextScene();
    }   


    kmGLPushMatrix();


    // draw the scene
    if (m_pRunningScene)
    {   
        m_pRunningScene->visit();
    }   


    // draw the notifications node
    if (m_pNotificationNode)
    {   
        m_pNotificationNode->visit();
    }   
        
    if (m_bDisplayStats)
    {   
        showStats();
    }   


    kmGLPopMatrix();


    m_uTotalFrames++;


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


    if (m_bDisplayStats)
    {
        calculateMPF();
    }

可见3.0版本在这个函数上引入了3个事件

_eventAfterUpdate
_eventAfterVisit
_eventAfterDraw