cocos2d-x面试题(一)

来源:互联网 发布:大数据量化基金 编辑:程序博客网 时间:2024/05/17 04:19

(一)执行顺序相关: 
执行顺序:

我们知道Cocos2d-x程序的执行顺序是从AppDelegate这个类开始,在其中做一些必要的初始化并创建运行第一个场景,之后有一个主循环来维持游戏每一帧的循环,并在此期间执行游戏的相关逻辑。当游戏结束时,会调用导演类的end方法,将会执行游戏的清理工作,并结束了OpenGL视图的运行。不同的平台会有不同的封装,PC端由OpenGL封装,移动端则由OpenGLEx,最后退出游戏进程,结束了整个游戏的运行
  • 1
  • 2
  • 1
  • 2

(二)各种类:

①导演(Director) 它将提供当前运行所需一切必备的信息,如帧率,与上一帧间隔的时间;屏幕分辨率以及用于循环执行的时间表等等,而最重要的功能是管理当前的游戏场景。导演类将是Cocos2d-x中最关键的一个类。 ②场景(Scene) 它则主要侧重于定义不同场景的用途,如开始界面,游戏关卡,设置选项界面等等,每一场景都有自己相应的布景或者角色。但是它往往不直接显示场景的内容,而将依赖场景中的图层,每一个场景往往有多个图层。 ③图层(Layer) 它主要用于布置场景,如游戏中远处的森林和近处的山丘将会使用一个图层,近处的怪物和英雄可能会使用一个图层,再近处的一些装饰和遮挡也会使用一个图层。甚至一些更加复杂的游戏,充当背景的图层还不只一个。如多个背景错开,还设置上不同的移动速度,可以形成场景的生动效果,从而提升游戏的吸引力。 ④精灵(Sprite) 它和所有显示对象一样都继承与Node对象,它是最最最常用的显示对象。它可以加载资源图片并展示在屏幕上,在游戏或电影里,精灵就像电影里的演员;它可以充当玩家控制角色,也可以充当程序控制角色。还有食物,树木,宝贝等等,都可以用精灵来充当。 ⑤动作(Action) 在游戏中,无论是玩家操作的英雄的各种行为,敌方怪物的各种行为,还是其他怪物的一些变化,基本都是由一些单独的动作叠加来完成的。如控制精灵的旋转,移动和缩放,还有一些复杂的对象,如跳远,贝塞尔曲线和改变颜色等等。总而言之,一个导演可以管理多个场景,每个场景代表游戏中的一个关卡或一个界面,一个场景中可以包含多个布景,有的可能代表背景,有的可能代表前景,背景可能不止一个。一个布景可以包含多个精灵,精灵可以是玩家控制的英雄,可以是敌方的怪物。精灵根据游戏情节的需要可以单独执行某一段动作,连续执行一系列动作,或者执行多个动作,如跑步的同时进行旋转等等。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

(三)工具相关: 
工具: 
你常用的Cocos2d-x相关的工具有哪些呢?

在这里我们想到的有Cocos studio,TiledMap,ParticleEditor(粒子编辑器),Flash,PS等等 ①Cocos Studio Cocos Studio是一款功能强大的编辑器,即界面编辑,场景编辑,动画制作,3D场景编辑,图集合并等功能为一体,可以快速的发布资源,可以说是游戏开发一站式解决方案,运用低成本、高效率;高性能,一次制作,多终端平台共享的特性;并且它有丰富的插件,素材库,使游戏开发更加灵活更加便捷。 ②TiledMap 地图编辑器,采用的是传统像素游戏所使用的固定方格的拼接方式,可以使用极少的纹理制作丰富的场景,新版本的Cocos2d-x支持老版本TiledMap的菱形格式的地图。 ③ParticleEditor 粒子编辑器,提供了丰富的粒子特效,大部分情况下只需要修改它提供的模板就能达到自己想要的效果,最终可以保存成*.plist文件格式,Cocos2d-x对它的支持非常的不错 ④Flash、PS 这就不多说了,这些都是美术必备的软件,由于Flash制作动画的功能强大、历史悠久,使用它制作动画效率非常高,因此我们常常会使用Flash制作动画,导出成cocos2d-x所支持的格式。这样,我们的动画不仅制作效率,还与游戏引擎进行接耦,对不同的平台,只要做出一个相应的导出插件即可CocoStudio是一套基于Cocos2D-X引擎的工具集,包括UI编辑器、动画编辑器、场景编辑器和数据编辑器。UI编辑器和动画编辑器主要面向美术,而场景编辑器和数据编辑器面则面向游戏策划,这四个工具合在一起构成了一套完整的游戏开发体系,帮助开发者进一步降低开发难度、提高开发效率、减少开发成本。 UI编辑器:支持目前Cocos2D-X的所有控件,同时支持多分辨率适配、碎图合并以及自定义UI。 动画编辑器:支持骨骼关键帧动画、序列帧动画,同时支持碎图合并、Flash动画直接导入等。 数据编辑器:把策划用的Excel数值表分解,然后转化成Cocos2D-X可以识别的格式。 场景编辑器:可以整合我们之前CocoStudio其他编辑器的资源,编辑当前的游戏场景,实时演示,所见即所得。同时也支持第三方的工具模式
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

(四)内存管理相关 
请描述cocos2dx的内存管理机制和原理,怎么判断cocos2dx代码是否有内存泄露

cocos2dx基于引用计数管理内存,所有继承自CCObject的对象都将获得引用计数的能力,可通过调用retain成员函数用于引用计数值,调用release减少引用计数值,当计数值减为0时销毁对象.在程序中重载mallocfreenewdeletevoid* MyMalloc(){ printf("malloc"); return malloc();}void MyFree(void* fp){ printf("free"); free(fp);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

new delete和malloc free的联系与区别

mallocfree是C语言标准函数库中的两个函数,new/delete是C++语言中两个运算符。malloc/freenew/delete都是用来申请动态内存的。new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员的工作,同样free 也不会调用析构函数。malloc得到的指针无类型,new出来的指针是带有类型信息的。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时 要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如 果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete 必须配对使用,malloc/free也一样
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

autorelease和release的区别?

release 会立马对对象进行引用计数减一操作,如果当前对象的引用计数小于0,则会进行释放。autorelease 则会将该对象放入到自动释放池中,当一帧结束的时候会执行release操作进行引用计数减一操作,如果当前对象的引用计数小于0,则会进行释放。
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

有哪些操作会导致内存泄露,如果发生内存泄露如何处理?

 回答:在堆上分配动态内存和释放动态内存的方法是 newdelete,在申请内存之后,如果不使用了就需要delete掉,不然就会造成内存的溢出。解决办法:使用vld、memwatch加载到项目中,调试
  • 1
  • 1

cocos2dx数据存储用过哪些

答案:CCUserDefault和SQListCCUserDefalt存在的的问题没有记录和表的概念你会发现,如果要设置多存档,必须自己操作,而且代码会变得复杂,容易出错。对于简单的游戏可以使用CCUserDefalt,但是对于复杂游戏,可以考虑使用SQLite。SQLite存在的问题没有数据类型安全比如,如果你错写把一个Integer按Bool读取,是没有错误提示的没有存档数据完整性的校验
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

(五)优化相关

简述CCSpriteframeCache CCSpriteBatchNode?

回答:CCSpriteFrameCache 缓存了所有CCSpriteFrame. 可以一下方式获取特定frame并设定给Sprite. 前提是文件已经缓存CCSpriteBatchNode 中的所有CCSprite只会被渲染1次,因此可以提高游戏的FPS。限制:加入到CCSpriteBatchNode 中的CCSprite必须使用同一张纹理图
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

减少内存开销的方法有哪些?图片压缩方法有哪些?

回答:及时释放,减少泄露,重用资源,plist,延迟加载,分部加载等。调整加载图片的方式,改变图片的格式,.pvr,pngquant压缩图片 、32位图片改为16图片加载
  • 1
  • 2
  • 1
  • 2

cache的机制原理

回答:把新加进内存的资源做一个hashmap存储,每一个资源加一个key。每次加载资源的时候,先查找资源是否存在,存在直接返回,否则加载进内存。
  • 1
  • 1

场景切换的内存处理过?

回答:先构建新场景,然后显示新场景,然后释放旧场景。但是在新场景onEnter,旧场景onExit的时候,会调用旧场景的cleanup,清理schedule相关部分。
  • 1
  • 2
  • 1
  • 2

说一下CCAction和CCActionMessager

CCAction是动作的基类,主要使用CCFiniteTimeAction有限次动作执行,就是按时间顺序执行一系列动作,执行完后动作结束;CCFiniteTimeAction又分为CCActionInstanse(瞬时动作的基类)和CCActionInterval(延时动作的基类)。CCActionInstanse:没什么特别,跟CCActionInterval主要区别是没有执行过程,动作瞬间就执行完成了;CCActionInterval:执行需要一定的时间(或者说一个过程)。我们用的最多的就是延时动作,下面对它进行单独介绍。CCActionMessage是管理所有Action的单例,一般情况下并不直接使用这个单例,而是使用CCNode的接口,但是假如你想操作的目标不是CCNode的子类或者你想暂停/恢复行动就要使用到CCActionMessager
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

cocos2dx中,触摸的优先级的规则

this->mTouchPriportyLayer 优先级越小越高越先响应事件同等优先级下,后添加的Layer先响应事件
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

(六)屏幕适配相关 
cocos2d-x的屏幕适配解决方案?

回答:pEGLView->setDesignResolutionSize(480, 320, kResolutionNoBorder);第三个参数,kResolutionExactFit:会靠拉伸来填满屏幕,举例来说背景图会变形来填充屏幕,因为1024:768=1.3480:320=1.5,宽高比不同,图片也就无法等比缩放来填满屏幕,只能变形了。kResolutionNoBorder: 看不到黑边,实际就是宽高等比缩放,但缩放比例取宽比和高比之中大的那一个。kResolutionShowAll:全部显示,可以理解为保证内容都显示在屏幕之内,实际也是宽高等比缩放,但缩放比例取宽比和高比之中小的那一个
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

(七)其他 
列举几种多线程的同步机制

 临界区, 事件, 互斥量,信号量
  • 1
  • 1

说一说同步与互斥的区别

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源  
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

是不是一个父类写了virtual函数,如果子类覆盖他的函数不加virtual也能实现多态?

是的,virtual会被隐形的继承的
  • 1
  • 2
  • 1
  • 2

如何判断一段程序是由C编译的还是由C++编译的?

如果是要你的代码在编译时发现编译器类型,就判断_cplusplus或_STDC_宏,通常许多编译器还有其他编译标志宏,#ifdef __cplusplus       cout<<"c++";#else       cout<<"c";#endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

简述数组与指针的区别,引用和指针的区别

数组时连续分配一串单元,数目开始定义的时候就必须固定下来,看起来整洁,但是写的程序是死程序,容易浪费内存指针存放一个地址值,表示指向某一个单元,可以用指针来索引单元。数组可以完成栈,堆,树等等的操作,它在编程时候的好处是非常的灵活,在构建思路的时候有很大的灵活性指针是一个实体,而引用仅是个别名;引用使用时无需解引用(*),指针需要解引用;引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终” ^_^引用没有 const,指针有 constconst 的指针不可变;引用不能为空,指针可以为空;“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;sizeof(T) == sizeof(T&) 恒为真,但是当引用作为类成员名称时,其占用空间与指针相同4个字节(没找到标准的规定)。指针和引用的自增(++)运算意义不一样;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
0
0 0