从cpp-empty-test说起
cpp-empty-test是cocos2dx3.2自带的一个c++的最简单的例子,基本也是使用使用C++开发cocos2dx3.2程序的工程模板。在开始拆析游戏模块之前,让我来看看这个简单的工程有些什么。
创新互联建站是一家专业提供仁布企业网站建设,专注与做网站、网站设计、html5、小程序制作等业务。10年已为仁布众多企业、政府机构等服务。创新互联专业网站制作公司优惠进行中。
打开文件夹看到的是这个样子的:
把以 proj 开头的文件夹除开后,其实只剩下 Classes 文件夹和 Resources 文件夹,那个json文件其实是一个配置说明,打开看看就知道它不过是记录了在不同平台下的工程文件的路径啊、target名字啊等,那个CMakeLists.txt文件是为了使用CMake这个工具的,至于这个工具是什么,它跟make有什么关系,可以看看这里:http://blog.csdn.net/u012150179/article/details/17852273
根据经验,我知道那些proj开头的文件夹都是各个平台下的编译工程,谁叫cocos2dx是跨平台的呢。我们的游戏会支持android平台,但是开发我还是得在windows平台下开发,所以我先看看windows平台的工程吧,打开之后看到的是这样的:
突然发现除了上面 Classes 文件夹下的5个文件外,还多了main.h和main.cpp,这两个文件被放在了 proj.win32 文件夹下面,略一思考也就明白了,毕竟是要针对不同平台,那么入口函数必然不同,所以在各个不同的工程文件夹下估计都会放着各自的程序入口的代码,在windows平台下是这个main.cpp。这么看来cocos2dx的代码还是不错的,跟游戏相关的代码是通用的,都放在Classes文件夹下,不用针对不同平台编写不同的代码,这也就是说cocos2dx跨平台的含义吧。但是毕竟各个平台有区别,这有区分的代码就放在各自的工程目录下,这里我们的empty-test没有多余的内容,所以只需要一个程序入口代码就OK了。由此可以猜想,coocs2dx的引擎代码里肯定有很多#if windows啊,#if ios之类的条件编译,而引擎需要引用其他的功能时,肯定也是尽量使用那些跨平台的库,当然,那些库里肯定也是一堆的#if windows条件编译,另一个办法是引擎代码直接根据不同的平台来引用那些不同平台下的库。
打开main.cpp看看:
意外的简单,一个标准的windows平台入口main函数,真正有用的代码其实就是那个return,创建了AppDelegate类之后调用了run函数。目测这样游戏就跑起来了。
再打开main里面引用的Classes文件夹下的 AppDelegate.h文件,可以看到 AppDelegate类是继承自libcocos2d库的Application类的。当然,我应该继续追下去,不过这里就打住吧,我今天只是想打一壶酱油。那么大致明白了,AppDelegate类里面应该是创建了一个导演然后跑起来后面的helloscene的场景,至于到底干了什么今天就不看了。
本来酱油已经打满了,可以回家炒番茄了,但天性好奇的我又打开了android工程,想看看android这个google推出的传说中的系统的一个程序的工程目录是啥样子的,于是我看到了这些:
除开readme不谈,那里面其实讲的都是废话,我喜欢从脚本看起,简单看了下ndkgdb.sh,从名字就差不多知道它一定是用gdb来调试,至于前面的ndk,我还是知道点的,用ndk可以把C/C++代码编译成so库,总之这个脚本目测是用来调试的。
接下去就是各种配置文件了,无论是xml还是json还是txt,还是高大上的properties、project、classpath都是配置,至于这些配置到底是被谁用,那需要去找google娘。然后我把目光放到了那三个文件夹,res文件夹看了看发现比较简单,里面就是各种不同屏幕大小下的app的图标,再来看src里面只有一个java文件,目测这个java的作用应该和windows下的main.cpp的作用类似。然后只剩那个神奇的jni文件夹了。我本人由于最开始受到国内那弱弱的计算机科学教育体系的影响,第一门语言学的是c,然后我就讨厌c++和java了,我不知道其他的受弱弱的大学教育的影响一开始学的是c的人,是不是跟我一样,从那以后就讨厌java了,甚至讨厌一切面向对象语言,即使之后当我明白了面向对象只是一种编程思想后,我还是讨厌面向对象语言,冏!
扯远了,再来说说jni,找google娘撒了会娇,看到了这里:http://www.cnblogs.com/mandroid/archive/2011/06/15/2081093.html,还有这里:http://docs.anysdk.com/JNITutorial。
本来到此为止,我就该回家吃饭了的。但是我看到了anysdk里开发环境搭建的第一句话“1.android的NDK开发需要在linux下进行: 因为需要把C/C++编写的代码生成能在arm上运行的.so文件,这就需要用到交叉编译环境,而交叉编译需要在linux系统下才能完成。”
天杀的,我突然极其想吐槽,为毛我写的代码需要经过这么多波折才能在android平台下运行,难道windows大法不好吗?于是我又补了点考试常考的知识。ARM平台和大多数pc运行的X86平台,到底有何区别。
这一切都要归结到信仰的不同,哇擦,居然都上升到信仰的高度了,话说我一开始其实真的是来打酱油的。在很久很久以前,其实也没有多久,有些人认为CPU的指令集是越复杂越好,因为这样意味着CPU可以非常方便而直接的干一些事情,比如如果指令集里面只有加法指令,那么在做乘法的时候,只能不停的去加才能实现,但是如果真有一条直接做乘法的指令,那么执行起来必然是很快的,这里不要吐槽我,我只是举个栗子,CPU里当然不会有乘法器,因为用二进制,所以乘法有很多优化方式,这里不谈。但是,这种想法有点像我们写代码的时候,给一个类添加了一些功能,但是有些功能可能用不到,为了尽可能让我们的类看起来强大,我们会提供尽可能多的接口来满足用户,那么我们就需要导出更多的接口。所以复杂指令集CISC架构的CPU越做越复杂,当然,性能也是越强大,这里的性能是指运行速度,我们常听说的intel就是CISC得死忠。我们可以看到intel已经在各个计算机芯片领域都强大到让人一眼望不穿的地步,几乎统治了整个PC机市场,当然这和他们跟微软合作分不开,而且由于intel的这种常年统治,导致大量开发者开发的软件其实都是基于这个架构,也就是所谓的X86架构来开发软件,为什么叫X86,这么羞羞的问题你问google娘去啊!intel也是一家伟大的公司,他们不断创新,增加他们的指令集,不断采用新的制程,什么65纳米、55纳米、45纳米,什么奔腾、安腾、酷睿、至强巴拉巴拉的,2GHZ、3GHZ、4GHZ,单核、双核、四核、八核!噢,叼!更叼的是intel经过这么多年,架构的兼容性做的真心是好,要不是各个操作系统懒得写那么复杂,30年前的程序甚至都可以跑在今天的系统上。
可是世界是辩证的,就在CISC这边风景独好的时候,RISC出现了,精简指令集系统,这群人认为CPU的指令集应该是越精简越好,因为这意味着CPU做的事情都是非常简单的,那么CPU从结构上就可以设计的很简单,从而能够拥有更好的和其他硬件交互的能力,我的第一感觉是这帮人一定适合跟外星人交流,因为他们肯定能找到必然需要而且又最简单的能够表达绝大部分意义的语言。ARM,Advanced RISC Machines诞生了,ARM的诞生是历史的必然,但是它只卖技术授权,不自己做CPU倒是没想到的,估计是没有intel那种魄力和钱,纯属我猜测,当然可能更多的考虑是想搭建一个开放的架构,让大家都可以设计自己的CPU,当然,这并不是说arm的CPU架构就一定是精简的,功能单一的,因为CPU核心确实是简单,所以可以和其他芯片很容易的整合到一起,比如苹果大名鼎鼎的A8芯片,提到苹果,我突然想起个问题,既然苹果ios系统用的是自己研发的基于arm架构的A8芯片,那mac呢?难道也是用的A8,如果不是的话,岂不是苹果自己的两套系统用着两种不同的CPU,于是我去官网上看了下:
iphone6用的A8无误,再看看mac吧:
赤裸裸的intel i7处理器啊。。泪奔,果然是这样。顺带再吐槽下苹果中文官网的广告语“岂止于大”。然后我想了想,好像只有高通和苹果两家现在还在做arm芯片比较有名,但arm芯片也确实基本统治了移动平台,在除了pc以外的各种设备上,更加常见的反而是arm芯片。我猜想这中间肯定有很多有趣的故事,于是乎找google娘问了下,果然很有趣,想知道的自己去问吧。
终于要说到android了,google娘出的基于arm架构开发的操作系统,在现在各种新兴的设备上,什么手机、手环、电视、手表、眼镜、头盔等各种可穿戴设备上,基本是arm+android的搭配。经过上面的分析,我们知道RISC设计的CPU肯定要比CISC要简单,那么性能上,也就是运行频率一般是赶不上CISC设计的CPU的,在制作工艺上估计也赶不上intel这种积累了几十年专注于这么一件事情上,而且无论从兼容性还是硬件可扩展性、软件开发的方便上以及可用工具的丰富层度上来说,肯定依然是赶不上intel的。那么为什么我们还能看到arm+android统治市场呢?思来想去,我看看了以前苹果发布的文章,才终于想到,原来是功耗的差异,我们可以看到CISC架构的追求方向非常明确,就是性能,所以我们看到intel各种推陈出新,一代更比一代强,CPU核心频率动不动就3,4GHZ,而我们看一般我们手机CPU的频率,即使是最新款的手机差不多也就1GHZ多的样子,完全不是对手,但是由于CISC架构CPU这种追求,导致它的功耗也自然更高,我记得我的电脑电源是有350W的,但是我手机肯定没这么高的功率,所以要在我手机上跑这么个高帅富,我自己都不信,但是跑一个只需求几十W的arm芯片,我还是可以认同的。在电池能源这么紧张的设备上,跑个1GHZ的芯片,我都觉得每天一充电抓狂,更何况让我跑个3GHZ的芯片,吃一顿饭充一次。顺带提一点,linux也是基于arm架构开发的系统,真心是一直等到google娘开发出android,才让linux大展宏图啊。
我必须要回家吃饭了,已经饿昏了。天下大事,分久必合,合久必分。目测未来arm芯片肯定是朝着性能方向发展,intel芯片肯定是朝低功耗方向努力。
以上纯属YY,若有不对的地方不用告诉我了,我真的是出来打酱油的,有篇文章写的不错,可以看看:http://ihyperwin.iteye.com/blog/1701132
文章标题:从cpp-empty-test说起
分享地址:http://azwzsj.com/article/pedojc.html