Cocos2d-x 之大牛看法
(未完毕)
cocos2d-x并非一个适合网游client(mmo)的游戏引擎。越是大型游戏,这个小引擎就越无法驾驭(尽管它很受欢迎)。 之前我在原来的公司使用的是自主研发的C3引擎,已经对外开放(尚未开源),后面假设我有提到c3引擎。那么指的就是这个2.5d游戏引擎。
我想起我上个月刚离职的时候。c3的首席研究员(应该也是引擎圈内的一个大牛)对我说cocos2d-x没有什么技术含量,我还不以为然,当时我想的是,假设我自己开发一个游戏,首选必定是cocos2d-x。
可是真正到新的公司接触了使用cocos2d-x开发的一个类似神仙道的mmo才感觉cocos2d-x对于一个mmo引擎来说。差的非常多。与c3相比。差就差在几年。十余款mmo。上千位开发人员的检验。
尽管cocos2d-x的开发社区非常庞大,可是它适合刚開始学习的人去开发一个愤慨的小鸟、水果忍者,并不适合一个网游公司去开发一个mmo。尽管基于cocos2d-x有非常多不错的mmo,比方忘仙、神仙道。
可是我觉得那是一群牛x的开发人员通过自己的努力弥补了cocos2d-x的不足。
能够觉得我不是一个牛人,可是一个团队能有一个牛人就已经万幸了,能有两个就可遇而不可求了。一个好的游戏引擎比方c3正是被我们这些普通开发人员来使用,它能够不次时代。能够不面向对象,可是它会很易于使用,而且很难被误用。
牢骚发完了,以下是详细的优化:
1、去掉libxml2,改用rapidxml来解析xml文件。
rapidxml简直是一个大杀器。解析xml的速度甚至比纯文本解析和json格式还要快。其解析速度比libxml2快5倍,即便cocos2d-x中使用的是sax模型,而rapidxml是dom模型,使用rapidxml依旧要快许多。我们的游戏是全部配置文件都用xml来描写叙述,事实上大可不必,可是为了跟网页版本号配置统一。方便今后的维护,临时没有对配置格式进行改动。
而cocos2d-x底层对xml使用最频繁的地方就是Plist文件的解析了。
ios平台下还好,NSDictionary速度也很快(可是依旧比rapidxml慢一倍)。可是android下效果就很明显了。游戏启动时间大大缩短。
所以,为什么cocos2d-x还要用libxml2呢?
2、游戏资源打包。 这个尽管是能够自己扩展的。可是却是须要引擎提供支持的。由于全部的图片读取都是属于引擎的内部代码。 当然不是全部的游戏都须要资源打包。可是一个有用(mmo向)的游戏引擎这个是必定要考虑的。 这一块儿牵扯到非常多东西,比方游戏资源更新,资源读取规则。读取失败后的异常处理。多线程载入时的同步机制等等。
3、改动CCAssert,添加日志记录功能。 作为一个游戏引擎。cocos2d-x内部代码非常不健壮,非常多资源不存在或者是不小心的误用都会让程序挂掉。 这个对一个mmo来说是不可接受的。 CCAssert原来是一个简单的assert,这个在ios和android下就直接挂掉了,后面尽管改动为CCMessageBox的提示。可是依旧不够方便,由于这些弹出框都非常卡非常慢。接触过mmoclient开发的应该都有体会资源不存在是常常发生的事情,尤其是大家一起开发功能的时候,资源总是最后才正确且完整。 这个时候记录个log不就完了。
而cocos2d-x却并没有提供不论什么Log记录功能(实际文件Log而不是开发时用的CCLog)。
而引擎内部有大量的Assert,断定文件一定是存在的。断定某个配置一定是正确的,断定某个Frame一定是存在的,这个造成的问题就是一旦有配置错误,那么程序非常可能就崩溃掉了。而作为一个mmo,尤其是已经对外公布的情况下。这个时候出现表现异常(比方图片不显示)而不是崩溃会更加合理。
4、资源异步载入。尽管cocos2d-x有提供Texture的资源异步载入,可是这并不够用。 我们改动为这种形式。CCSpriteCache缓存图片的时候异步载入图片。这个时候能够获取到正确的CCSprite,仅仅只是里面的CCTexture并没有附上一个正确的纹理id,当图片载入完成,这个id就正确了,那么CCSprite在下一次Draw的时候自然就会渲染出正确的图片(这里要做下推断。假设纹理id不对那么就不进行渲染操作)。 还有须要注意的就是仅仅有一个线程载入图片是不够用的,依据须要可能要开3~5个线程来载入图片,才会起到异步载入图片的最佳体验。
当然,假设不过怕载入图片卡主主线程而不关心载入速度,那么就不须要这么麻烦了。
5、加入一个高速渲染的CCFont,不管是哪个平台生成字形纹理的过程都是很慢的。假设一个mmo中有大量的文本、聊天等等。光生成字形的时间可能就要500~600ms,那这个游戏给人的感觉就是时不时一卡一卡的。 这个新的CCFont思路很easy,生成字形的时候一个文字一个文字的进行生成,把生成的字形保存到一个512*512的纹理上。然后渲染的时候取这个生成好的字形进行绘制。
6、计划中: 人物图片使用骨骼动画切片处理,这个事实上应该比什么js脚本更应该加到引擎内部。这个要提供的不不过代码的支持,这个是从生产到结果的一站式技术支持。 不能引导生产流程的引擎不能说是游戏引擎。不能成为生产线的游戏引擎不能说是游戏引擎。
优化进行中。
。
。。。。
。
最后再牢骚下,我敢打赌cocos2d-x的js脚本支持并非一个正确的选择,假设是吸引html的开发人员,我勉强认同cocos2d-html5,可是说实话,用html来开发网页游戏在几年内都不会是一个正确选择。而cocos2d-html5更像是给html开发人员的玩具,而且悲剧的是这个玩具还有些难,大多数html开发人员无法掌握这个玩具,仅仅能用它写写斗地主之类的小游戏。
有能力用它写出捕鱼达人的开发人员要么是顶尖的html开发人员,要么会像我一样更习惯用c++来写代码。
正确的跨网页平台方向应该是像c3或者是unity3d一样,内部使用llvm把c++代码直接编译成flash或html5代码。这样现有的游戏仅仅要经过非常easy的移植就能够在网页上面跑了。像unity3d那样支持js固然不错,可是这个不是必须的。我假设用unity3d。我选择脚本语言会是c#而不会是js,相信非常多游戏开发人员都会做出这种选择。所以cocos2d-x费了那么大力气搞js。全然是走弯路了。
有这个时间还不如把公布做好,把c#支持加进来(不加也无所谓,lua也凑合。就比c#慢几倍而已)。假设cocos2d-x不能在mmo相关功能上提供很多其它的支持的话,那么它对我而言就是一个玩具,而不是一个强力武器。
Cocos2d-x 之大牛看法的更多相关文章
- 一些对数学领域及数学研究的个人看法(转载自博士论坛wcboy)
转自:http://www.math.org.cn/forum.php?mod=viewthread&tid=14819&extra=&page=1 原作者: wcboy 现在 ...
- 大牛对ACM入门菜鸟的一些话
首先就是我为什么要写这么一篇日志.原因很简单,就是因为前几天有个想起步做ACM人很诚恳的问我该如何入门.其实就现在而言,我并不是很想和人再去讨论这样的话题,特别是当我发现我有很多的东西要学的时候,我实 ...
- Cocos2D创建多彩文本显示标签
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) Cocos2D中默认的CCLableTTF类从源代码里看是支持 ...
- Ember.js 看法,精辟
https://ruby-china.org/topics/31451#reply43 都是大牛,或许还是vue适合小白!架不住人多啊!一个非常优秀的产品,客户百十号人,如何发展! 46楼的感想如下, ...
- 操盘策略:KDJ三线合一 必定孕育大牛股
日周月KDJ指标三周期合一是孕育大牛股的必要条件: 炒股看一下周.月线十分有必要,很多时候,周.月线已经死叉下行,中长线趋势走坏,但日线偏偏发出金叉,K线也走好,量价配合也好,而此时介入,多数情况下就 ...
- 【Cocos2D研究院之游戏开发】
http://www.xuanyusong.com/archives/category/ios/cocos2d_game 分类目录归档:[Cocos2D研究院之游戏开发] 201211-19 Co ...
- JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议
软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...
- 一位资深程序员大牛给予Java初学者的学习路线建议
java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈 ...
- 关于js的回调函数的一点看法
算了一下又有好几个月没写博客了,最近在忙公司android的项目,所以也就很少抽时间来写些东西了.刚闲下来,我就翻了翻之前看的东西.做了android之后更加感觉到手机端开发的重要性,现在做nativ ...
随机推荐
- 1193 Eason
Eason Acceteped : 57 Submit : 129 Time Limit : 1000 MS Memory Limit : 65536 KB Description 题目描述 ...
- PHP经常使用功能
1)字符串 主要方法有:strops().substr().str_split().explode()等.很多其它方法查看PHP官方手冊. <?php /** * 字符串的方法:strpos() ...
- 【LeetCode】3Sum Closest 解题报告
[题目] Given an array S of n integers, find three integers in S such that the sum is closest to a give ...
- CF Mike and Feet (求连续区间内长度为i的最小值)单调栈
Mike and Feet time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- idea里新建maven项目时,在new module页面,一直显示loading archetype list...
不知道什么时候开始,在idea里新建maven项目时,在new module页面,一直显示loading archetype list....,导致一直没办法新建.后来我以为是防火墙问题,各种设置还是 ...
- JWT使用1
JSON Web Token - 在Web应用间安全地传递信息 转载收藏于:http://blog.leapoahead.com/2015/09/06/understanding-jwt/ JSON ...
- css3 列表图片hover左右滚动效果
- 如何批量ping地址查看网络是否畅通
测试环境搬迁后,需要批量去ping所有机器的IP,看网络是否畅通 测试思路: [weblogic@pays03pre_BankVerify luyantest]$ ping -c 1 172.29.1 ...
- 【转】flex中的labelFunction(combox和dataGrid)
Flex中,对于显示一个字段,只需要指定对应字段属性给labelField即可,当需要上述所需要的功能的时候就得做个转换了,在Flex的基于List的组件都有一个labelFunction方法能很简单 ...
- 转载——利用C#自带组件强壮程序日志
利用C#自带组件强壮程序日志 在项目正式上线后,如果出现错误,异常,崩溃等情况 我们往往第一想到的事就是查看日志 所以日志对于一个系统的维护是非常重要的 声明 正文中的代码只是一个栗子,一个非常简 ...