从本篇文章开始,将分析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();
- }
- }