从本篇文章开始,将分析Cocos2d-x 3.0源代码,第一部分是从Cocos2d-x学习OpenGL,也就是分析Cocos2d-x 3.0的渲染代码,本篇首先介绍Cocos2d-x 3.0的渲染结构,使用的是3.0正式版。
分析的起点是mainLoop函数,这是在主线程里面会调用的循环,其中drawScene函数进行绘制。那么就进一步来看drawScene函数。
voidDirector::drawScene() { //计算间隔时间 calculateDeltaTime(); //如果间隔时间过小会被忽略 if(_deltaTime < FLT_EPSILON) { return; } //空函数,也许之后会有作用 if(_openGLView) { _openGLView->pollInputEvents(); } //非暂停状态 if(! _paused) { _scheduler->update(_deltaTime); _eventDispatcher->dispatchEvent(_eventAfterUpdate); } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //切换下一场景,必须放在逻辑后绘制前,否则会出bug if(_nextScene) { setNextScene(); } kmGLPushMatrix(); //创建单位矩阵 kmMat4 identity; kmMat4Identity(&identity); //绘制场景 if(_runningScene) { _runningScene->visit(_renderer,identity,false); _eventDispatcher->dispatchEvent(_eventAfterVisit); } //绘制观察节点,如果你需要在场景中设立观察节点,请调用摄像机的setNotificationNode函数 if(_notificationNode) { _notificationNode->visit(_renderer,false); } //绘制屏幕左下角的状态 if(_displayStats) { showStats(); } //渲染 _renderer->render(); //渲染后 _eventDispatcher->dispatchEvent(_eventAfterDraw); kmGLPopMatrix(); _totalFrames++; if(_openGLView) { _openGLView->swapBuffers(); } //计算绘制时间 if(_displayStats) { calculateMPF(); } }