1.autorelease和release的区别javascript
release是当即释放引用计数,若是到达0,对象被销毁。java
autorelease是延迟释放,是为了更好管理内存产生的。好比以下代码:缓存
vbash
CCObject *fun() ide
{ 函数
CCObject *myobj = new CCObject(); oop
//myobj->release(); //语句1 this
//myobj->autorelease() //语句2 lua
return myobj; spa
}
若是不调用语句1语句2,会致使内存泄露,根据函数定义原则,谁污染谁治理,若是要求外部调用者释放,不科学。
若是调用语句1,会当即被释放,外部调用者没法获取对象。
调用语句2,延迟被释放,能够保证外部调用者得到对象指针,而又会被释放。
autorelease的实现机制,是将对象加入一个pool统一管理,当pool被release时,pool里面每一个对象都会被release。pool基于一个栈式结构管理,每个mainloop会pop一次。同一个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,即alpha,red,green,blue。那么图片占用的内存能够算出。
压缩像素即减小图片像素点多少,内存即减小。可是图片会变小。
压缩图片质量,即不用4个字节表示一个像素,如256色,就是用一个字节表示一个像素,每2个bit表示一个通道。可是图片表现效果变差。
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最初移植自cocos2d的objective 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内部也使用了ratain和release方法,防止这些资源被释放掉。
使用这些cache,咱们能够保存预加载的一些资源,在方便的时候调用它,去绑定给一些对象。注意,这些cache在场景切换时,不会自动删除,须要手动调用purgeXXXX方法,进行清理。
10.简述cocos2d-x 3.0与Cocos2d-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来建立一个跨平台的项目,使用方法
1,cd 到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,这样咱们就能够在2dx的projects文件夹中找到建立好的项目