Cocos2dx-3.2 引擎学习(二)之Director

Director,导演类。

首先是在CCDirector.cpp文件中看到:

static DisplayLinkDirector *s_SharedDirector = nullptr;

确定了Director的单例模式设计原则。

DisplayLinkDirector,这个继承自Director。用来同步Timer,刷新屏幕

单例模式的设计精髓:

Director* Director::getInstance()
{
  if (!s_SharedDirector)    //当director实例不存的时候,创建之
  {
    s_SharedDirector = new (std::nothrow) DisplayLinkDirector();
    CCASSERT(s_SharedDirector, "FATAL: Not enough memory");
    s_SharedDirector->init();
  }

  return s_SharedDirector;
}

Director::init()方法:

设置程序运行默认值,包括FPS,是否显示FPS,GL Projection,Pixel Format等。

场景指针的初始化nullptr。

四个重要的事件回调:

const char *Director::EVENT_PROJECTION_CHANGED = "director_projection_changed";
const char *Director::EVENT_AFTER_DRAW = "director_after_draw";
const char *Director::EVENT_AFTER_VISIT = "director_after_visit";
const char *Director::EVENT_AFTER_UPDATE = "director_after_update";

initTextureCache();    
initMatrixStack();  //初始化场景栈,投影栈,纹理栈

然后是重要的mainLoop函数,它是每帧都会调用的,原因可以看这里:XXOO

void DisplayLinkDirector::mainLoop()
{
    if (_purgeDirectorInNextLoop)  //回收销毁
    {
        _purgeDirectorInNextLoop = false;
        purgeDirector();
    }
    else if (! _invalid)   //执行渲染,Scheduler的操作
    {
        drawScene();
     
        // release the objects
        PoolManager::getInstance()->getCurrentPool()->clear();
    }
}

从上面的函数,知道每帧都会调用drawScene函数。

drawScene函数是cocos2dx引擎的大心脏!!!

里面的函数功能都是非常的重要的!(代码很长也要全部贴出来)瞻仰一下:

 1 // Draw the Scene
 2 void Director::drawScene()
 3 {
 4     // calculate "global" dt
 5     calculateDeltaTime();
 6     
 7     // skip one flame when _deltaTime equal to zero.
 8     if(_deltaTime < FLT_EPSILON)
 9     {
10         return;
11     }
12 
13     if (_openGLView)
14     {
15         _openGLView->pollInputEvents();
16     }
17 
18     //tick before glClear: issue #533
19     if (! _paused)
20     {
21         _scheduler->update(_deltaTime);   //Scheduler调用的主开关,驱动着程序的Scheduler的执行。【重要】
22         _eventDispatcher->dispatchEvent(_eventAfterUpdate);
23     }
24 
25     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
26 
27     /* to avoid flickr, nextScene MUST be here: after tick and before draw.
28      XXX: Which bug is this one. It seems that it can't be reproduced with v0.9 */
29     if (_nextScene)
30     {
31         setNextScene();
32     }
33 
34     pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
35 
36     // draw the scene,场景绘制完以后,分发事件_eventAfterVisit
37     if (_runningScene)
38     {
39         _runningScene->visit(_renderer, Mat4::IDENTITY, false);
40         _eventDispatcher->dispatchEvent(_eventAfterVisit);
41     }
42 
43     // draw the notifications node
44     if (_notificationNode)
45     {
46         _notificationNode->visit(_renderer, Mat4::IDENTITY, false);
47     }
48 
49     if (_displayStats)  //游戏运行FPS等参数显示开关
50     {
51         showStats();
52     }
53 
54     _renderer->render();
55     _eventDispatcher->dispatchEvent(_eventAfterDraw);
56 
57     popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
58 
59     _totalFrames++;
60 
61     // swap buffers
62     if (_openGLView)
63     {
64         _openGLView->swapBuffers();
65     }
66 
67     if (_displayStats)
68     {
69         calculateMPF();
70     }
71 }

内容还有很多,随着后面的学习,定有补充,TODO....

原文地址:https://www.cnblogs.com/vokie/p/4004814.html