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