cocos引擎不可不知的基础概念(1)

  • 在此仅想进行一个概括性的总结,将这些经验和大家一起分享,有问题的地方也忘各路大神能指点一下。这不是一个教程,也不是代码层面的分享,这是一个系列的总结。只想通过“深入浅出”的方式和大家分享,因此最近的学习中,发现只有把一类问题深入到某种程度才能有更全面的理解。
  • 复杂的东西要理清楚思路就需要简化,在这里我的思路是分几个模块进行总结,每一个模块的总结都在能力之内深入的挖掘,相信这样做能有更大的收获。
  • 整个内容分为三个主题:跨平台、图形学、引擎类结构、物理引擎和引擎架构,每一个主题也都会去搜集资料、论证并总结,在总结较为模糊、错误和不完整的主题中,希望能有朋友毫不留情的指出,我会好好整改。
  • 最后,由于能力有限,此文紧提供参考,最大的价值也仅仅是普及游戏开发中的一些常识并能快速大致地去理解各类分支,方便后续学习。无论是哪一个主题,都是一门复杂的学问,想掌握牢靠,还需要系统的去学习。

:非phoneGap打包方式、本地编译后打包方式所生成的移动端应用程序,为简便语言,我们统一在此叫native。


那么从最初的地方看起。
为什么cocos2d-x那么多人用?
因为它能跨平台,开发成本低,学习门槛低,引擎结构通俗易懂….等等。通过上面的回答,我们就能找到最为重要的因素:跨平台。

1.为什么cocos2d-x能够跨平台?

在回答这个问题之前,我们要确定什么是跨平台。
目前普通的概念有两个:第一种解释是web开发,意思运行程序在所有设备上的浏览器上运行。另一种是正确意义上的跨平台,也就是一套代码通过“完美的解决方案”能在所有本地机器上编译运行(例如QT跨平台图形应用程序开发框架)。
因此,对于cocos2d-x来说无疑是第二种了,cocos2d-x通过不同平台使用不同实现的方式实现了跨平台的能力。观察cocos2d-x里的源代码,我们经常能看见非常多的“宏定义”,这些宏定义里面,有非常多的代码是用于“平台判断”的。这些宏定义实现了“条件编译”,也就是满足某个条件下,代码块参与编译,否则被忽略。因此,我们使用cocos2d-x能够跨平台,同样的cocos2d-x API但是在特殊的系统下,其实现不同,以这个为基础,再加上各平台的基本运行代码。
但是许多朋友有个疑问,Android明明是用Java开发的,IOS是用Object-c开发的,cocos2d-x只是在C/C++实现不同的逻辑,有什么用呢?其实,C/C++是可以直接开发Android应用的,最根本的原因是因为Android本身就是基于Linux的,而且Android内部核心库的实现也是使用C/C++ ,而同时,苹果系统一直都是允许混合编译C/C++、Object-c代码的。(JNI)
游戏引擎最核心的功能是图形的渲染,帮助引擎实现这一功能的,也是真正让引擎达到跨平台的是OpenGL ES,跨平台图形API。使用它进行图形处理,无需担心平台不同会有多大的差异。

2.cocos2d-x和cocos2d-js(html5)有什么区别?

答:情况不同,区别也不同,但任何一个版本,游戏引擎的所有机制是一样的(实现方式不一样罢了)。cocos2d-x是基于C++语言的跨平台游戏引擎,最初只有C++版本,Lua和Js版本都没有,可游戏开发不同于其他软件开发,游戏的逻辑性太复杂,特别是对于大型项目,复杂的逻辑如果再使用相对复杂的语言,这种生产效率是非常低下的。因此,很快Lua就能在cocos2d-x引擎中使用了。于是大量的团队开始转入Lua阵营,放弃使用复杂语言概念的C++来开发游戏,特别是做MMO的团队,系统复杂度较高。可是问题来了,Lua脚本并不完善,连最基本的C++上的API都没有完整的“搬运过来”,当然这不能怪引擎团队,本来就是一个在成长过程中的引擎和引擎团队,于是这些做Lua团队的先行者们的支持下,衍生出来了Quick-cocos2d-Lua版本(一开始只是帮大家在Lua上移植和封装引擎功能,后来被cocos2d-x收编了)。Lua是游戏开发中公认的好脚本,但为什么cocos大力的在做cocos2d-js呢?这个问题我回答不上来,目前还只是一枚小程序员,但我个人觉得是由于Html5的关系,大家都知道html5是web上非常重大的突破,如果引擎能做到任何平台都能运行,包括html5,那么不是非常完美?此时不选javascript,那还能选谁?
这个时候问题来了!cocos2d-js为什么可以运行在web上,还可以运行在native中?运行在web上,无可厚非,这就是javascript该做的事情,web就是它的天地。但是在native 中呢?有些朋友没有经历过使用Lua的时期,也基于以往工作于非Native的环境中,所以体会不到javascript是如何在native中运行的。在native中,脚本只是一种特殊的文本罢了,没有任何意义,但通过一个脚本引擎就能够指挥着本地语言去执行命令。脚本语言有非常多,Lua和Javascript只是其中两种,那么引擎如何知道是要给本地语言C++发送什么命令?这当然需要“翻译”把脚本的意思传达给C++,于是我们可以用脚本写逻辑,但最终执行的是C++程序。Lua的翻译者是Lua-Binding,Javascript的翻译者是SpiderMonkey。
最后总结一下这些区别:
(1)cocos2d-x是基于C++的,并且支持Lua开发。效率高,无法开发web版本。由于C++版本没有脚本运行的开销,所以C++版本运行效率是最高的。
(2) js版本 使用js语言对引擎有自己的一套封装。当发布到web时,使用web的一套渲染方式(canvas/webgl),当发布到native时,js就只脚本资源。js版本包括了C++版本。

3.如何开发web/native跨平台应用?

答:首先说一下区别:
(1)web和native渲染方式不一样
(2)web和native管理资源方式不一样
其实这两种区别足已很头疼了。因此在native版本开发中所有使用OpenGL特有API的地方都要有平台相关性判断,web上特有的object对象的使用也要有平台相关判断,资源加载比较麻烦,web上要自己封装好异步加载等。所以在写这类跨平台开发游戏的时候,不要用这些“特殊”功能,用最简约的代码实现功能和表现。然后在发布不同平台的时候,不同平台不同修改。

(完善中…)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值