Director 导演类, 这个类在整个引擎中担当着最重要的角色, 先看看它是如何初始化的,它共管理了哪些内容呢? 
 
1初始化- 更新处理Scheduler
 
Scheduler 这个类负责用户自定义的更新函数的调用, 或游戏对象的update(float dt)的调用。 像经常调用的schedule() 或scheduleUpdate() 就是这个类来负责处理的。
 
见下面的代码, 就是程序中如何使用schedule。 具体如何处理, 在后面的还会进行展开。 这块可以单拿出一章来介绍一下了。 
 
   this->schedule(schedule_selector(HelloWorld::update), );  
 
2初始化- 事件管理 EventDispatcher 
 
EventDispatcher 这个类负责整个系统的事件处理,如用户自定义事件, 触摸事件,等都由这个类来负责。 
 
现在我们知道,它是在这里申明即可, 具体在哪里进行调用, 事件的实现原理, 也会在一章内进行展开。 
 
下面定义了几种不同的事件,为后面相应的事件触发时作为参数调用及触发事件。 
 
 _eventDispatcher = new (std::nothrow) EventDispatcher();
_eventAfterDraw = new (std::nothrow) EventCustom(EVENT_AFTER_DRAW);
_eventAfterDraw->setUserData(this);
_eventAfterVisit = new (std::nothrow) EventCustom(EVENT_AFTER_VISIT);
_eventAfterVisit->setUserData(this);
_eventAfterUpdate = new (std::nothrow) EventCustom(EVENT_AFTER_UPDATE);
_eventAfterUpdate->setUserData(this);
_eventProjectionChanged = new (std::nothrow) EventCustom(EVENT_PROJECTION_CHANGED);
_eventProjectionChanged->setUserData(this);
3初始化纹理缓存TextureCache
 
TextureCache 纹理缓存,进行纹理处理, 重量级类, 在后面展开。 

initTextureCache();

void Director::initTextureCache()
{
#ifdef EMSCRIPTEN
_textureCache = new (std::nothrow) TextureCacheEmscripten();
#else
_textureCache = new (std::nothrow) TextureCache();
#endif // EMSCRIPTEN
}
4 初始化矩阵OpenGLES用到initMatrixStack();
 
矩阵,OpenGLES转换坐标时用到的,一个坐标的计算方式: 投影矩阵 × 视图矩阵 × 模型矩阵 × 3D位置
1 _modelViewMatrixStack 模型矩阵
2 _projectionMatrixStack 视图投影矩阵
3 _textureMatrixStack 纹理矩阵, 这个做什么用的, 我还没深入看, 后面再说。  
 
 _modelViewMatrixStack.push(Mat4::IDENTITY);
_projectionMatrixStack.push(Mat4::IDENTITY);
_textureMatrixStack.push(Mat4::IDENTITY);
5 初始化Render
 
渲染, 这个渲染有的说, 现在我们知道通过它调用 我们真正的OpenGL 渲染命令。
 
这个类设计了一个渲染队列RenderQueue(先简化点认为就一个吧),用户的渲染请求, 自定义的也好, 系统的也好, 都被封装成为了渲染命令加入到这个渲染队列队列中。 
 
 这个类设计的也很有意思,做了很多的优化设计。 后面详细说它。 

_renderer = new (std::nothrow) Renderer;

Renderer::Renderer()
:_lastMaterialID()
,_lastBatchedMeshCommand(nullptr)
,_filledVertex()
,_filledIndex()
,_numberQuads()
,_glViewAssigned(false)
,_isRendering(false)
#if CC_ENABLE_CACHE_TEXTURE_DATA
,_cacheTextureListener(nullptr)
#endif
{
_groupCommandManager = new (std::nothrow) GroupCommandManager();
_commandGroupStack.push(DEFAULT_RENDER_QUEUE); RenderQueue defaultRenderQueue;
_renderGroups.push_back(defaultRenderQueue);
_batchedCommands.reserve(BATCH_QUADCOMMAND_RESEVER_SIZE);
}
 
总结一下:
 
可以看到,更新函数处理,事件处理,纹理缓存,渲染都已经在这个类中初始化了,也在这个类对外提供调用,Director还是一个单例类。 而runScene() 是如何处理的呢?后面跟上。 
 
 

2 cocos2dx 3.0 源码分析-Director的更多相关文章

  1. 3 cocos2dx 3.0 源码分析-mainLoop详细

    简述:   我靠上面图是不是太大了, 有点看不清了.  总结一下过程: 之前说过的appController 之后经过了若干初始化, 最后调用了displayLinker 的定时调用, 这里调用了函数 ...

  2. 5 cocos2dx 3.0源码分析 渲染 render

    渲染,感觉这个挺重要了,这里代入一个简单的例子 Sprite 建立及到最后的画在屏幕上, 我们描述一下这个渲染的流程:   1 sprite 初始化(纹理, 坐标,及当前元素的坐标大小信息) 2 主循 ...

  3. 4 cocos2dx 3.0 源码分析- scheduler

    scheduler 这个类, 负责了引擎的自定义更新, 及定时更新相关的操作, 看看下面的代码,很熟悉吧.   schedule(schedule_selector(HelloWorld::updat ...

  4. AFNetWorking3.0源码分析

    分析: AFNetWorking(3.0)源码分析(一)——基本框架 AFNetworking源码解析 AFNetworking2.0源码解析<一> end

  5. Solr5.0源码分析-SolrDispatchFilter

    年初,公司开发法律行业的搜索引擎.当时,我作为整个系统的核心成员,选择solr,并在solr根据我们的要求做了相应的二次开发.但是,对solr的还没有进行认真仔细的研究.最近,事情比较清闲,翻翻sol ...

  6. Solr4.8.0源码分析(25)之SolrCloud的Split流程

    Solr4.8.0源码分析(25)之SolrCloud的Split流程(一) 题记:昨天有位网友问我SolrCloud的split的机制是如何的,这个还真不知道,所以今天抽空去看了Split的原理,大 ...

  7. Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五)

    Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五) 题记:关于SolrCloud的Recovery策略已经写了四篇了,这篇应该是系统介绍Recovery策略的最后一篇了 ...

  8. Solr4.8.0源码分析(23)之SolrCloud的Recovery策略(四)

    Solr4.8.0源码分析(23)之SolrCloud的Recovery策略(四) 题记:本来计划的SolrCloud的Recovery策略的文章是3篇的,但是没想到Recovery的内容蛮多的,前面 ...

  9. Solr4.8.0源码分析(22)之SolrCloud的Recovery策略(三)

    Solr4.8.0源码分析(22)之SolrCloud的Recovery策略(三) 本文是SolrCloud的Recovery策略系列的第三篇文章,前面两篇主要介绍了Recovery的总体流程,以及P ...

随机推荐

  1. 【C#】字段总结

    前沿: 字段(field)是一种数据成员,其中容纳了一个值类型的实例或者一个引用类型的引用. 正文: CLR支持类型(静态)字段和实例(非静态)字段.对于类型字段,用于容纳字段数据的动态内存是在类型对 ...

  2. 微信开发(一)SAE环境搭建

    登录新浪sae平台,点击sae 点击创建新应用->继续创建 环境选择: 填好后点击创建应用 点击创建版本 点击链接可以访问,点击编辑代码可以在线编辑,代码上传可以是svn,git,可以在线上传 ...

  3. Python类总结-字段,方法,属性区别及StaticMethod, Property,私有字段和私有属性

    类包含下列 静态属性 动态属性 静态方法 动态方法 class Province: #静态字段--属于类,调用方法类.字段名 memo = "中国23个省之一" #动态字段--属于 ...

  4. C51中的xdata

    今天在写公司芯片对应的.H文件时,在定义寄存器的时候出现一个问题. 我们芯片的寄存器地址是定义在片外RAM区的,不能使用sfr这样的关键字来进行定义. 后来查阅了对应的资料才发现定义寄存器有很多种方法 ...

  5. 2018IEEE冬季生物识别学校 5天课程

    里边有很多介绍及相关报告的PPT https://www.comp.hkbu.edu.hk/wsb18/index.php https://www.comp.hkbu.edu.hk/wsb18/pro ...

  6. 【UOJ 80】 二分图最大权匹配

    [分析] 之前打的那种KM会TLE... why??明明说n^3的啊? #include<cstdio> #include<cstdlib> #include<cstri ...

  7. Python基础篇:从0开始学python

    目录 数据类型 基本数据类型 整形Int的内置方法 字符串Str的内置方法 列表(待补充) 流程控制 分支结构if...else... for循环 循环控制 while循环 函数 函数的名称与格式 参 ...

  8. vijos Warcraft III 守望者的烦恼

    题解 转移方程好写吧 一个一维递推式 然后我们可以构造矩阵优化 嗯,最近学一下递推优化 代码 #include<cstdio> #include<cstring> #inclu ...

  9. 【主席树】BZOJ3524-[Poi2014]Couriers

    [题目大意] 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. [思路 ...

  10. dcoker常用命令

    记录一下常用的命令 docker run -t -i  xxxx /bin/bash 运行容器的交互会话shell docker start xxxx 启动容器 docker stop xxxx 停止 ...