PS:只是看源码学习过程中把认为重要的内容以笔记的形式记录下来。
【1】config:当前游戏的一些配置
1.debugMode:用于控制输出日志的级别
2.showFPS:是否显示FPS
3.exposeClassName
4.frameRate:设置游戏帧率
5.id
6.renderMode:使用canvas渲染还是使用WebGL渲染(简单理解:WebGL能实现高效的3D渲染、支持多平台,通过各种着色器实现各种效果交互比较灵活等多种优势,但WebGL学习成本比较高)
这个对象不能直接修改,如果要修改其参数,可以使用CCGame类内部开出来的接口,如setFrameRate等方式来设置。
【2】_paused:是否暂停主循环
相比较于cc.director.pause暂停游戏逻辑,此处暂停主循环会暂停的更加彻底,他会暂停游戏逻辑、渲染、事件处理、背景音乐等。
【3】restart:重启游戏
在一帧渲染结束后,取消常驻节点,销毁当前运行的scene,清理audio,停止主循环,初始化内置资源后调用game.onStart(),重启游戏。
【4】end:退出游戏
调用close()退出游戏,暂时还不知道这个close调的是哪里……怀疑是各平台里面的方法……
【5】on():注册game的特定事件回调,如:EVENT_RESTART、EVENT_GAME_INITED等等,具体可以看看CCGame内部定义了哪些事件。
【6】once():基本同on一样,区别只在于此函数只会通知一次。
【7】run():启动游戏引擎
设置config配置参数,设置onStart函数(在重启时还会用到),然后调用prepare()准备引擎。
准备引擎的过程大致如下:
1._loadPreviewScript:加载项目预览代码。
2._initRenderer:初始化render。
3._initEvents:初始化消息分发系统,设置了进入后台时暂停主循环,回到前台时恢复主循环。
4._setAnimFrame:根据config的帧率参数设置游戏相关帧率。
5.builtins.init:初始化游戏内置资源。
6._runMainLoop:开始执行游戏的主循环了,具体原理是通过每次屏幕刷新时,就调用一次主循环对整个游戏进行一次刷新。此处是通过调用window.requestAnimFrame(callback)来实现,此函数会在浏览器每次重绘之前调用,我们就利用此函数实现游戏主循环了。然后在内部的callback里面再调用CCDirector的mainLoop实现游戏的主循环。附带说明一下,不同平台可能实现主循环依赖的函数有所不同,如:
浏览器:window.requestAnimFrame
android:GLSurfaceView下的onDrawFrame
ios:CADisplayLink
三者原理上都是通过在屏幕刷新时会有回调通知,只要把主循环放在回调里面,就可以实现每次屏幕刷新都调用主循环函数,从而实现游戏的主循环。
以上就是游戏引擎准备的全过程了,在整个过程中间的某些步骤会有消息通知,监听这些消息就可以在这些步骤中间插入你需要的代码了。
【8】_persistRootNodes:常驻节点
addPersistRootNode():加入常驻节点,会调用_addPersistNodeRef对加入常驻节点的node内部所有子节点和组件进行addRef()引用计数加1.
removePersistRootNode():移出常驻节点,会调用_removePersistNodeRef进行引用计数减1.
isPersistRootNode():查询是否常驻节点。
常驻节点具体实现原理:用_persistRootNodes数组保存所有常驻节点,然后把常驻节点的父节点指向当前运行的runingScene,当切换场景时(由于加入常驻节点时引用计数已经加1了,所以场景切换也不会释放资源),再把常驻节点的父节点指向新场景中,达到场景切换,常驻节点的内容依然存在的目的。
题外话:此处常驻节点的处理和cocos2dx的处理方式可是不太相同了,cocos2dx源码内部的处理方式,常驻节点时独立于场景之外的,在进行渲染时,会先render runningScene,接着再对_notificationNode(全局节点)进行渲染的。