• 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....

  • 相关阅读:
    Java性能总结一(转)
    Java性能总结三(转)
    Java性能总结二(转)
    Jsp设计第三版文摘
    java配置错误记录
    PatternsInJava文摘
    Java性能总结四(转)
    Spring+Struts+Hibernate 简介(转)
    baidu c++吧上的一道题
    IT公司笔试题总结(三)
  • 原文地址:https://www.cnblogs.com/vokie/p/4004814.html
Copyright © 2020-2023  润新知