cpp-empty-test是cocos2dx3.2自带的一个c++的最简单的例子,基本也是使用使用C++开发cocos2dx3.2程序的工程模板。在开始拆析游戏模块之前,让我来看看这个简单的工程有些什么。


打开文件夹看到的是这个样子的:

wKiom1SJfeOiZPlaAAGJaBWKkyk088.jpg

把以 proj 开头的文件夹除开后,其实只剩下 Classes 文件夹和 Resources 文件夹,那个json文件其实是一个配置说明,打开看看就知道它不过是记录了在不同平台下的工程文件的路径啊、target名字啊等,那个CMakeLists.txt文件是为了使用CMake这个工具的,至于这个工具是什么,它跟make有什么关系,可以看看这里:http://blog.csdn.net/u012150179/article/details/17852273


根据经验,我知道那些proj开头的文件夹都是各个平台下的编译工程,谁叫cocos2dx是跨平台的呢。我们的游戏会支持android平台,但是开发我还是得在windows平台下开发,所以我先看看windows平台的工程吧,打开之后看到的是这样的:

wKioL1SJfo6A5ZDDAACUA_KkNpE523.jpg

突然发现除了上面 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看看:

wKioL1SJfpviFKQ2AAGUlEf4NzQ494.jpg

意外的简单,一个标准的windows平台入口main函数,真正有用的代码其实就是那个return,创建了AppDelegate类之后调用了run函数。目测这样游戏就跑起来了。

再打开main里面引用的Classes文件夹下的 AppDelegate.h文件,可以看到 AppDelegate类是继承自libcocos2d库的Application类的。当然,我应该继续追下去,不过这里就打住吧,我今天只是想打一壶酱油。那么大致明白了,AppDelegate类里面应该是创建了一个导演然后跑起来后面的helloscene的场景,至于到底干了什么今天就不看了。


本来酱油已经打满了,可以回家炒番茄了,但天性好奇的我又打开了android工程,想看看android这个google推出的传说中的系统的一个程序的工程目录是啥样子的,于是我看到了这些:

wKiom1SJfhHx319dAAHfxouKT9M538.jpg

除开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,于是我去官网上看了下:

wKioL1SJfrqjutISAALA6CkqfNE016.jpg

iphone6用的A8无误,再看看mac吧:

wKiom1SJfjDwVykLAAG-9lmFWag757.jpg

赤裸裸的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说起的更多相关文章

  1. swift学习笔记 - 判断当前运行的系统和平台

    最近代码需要判断代码运行的系统与平台,下面总结了一下swift下一些可以用来判断的属性:以上是我总结的,如果有错误欢迎大家指出,最后谢谢大家的阅读~

  2. Swift Invalid bitcode version (Producer: '802.0.41.0_0' Reader: '800.0.42.1_0')

    问题:当更新最新的第三方库后,archive的时候会报这样的错误看到这样的错误很头疼,此时有两种方法解决,如下:方法一:简单粗暴的方法,使用老版本的SDK,指定SDK的版本,这样可以解决!

  3. 将Trickle移植到android

    >如何告诉编译器链接我之前为android交叉编译的共享库,以便为android生成最终的可执行命令行应用程序.而且这甚至可以在Android上移植涓流?

  4. android – PANIC:’arm’CPUS缺少模拟器引擎程序

    我得到了与下面链接中提到的相同的问题.但是这个问题已被搁置,我仍在寻求解决方案.https://stackoverflow.com/questions/27146511/panic-missing-emulator-engine-program-for-arm-cpus-eclipse所以我想提出这个问题并在这里问一下.直到昨天,模拟器工作正常.但是从今天起,我在尝试打开模拟器时收到以下错误我的A

  5. Android是否真的存在于ARM之外的其他平台上?

    我想将用C编写的应用程序移植到android.将应用程序从C转换为Java将需要大量工作,我更愿意使用该应用程序更好地为该平台,而不是修复转换错误和解决重构问题.NDK似乎是一条很好的路线,但实际上我不想错过一个平台只是因为NDK不支持或不支持它.Android声称支持MIPS,ARM,X86和其他……是否有任何运行或将运行Android的非ARM设备?

  6. android – 关于arm-eabi-gcc和交叉编译

    如果是的,然后问题2:我正在尝试编译这样一个库:libao.使用这些命令:在组装结束时收到以下内容:configure:错误:在此平台上找不到16位类型!如何修复和正确配置库?

  7. Android模拟器ABI

    序言:这个问题已经过时了.创建Android虚拟设备时,可以选择cpu/ABI.我已经尝试了所有可用的目标–除了ARM之外别无选择.我的目标是Android3.2.我假设这是为了在x86上模拟平板电脑或上网本.那些甚至存在于硬件中吗?编辑:在AndroidToolsv17中,API级别10下有一个可选的IntelAtomx86映像.编辑2:ARMv7a现在也在那里.到目前为止没有MIPS.EDIT3:MIPS仿真器和图像现在也可用.等待一些新架构(ARMv8?

  8. 如何强制Android应用程序使用32位或64位库

    在具有64位ARM的Android设备上,将有两个版本的库,32位和64位,它们的性能可能会有所不同.我想知道是否有办法强制应用程序使用32位或64位库.解决方法安装apk时可以指定ABI.adbinstall–abi

  9. Android NDK – 它支持直接ARM代码或只支持Thumb

    我被要求评估我们的产品的Android平台,我正在看各种选项,我只是刚刚刮目前的表面,一件事令我困扰的是,我看不到如何编译代码作为直接的ARM代码,我知道Thumb运行速度较慢,我们将需要在代码的关键部分的性能.我认为应该只是在Android.mk文件的LOCAL_CFLAGS中设置-march标志,但是我不能让它工作…解决方法在Android.mk中为模块指定以下标志将编译直接的ARM代码.启用优化也可能有助于:

  10. 如何在Android项目中使用ARM汇编代码?

    我对Assembly和ARM没有特别的经验,但是我可以在其中编写一些例程,我想看看它们是如何在装有ARM的Android设备上运行的.将程序代码文件包含在Android项目中的程序是什么?我可以只从本机代码或从Java调用吗?

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部