Creator底层的主要逻辑其实只说三个词就可以了:
1.节点树
2.帧循环
3.组件化
一.节点树
我们看到的游戏中的全部的界面就是一个节点树。我们新建场景的时候,都是一个Scene,每个Scene下一个Canvas。一个canvas有n个node。每个node还有n个child。这样就组成了一个树状结构的节点树。
每一个节点包括canvas本身也是一个节点,都可以有n个Component组件。
而我们开发游戏,其实就是操作这些节点,然后通过Creator内置的Component和我们自己写的Component来完善这个节点树系统。
节点树视图:

二.帧循环
我们可以在安装环境那边找一下Creator的源码,以我的引擎版本2.3.4为例,我的CocosDashboard安装在d盘。
那Creator目录就在D:\CocosDashboard_1.0.8\resources.editors\Creator\2.3.4。
看一下这个文件夹下的resources文件夹:

cocos2d-x是引擎c++代码的位置。是一个cocos creator板定制的cocos2dx。原生底层的代码都在这里。
engine是js引擎所在的位置。我们游戏里的各种组件,button,label的源码都在这里面可以找到。需要定制修改引擎就是修改这2个文件夹内的东西。
找一下engine\cocos2d\core里的CCDirector.js文件。这个就是的cc.director的源码。
mainLoop方法就是Creator的主线程循环。
每一次循环的步骤:
1.派发EVENT_BEFORE_UPDATE事件
2.调用Component的startPhase去初始化一些新创建的节点的Comonpent和节点新加的Comonpent。
3.调用Component的update
4.调用scheduler的update
5.调用Component的lateUpdate
6.执行ComponentScheduler的clearup做一些清理工作
7.派发EVENT_AFTER_UPDATE事件
8.销毁一些destroy的obj
9.派发EVENT_BEFORE_DRAW事件
10.render渲染
11.派发EVENT_AFTER_DRAW事件
游戏运行过程中,就是不断重复这个步骤。
帧循环和节点树,以及节点的组件组成了我们全部的游戏世界。我们全部的编程工作也都是围绕着着这些进行的。
同时如果理清楚了这些东西,那在我们设计游戏系统的时候,也会有一个更清晰的思维。
怎么基于creator更合适的设计一些系统。
组件Component:
Component的生命周期:

onLoad
当附加到一个激活的节点上或者其节点第一次激活时候调用。如果一个节点active默认是false,那么创建的时候是不会调用Component的onLoad的。
start
如果该组件第一次启用,则在所有组件的 update 之前调用。如果节点active为true但Component没被启用不会被调用。之后启用的时候才会被调用。
onEnable
当该组件被启用,并且它的节点也激活时。
onDisable
当该组件被禁用或节点变为无效时调用。
onDestroy
当该组件被销毁时调用
update
如果该组件启用,则每帧调用 update。
参考:
https://docs.cocos.com/creator/api/zh/classes/Component.html#onenable
编程中就都是基于这些事件回调来处理逻辑。
单线程:
需要提一下,Creator的js部分是封装了一个node.js。
我们知道,creator的js引擎集成了Node.js引擎。很多node.js的东西是可以在写代码过程中直接使用的。但同时也意味继承了node.js的一些可能会影响我们编程经验的东西,比如node.js的单线程。所以Creator也是单线程的。
在creator中处理一些需要多线程的业务逻辑就比较麻烦。
这里如果有需要一些复杂运算会卡住主线程,从到导致卡顿的,推荐用update分帧处理。
比如同时创建很多节点会卡顿。可以选择通过update回调,每帧创建一个节点。
或者需要执行一些逻辑复杂的运算,也可以先把逻辑分步,每帧执行一部分。
而一些涉及到大文件拷贝这些原生操作的问题。其实还有另外一个解决方案。
就是通过定制引擎c++多线程来解决。
思路大概是这样:
1.js在主线程调用c++代码。
2.C++跨线程处理业务逻辑。
3.C++处理完成之后在主线程中回调js代码告诉js处理结果。
一些网络编程tcp/udp需要用到c++,或者需要多线程来处理的,其实都是这个逻辑。
欢迎关注公众号:creator小玉米

或者加入qq群一起交流。群号:1093612606

