一个软件项目的最高级别的抽象
初始化:
init()
主循环:
while(1)
{
逻辑更新
图像更新
//帧率
}
结束:
destroy()
以上是最高层次的抽象,那么什么东西是逻辑,什么东西是图像。内存控制,帧率控制。这些都如何做到的呢。其实不难,随着分享的深入,其实我们才会慢慢的涉及到这些底层的问题。
很显然,在这个死循环中,执行的代码量越少,效率越高。这是一个基本的道理。
我们姑且把一款游戏的代码分成2部分,一部分在主循环内部,一部分在主循环外部。然后我们尽量在主循环内部放入简单高效的代码。
那么在主循环内部执行的代码,我们再分两部分,一部分长驻主循环内部,这部分代码一定要简单,高效。另一部分代码是根据需求,由外部模块动态的向主循环内部插入一些功能或者函数。
----------------------------------------------------------------------------------黄金分割线 以上是指导思想 哈哈--------------------------------------------------------------------------------------------------------------------------------------
先看下我们游戏的系统: 由于代码是从0开始设计,并未做更深入合理的划分,就是就目前状态而言
//增加外部逻辑 pDirector->setOutLogicForceUpdate(Out_Logic_Force_Update); (强制更新,每一帧都调用,即时cocos引擎暂停)
pDirector->setOutLogicUpdate(Out_Logic_Update);(如果cocos引擎暂停,这里就不会调用)
这部分,就是想引擎的主循环当中,插入了两个回调函数的指针。这是对cocos引擎本身扩展,以便于项目能够轻轻松松的想主循环中插入代码,
//垃圾回收系统初始化 CRecycleMgr::GetInst()->init();
这部分是垃圾回收系统,用于动态的回收一些纹理,临时数据结构,包含系统在一段时间内没有使用过的资源。它的update()写到了强制更新中,并给予设置帧率的功能,例如,可以使其在5帧调用一次,以后慢慢讨论这一块。
//时间控制系统 CTimeCtrl::GetInst()->init();
这部分就是在最上层来改变cocos引擎执行的时间片源,可以实现某一个动作突然变慢的功能。
//定时器系统 CTimerMgr::GetInst()->init();
这部分是定时器控制,和垃圾回收功能相似,比如每隔多少秒触发一次动画。
//屏幕适配 CScreenHelper::getInst()->init();
这部分就是来做UI层的屏幕适配,场景也有场景的适配方案。
//解表系统初始化 ClientConfigMgr::GetInst()->LoadGameConfig();
这部分是解析本地配表,客户端用到的很多配表。
//脚本系统初始化 CLuaManager::getInst()->init();
这部分是加载脚本部分。
//回调系统初始化 CCallBackMgr::GetInst()->init();
这部分主要是UI的回调部分,属于我们UI设计一大组成部分,需要慢慢详细去说。
//技能系统初始化 CSkillMgr::GetInst()->init();
这是技能系统。
//GUI系统初始化 CGuiMgr::GetInst()->init();
GUI系统
//特效系统初始化 CEffectMgr::GetInst()->init();
特效系统
//动画系统初始化 CSkeMgr::GetInst()->init();
动画系统
//分系统初始化 CSubSysMgr::GetInst()->init();
业务逻辑系统,与逻辑分系统
//声音系统初始化 CSoundMgr::GetInst()->init();
声音系统
//场景初始化 CSceneMgr::GetInst()->init();
场景系统
以上各个分系统都会慢慢的做分享。其实我们的整个系统设计,就像一棵大树,每个树枝都会散开下去,细化到树叶。