cocoscreator新项目的框架和资源的简单记录
随着cocoscreator的不断成熟和稳定,我们去年就开始往这方面做h5游戏。这里简单记录一下新项目的框架和h5游戏资源优化的一些内容。
新项目用的是MVC的基础框架,逻辑视图控制器的分离使整个项目耦合性低重用性高利于维护,但是在实际的工作过程中能明显感受到比之前的规范多一点,写起来用的时间多一点,还有一点就是,新人或者同事间工作交接的时间成本增加。
creator模仿的Unity那一套,之前习惯了挂脚本挂组件,然后叫过去写原生2dx,慢慢习惯了纯代码编写,然后现在回来写creator刚开始又有点不习惯了,不过现在还好,已经开始有了封装组件的习惯,美术能分走一大堆工作量。
下面是简单画了一下的应用层架构图,基本架构都差不多:
从原生2dx转过来,最大的感触是h5游戏对性能和资源优化的要求更高了。基于网页游戏的特性,为创造流畅的用户体验出发,一般的项目都会采用按需加载模块的方式。比如说刚进入游戏是进入主城,那只需要加载主城模块和配套的资源就可以了,如果再打开了武将界面,我们再按照同样的逻辑加载武将模块和武将配套的资源。
对于pc或app级的应用来说,这样好像就可以了。但在实际测试结果告诉我,h5游戏,处于资源受限的环境中,仅仅是这样是完全不够的。顺着上面的思路,如果我们打开了10个界面后,可能就会发现游戏就崩了,原因是内存占用累计到一定程度,手机系统或者浏览器就会重启或者杀掉游戏进程。这个内存占用,跟以往的C++内存相比,也存在更不利的因素,C++内存是你逻辑占了多少就是多少,而这个h5的内存,我举个例子来说明:比如js对象实际占用了100M内存,会保留130M的内存,再加上js解析器、加上包装的应用程序、再加上手机是没有独立显卡的,所有内存加一起,可能是300M,而根据实际测试的结果,如果最终的内存占用达到500M左右,就容易出现崩溃的情况。
总结为一句话,内存要尽可能的省着用,否则功能累计多了,改起来很麻烦。
再想想上面的问题怎么解决,能解决问题的方法不止一种。我建议是按照一种简单优雅的方式去解决它。这个方案由2个要求组成:
1、 模块的静态内容尽可能保持简洁,实际内存占用不能超过200k。(所谓的静态模块指的是直接做在预设里面的部分,这个部分会全部加载完成之后,界面才显示出来)
2、 动态内容进行动态、按需的创建,并在模块隐藏后销毁。(这个部分是异步的,比如说,我们一个角色的界面,在预设中做好了布局,具体显示哪个角色,动态加载)
这样做会带来以下3个方面的好处:
1、 界面加载和反应快,用户体验好
2、 内存运行的峰值不会堆积,运行性能好
3、 逻辑清晰,容易控制、容易进行问题排查
在实现的时候,就有对应的注意点,也进行说明:
主要是动态内容的加载和释放,而这部分内容是在模块对象里面实现的。模块对象有几个生命周期函数与此相关。分别是onLoad、onDestroy、onEnable、onDisable。有些新人因为看了ccc的例子,习惯把初始化的东西全部放在onLoad,也会容易忽视onDestroy和onDisable,更容易混淆后面2者。所以要在这里重点进行说明:
onLoad:注意!它只会调用一次,这里只适合初始化一些静态的资源,比如配置文件
onDestroy:这个跟onLoad对应的释放函数,模块被彻底释放才会调用,比如释放静态资源
onEnable:动态创建的东西放到这里!
onDisable:动态创建的东西在这里释放!跟onEnable对应的释放函数。
还有一些动态创建的资源是通过收到服务器回包触发的,也要记得在onDisable里释放资源