基于Cocos2d的MMORPG开发经验

此次跟你们分享的是《基于Cocos2d-x的回合MMORPG开发经验》,咱们主要是以LUAC++来开发项目,使用二者的缘由之一是LUAC++语法简单,而且LUA开发稳定性好,不容易形成崩溃,并且它支持在线更新的机制。用LUA开发的话,逻辑代码和资源文件会比较好,这个优势在多平台运营的时候很明显。由于你更新了一个软件以后,须要先下载平台,这个时候若是用其余软件编辑会致使全部的数据不同。这个模式的第二个优势就是出现逻辑错误之后咱们能够将错误的信息从玩家处收回来,进行错误信息的搜集。第三个优势是内存垃圾回收,以往C++内存垃圾回收是很麻烦的,用LUA的话,你只要可以按时去清除变量,基本上不须要去担忧内存的使用状况。所以LUA在脚本里面的使用算是比较好的。 前端

 

不过这种模式也会有一些问题,好比说游戏启动时须要加载LUA文件,像现阶段须要加载500多个LUA文件,这是个很头痛的事情,可是不得不加载。加载LUA文件是须要必定时间的,现阶段大概须要10秒钟,总体的效率要比C++低,毕竟是脚本语言,仍是有一些能够优化的方案。咱们如今采用的方式是把复杂数学计算的逻辑都放在Cocos2d-x引擎层,用C以及C++来实现。对于须要灵活可变、利于开发维护的逻辑宜放在脚本层里面处理,这样就增长了灵活性。须要注意一点就是LUAC之间的穿越对性能有必定的损失。若是你将它的方法所有都进行包装的话,就会形成一个云计算的负担,因此建议你们直接把它包装成LUA的开发包,数据存到LUA的对象,这个对象就是LUATeb表。 程序员

 

咱们如今使用的框架是开发者使用比较多的MVC框架,这种开发框架你们应该都比较熟悉,特别是常常在安卓下面开发游戏的程序员。有一点不一样的是咱们添加了一个消息监听的机制,咱们的UI也是从新包装了一次,而且写了一套UI管理的方案,缘由是咱们使用的Cocos2d-x版本比较旧,没有太丰富的空间,以后咱们对它进行了包装,从新管理它,显示了它的优先级别。这个方案的实现比较简单,不像一些比较复杂的UI管理器同样有配置、有坐标、能拖动的界面能够操做,目前是手动操做的。咱们创建这套框架就是为了减小代码之间的偶合性,因此目前基本上可以知足这种需求。 编程

 

前端开发遇到的难点 后端

 

接下来跟你们说一下咱们在前端开发遇到的难点,第一个难点就是游戏大小包。一个包的2D至少要1G3D的话大概在1G以上,而手机上1G的话,可能没有人去玩,因此不得不对游戏包的大小进行控制。咱们目前使用的是打包工具是TP。游戏包的大小会对用户转换率形成较大的影响,这是一个比较重要的内容。有不少人喜欢选用PNG的格式,这种格式有不少优势,它的兼容性很好,体积也比较小,可是若是进行压缩之后,会对图像的质量有很是大的影响。 缓存

 

另外还有一种格式体积很小、兼容性很是好、画面质量也很是好,是咱们目前主要的图像模式,在大部分的机型上没有出现过问题。之前还使用过JPG的格式,可是有一点很差,它对于手机芯片必定要GPUCPU,如今这种CPU大部分都不太支持,只有诺基亚和三星少部分机型支持,因此不可能使用这个做为主要的打包格式。 服务器

 

为了方便打包整个游戏的资源,咱们编写了一个打包脚本以完成整个打包游戏的工做。咱们须要作的是配置这些脚本的参数,点一下以后就能够完成全部的打包工做,而且同一个包能够配置多种打包的格式,方便咱们配置压缩的比例和方案。目前第一个游戏刚作出来的时候有80多兆,通过压缩以后,再通过咱们选择不一样的打包的格式和打包脚本,最终将大小压缩到了48兆左右,这个是在没有删减任何游戏内容的前提下作的事情。还有须要注意的一点,你们对游戏进行打包时,若是有透明空间的话,它同样会占用你的内存,因此打包的时候要注意不要有太多的透明空间。 网络

 

难点:启动速度 多线程

 

咱们遇到另一个难点就是启动速度。启动的时候加载LUA文件很慢,因此每次加载要等十几秒才可以进入游戏,咱们第一次启动加载了一分多钟才进入,当时是彻底没有办法接受的。后来在代码上作了一些优化的工做,将一些文件放到后面去加载,不过咱们目前没有这样作,由于这样可能会形成其余的问题。如今想到的办法就是把配置文件里面的函数尽可能压缩,优化表格结构,让列数尽可能减小。好比说只导出和保管客户端要用到的数据,这样能够节省不少的空间。咱们能将1M的压缩到1K,这样一来仍是比较有用的。目前咱们的启动时间是14秒左右。其实咱们也有想过其余的一些加速方式,好比说将它编译成C代码,就能够极大加快它的速度,可是编译成C代码以后,就没有优化代码的更新了,就会失去这个机制,我以为很划不来,因此放弃了。另外咱们也考虑过阶梯的优化方案,可是优化阶梯更适合服务器的开发,好比有大量的逻辑运算和操做方面对于性能提高比较高,对于客户端来讲,客户端的运行结构比较复杂,它对于性能的提高是比较有限的。 架构

 

难点:闪退问题 框架

 

还有一个难点就是常常会遇到闪退的问题。其中比较严重的问题就是资源加载内存峰值形成闪退。为了不内存暴涨,咱们须要测试全部图片,对256色度的PNG8格式图片进行了测试。它自己会用到的库加起来总共不到1M,这个是库内部申请的内存,以后再进行分配,大概会消耗16MB缓存。PNG8格式的图片是一个更真实的测试环境,它将测试的方式复制纹理到GPU中,而后会再释放png库和zlib库所用到的零散内存,最终的峰值达到48M,以后内存会稳定在16M。此外,咱们对于pvr.ccz+Rgba4444的文件进行测试,测试的状况就好不少,它加载文件只消耗了1点几兆,缓存须要8兆,而后进行数据解包操做,再到文件的缓存,加载到CUP,最终这个峰值达到16M,因此它的内存会达到8M,峰值是16M

 

  JPG 的测试结果
 

针对JPG质量的测试结果,咱们分析JPG库里面有一个内存池的管理,并非想象中使用那么高的内存。它首先会进行一个内存分配工做,这个使用大概有0.5M,基本上能够忽略。而后数据缓存,再到对齐的缓存,会使用12M的内部空间,复制纹理到GPU须要12M的空间,同时又会再分配12M的内存也就是说这个时候达到峰值32M,最后它的峰值会慢慢降回到12M,而后退掉12M,以后会回到复制数据使用的缓存。因此JPG的内存使用最高达到36M,没有网上说得那么高,咱们本身测试的数据峰值并无比PNG高,目前PNG是使用内存峰值最高的。JPG的格式在有一些机型上会有兼容性的问题,在后面的机型适配部分我会跟你们介绍这个状况。

 

闪退的一个有效解决方法是下降进程占用的基本内存。使用Cocos2d-x自己的纹理缓存机制,一是清理纹理缓存,二是清理动画对象缓存,三是清理帧对象缓存。你们尽可能不要使用大图片,若是将大图片切割成小图片的话会好一点。另外还有一个不错的方法就是改变纹理加载的机制,能够在加载纹理的过程当中间隔一点的时间,对于峰值起到很大的缓解做用。咱们目前使用的方法就是隔一帧进行加载,这样能够有效防止峰值加载的问题。当连续加载不少帧的时候,你的真实内存涨幅会很快,若是你每隔一帧加载的话,涨幅会比较少。目前因为每一个手机系统的内存管理的机制不一样,致使手机使用操做系统的内存机制都不太同样,可是有一点能够肯定,就是使用了换页的概念。由于在一些测试的机型上,能够检测到的纹理内存比实际的纹理内存要小几十兆。

 

另外,还有其余的办法下降进程平均使用的总量,Cocos2d-x自己提供了纹理缓冲的机制,功能实用,加快了运行的速度,咱们也的确在使用中或者在内存出现问题的时候去考虑清理缓存,这是比较快速解决问题的办法。可是我仍是建议你们不要频繁清理缓存,由于每次清理完缓存的代价就是下次要从新下载全部的资源,那样会很是慢。咱们如今的解决方式就是在一些比较合适的时机进行缓存的清理,并且Cocos2d-x对于内存缓存有警报的做用,清理的工做也都是针对于具体的操做须要而作的,可是不太建议在内存警报的时候将刚刚加载的缓存所有清掉。咱们测试安卓系统上内存警报的泛值是12%15%,像动画对象缓存和清理帧对象的缓存占用空间不大,没有什么清理的价值。另一个比较容易忽略的方法就是LUA有一个JC的机制,有时候会清理掉20M的内存,这个也是比较可观的。

 

测试的积存的占用状况

 

第一个是PC上的峰值,PC上的峰值是212M,这里统计出来的数据是根据PSS。能够看到后面的三星I9001占用的内存大概是240M。其实Cocos2d-x开发这个大型的MMORPG占用内存是比较严重的问题,通常来讲都会遇到内存占用的问题。咱们能够看到比较有意思的地方是三星I9300这款机器,它的峰值只有90多兆,可是它的纹理内存达到110到120,说明这台机器纹理内存的管理比其余的系统要好。接下来是海尔360,差很少是200MOPPO以及小米、HTCG11、摩托罗拉这些在图上都有具体的峰值。

 

另一个闪退的缘由就是C++指针使用不当。自定义的C++对象导出给LUA使用的时候须要引发注意。若是这个时候你的C++对象已经清除的话,在LUA上是不可能知道的,这是使用Cocos2d-x过程当中最容易遇到的一个问题,特别是使用C++LUA的开放模式。另外,若是你交给LUA管理的话,就算你使用的时候没有问题,可是它的时间会很难掌握,可能会常常有对象被LUA控制,会形成在必定时间内,有很大一部份内存被占用掉。咱们目前选择的方案有两块数据,分别是LUAC++,如今的模式是各管各的。

 

难点:适配机型

 

这个适配机型也是遇到不少问题的,在安卓平台适配的能够有安卓2.3.7-4.2.2,不过大部分的机器均可以很流畅运行,包括一些主流的机器都没有问题,好比三星、联想、OPPO、索尼、HTCLG、小米、MX。可是有一些比较麻烦的机器,好比华为的低端机,很容易形成闪退的问题。还有一个就是小米手机,小米用户是咱们的主要用户群,可是用小米机器编辑图片的时候会常常形成白屏,目前咱们不太清楚什么缘由形成的。

 

后端开发的经验

 

如今我介绍一下后端开发的经验。C++LUA开发模式,你要说它有优点也能够,有劣势也能够。首先,这种格式是单服单进程多线程架构模式,这种架构模式很方便、简单,由于只有一个内存须要维护。另外它能够支持热更新,咱们在实际过程当中会遇到网络环境差的问题,手机网络环境比PC网络环境差不少,2G的网络要比WIFI网络环境好,WIFI的网络环境要比3G的网络状况好,这是咱们本身测试的状况,但也不是绝对的测试状况。在这种状况下常常会遇到收不到包、发不出去包,或者是收到包了,可是数据收不全等问题。

 

如今咱们有两个个解决方案

 

一个是创建发包收包的重发机制,从逻辑层面进行弥补。一旦出现发不出去包或者收不到包的状况,咱们会不停的重试这个过程,重试一段时间都没有办法完成的话,就要再进行重发。

 

另一个解决方案就是减小对于网络的依赖,数据包不要太大。由于不少自动回合的游戏,也许能达到30回合,这个时候包的数据是比较大的,可能会发生一次发不完的状况,须要多发几回,可是实际上增长了网络上传输的风险,因此若是能作成小包的话,就尽可能作成小包。

 

如下是张成与现场观众的互动问答:


提问:我过C++开发,大家用什么工具进行调试?

 

回答:咱们写了一个调试的功能,咱们只要在Cocos2d-x里面就能够堆栈的信息,你要看到运行状态的值,其实咱们大部分状况下会输出,这样调试会比较快一点,可是若是查不出来的话,咱们也会用Cocos2d-x工具来调试。

 

提问:专门进行内存调试的时候,在虚拟机上面有几十兆,可是在真机上面只有几兆,以哪一个为准呢?

 

回答:以真机为准。好比说安卓的调试,用安卓的虚拟器,它比真机的数据高不少,虚拟的那个数据不是真实的。

 

提问:后台架构的话,用LUA、以及用C、用C++对比的优势跟缺点是什么呢?

 

回答:LUA自己的优点就是它的自己语言层面就能够解决编程的问题,稍微会比C以及C++更快一点,性能上没有区别。

相关文章
相关标签/搜索