文档章节

9秒学院总结Cocos2d-X面试题

g
 guomaiomaio
发布于 2015/08/17 11:08
字数 1611
阅读 201
收藏 0

1.autoreleaserelease的区别

 

    release是立即释放引用计数,如果到达0,对象被销毁。

    autorelease是延迟释放,是为了更好管理内存产生的。比如如下代码:

v

CCObject *fun() 

   CCObject *myobj = new CCObject(); 

   //myobj->release();                   //语句

   //myobj->autorelease()                //语句

   return myobj; 

    如果不调用语句1语句2,会导致内存泄露,根据函数定义原则,谁污染谁治理,如果要求外部调用者释放,不科学。

    如果调用语句1,会立即被释放,外部调用者无法获取对象。

    调用语句2,延迟被释放,可以保证外部调用者获得对象指针,而又会被释放。

    autorelease的实现机制,是将对象加入一个pool统一管理,当poolrelease时,pool里面每个对象都会被releasepool基于一个栈式结构管理,每一个mainlooppop一次。同一个mainloop里面调用autorelease,会把引用加入栈顶pool

 

 

2.cocos2d-x的图形渲染机制是什么

 

    只知道是每一帧调用mainloop,然后drawScene.

 

 

3.cache机制原理是什么

 

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

 

 

4.场景切换的内存处理过程是什么

 

    先构建新场景,然后显示新场景,然后释放旧场景。

    但是在新场景onEnter,旧场景onExit的时候,会调用旧场景的cleanup,清理schedule相关部分。

5.动作回调函数是怎么作用的其原理是什么

    target(回调对象指针)加 selector(回调函数指针)。

 

 

6.还有减少内存开销的方法有哪些,图片压缩方法有哪些

 

    及时释放,减少泄露,重用资源,延迟加载,分部加载等。

   

    一般的图片是4通道32位,即一个像素用4个字节表示,每个字节依次表示ARGB,即alpharedgreenblue。那么图片占用的内存可以算出。

    压缩像素即减少图片像素点多少,内存即减少。但是图片会变小。

   

    压缩图片质量,即不用4个字节表示一个像素,如256色,就是用一个字节表示一个像素,每2bit表示一个通道。但是图片表现效果变差。

 

 

    PS:转换图片质量不能减少内存使用,比如把png换成jpg,原因上面说的。

 

7.cocos2d-x 如何处理、存储、显示中文字符串,比如 玩家的名字,用户名,密码。存储在本地的文件里面,该如何处理才能防止不乱码?

         使用 iconv 库进行转换。或者XML 进行存储。

 

 

 

 

8.简述cocos2d-x的屏幕适配解决方案

        

         pEGLView->setDesignResolutionSize(480, 320, kResolutionNoBorder);第三个参数,找到定义:

讲得很清楚了:

kResolutionExactFit:会靠拉伸来填满屏幕,本例来说背景图会变形来填充屏幕,因为1024:768=1.3 480:320=1.5,宽高比不同,图片也就无法等比缩放来填满屏幕,只能变形了。

kResolutionNoBorder 看不到黑边,实际就是宽高等比缩放,但缩放比例取宽比和高比之中大的那一个。

kResolutionShowAll:全部显示,可以理解为保证内容都显示在屏幕之内,实际也是宽高等比缩放,但缩放比例取宽比和高比之中小的那一个。

一般来说,我们希望设计时一屏的内容,用户在实际设备上也能在一屏内看到,拿本例来说,1024x768分辨率时,右下角的按钮却跑到屏幕外去了。看完上面的分析,你应该知道如何解决了: 对了,改变pEGLView->setDesignResolutionSize(480, 320, kResolutionNoBorder);第三个参数为kResolutionShowAll

 

 

 

9.简述cocos2d-x内存管理,图片缓存机制

 

cocos2d-x最初移植自cocos2dobjective C版本。因此,在内存管理上,使用了和NSObject类似的引用计数器方法,相关接口放置在CCObject类中。

引用计数器——手动管理内存

CCObject的及其子类的对象在创建时,引用计数自动设置为1。之后每次调用retain,引用计数+1。每次调用release,引用计数-1;若引用计数=0,则直接delete this

retain是在指针传递和赋值时使用的,他的含义是表示拥有。这经常用在指针赋值上。

自动释放池——自动管理内存

对于使用autorelease的对象,不必管它,每帧结束后会自动释放。

CCNode节点管理

cocos2d-x使用节点组成一棵树,渲染的时候要遍历这棵树。CCNode是所有节点类的父类,他内部使用了一个CCArray对象管理他的所有子节点,当对象被添加为子节点时,实际上是被添加到CCArray对象中,同时会调用这个对象的retain方法。同理,从CCArray中移除时,也会调用release方法。

静态工厂

cocos2d-x中存在大量的静态工厂方法,这些方法中,全都对this指针调用了autorelease函数。

cache机制类

 

cache内部也使用了ratainrelease方法,防止这些资源被释放掉。

使用这些cache,我们可以保存预加载的一些资源,在方便的时候调用它,去绑定给一些对象。注意,这些cache在场景切换时,不会自动删除,需要手动调用purgeXXXX方法,进行清理。

 

 

10.简述cocos2d-x 3.0Cocos2d-x 2.X版本有哪些区别? 3.0 版本的新特性.

 

以下提到即可

1

运用了C++ 11  的新特性,例如:

std::function

strongly typed enums

std::thread

override 

2

移除了所有Object-c模式,删除了CC前辍使用纯C++函数    

 

3

所有的单例都使用getInstance() and destroyInstance() 

 

4

创建新项目:

 v3.0不再需要创建Xcode模版,使用create-multi-platform-projects.py来创建一个跨平台的项目,使用方法

 1cd 2dx根目录,MAC平台使用./create-multi-platform-projects.py  然后提示:

-bash: ./create-multi-platform-projects.py: /usr/bin/evn: bad interpreter: No such file or directory

没关系,我们打开.py文件,发现其实引用的是tools/project_creator/create_project.py 这文件

 2,我们再cd project_creator文件中,使用 ./create_project.py -p <PROJECT_NAME> -k <PACKAGE_NAME> -l <cpp|lua|javascript>

 3,这样我们就可以在2dxprojects文件夹中找到创建好的项目

 


© 著作权归作者所有

g
粉丝 1
博文 23
码字总数 26915
作品 0
东城
私信 提问
阿里腾讯百度头条美团iOS面试总结

阿里腾讯百度头条美团iOS面试总结 2018-05-30 15:24编辑: garace分类:程序人生来源:代码湾 互联网面试iOS 招聘信息: C++工程师 Cocos2d-x游戏客户端开发 iOS开发工程师 京东招聘iOS开发工...

garace
2018/05/30
0
0
历数2013年优秀的开源游戏引擎与开源游戏项目

2013年是移动游戏爆发的一年,也是开源游戏爆发的一年!在这里,我们历数一下2013年都有哪些优秀的开源游戏诞生,还有哪些优秀的开源游戏技术解决方案诞生! 开源跨平台2D客户端引擎 Cocos2...

大鸡蛋
2014/01/15
25
0
cocos2d-x横版动作手游《口袋仙侠》商用版正式开源

【9秒原创】Firefly + cocos2d-x的横版rts手机网游《口袋仙侠》alpha V1.0 商用版本完整源码下载 特别声明: 1、《口袋仙侠》项目基于MIT协议,9秒社团团队允许任何厂商及个人对其进行修改和...

大鸡蛋
2014/03/19
15K
69
python 爬虫 极客学院

coding: utf-8import requestsimport reimport sys reload(sys)sys.setdefaultencoding("utf-8") class Spider(object): self.urls = [] self.page = '0' def getPage(self, urlbase='http:/......

hyhlinux
2016/06/11
72
0
原创 cocos2d-x 横版手游《打小三》源码下载!

感谢9秒社团的 9秒北京-lonely的mzplay团队~这次开源的手游作品《打小三》是他们无私奉献的产物~~ 这个产品的详细信息如下: 游戏名称:打小三 游戏类型:横版动作类(ACT) 游戏版本:V1.0 ...

大鸡蛋
2013/12/26
8.4K
14

没有更多内容

加载失败,请刷新页面

加载更多

面向对象方面的一些东东

<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" cont......

流年那么伤
24分钟前
2
0
git 过滤文件夹和文件(IDEA)

最近使用git版本管理工具遇到一件很烦的事情,commit时总会把.idea、.*.iml和target文件添加进来,实际开发中,这些是需要过滤掉的。在.gitnore文件添加了过滤不起作用。下面介绍一种成功过滤...

uug
31分钟前
2
0
Spark Streaming 实时统计商户当日累计PV流量

一、问题 对实时流量日志过滤筛选商户流量,对每个商户的流量进行累计,统计商户实时累计流量。 当时间超过24时时,重新统计当日商户的实时累计流量。 二、实现步骤 1、采用Spark Streaming...

boonya
36分钟前
2
0
如果Task与Event 创建了记录类型后,不出现在Lightning的Activities中

如果在Lightning的Activities没出现这两个Button,但是在页面布局的Lightning 按钮区也存在,全局操作的记录类型就需要选择一个,否则不会出现

在山的那边
45分钟前
2
0
ddd中的子域和界限上下文

我们先来说说子域是什么?子域在我的理解是在一个庞大的系统中可以明显感知的不同的区块,如果在电商模块中,商品目录,订单,物流,库存,发票等等都可以感知他们明显的不同,可以认为是子域...

算法之名
54分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部