面试 cocos2dx

这篇博客详细讲解了Cocos2d-x面试中的关键知识点,包括Cocos2d-x的程序结束流程、内存管理、3.x版本特性、对象生命周期(如CCScene、CCLayer、CCSprite、CCNode)、CCAction和CCActionMessage的使用、屏幕适配策略、数据存储(CCUserDefault和SQLite)、内存优化方法、设计模式的应用以及游戏性能优化策略等。重点讨论了内存分配与释放、引用计数机制、引用与指针的区别,并提供了优化游戏手感和代码质量的建议。
摘要由CSDN通过智能技术生成

2.cocos2d-x 程序的结束流程?

  程序运行时期,由 mainLoop 方法维持运行着游戏之内的各个逻辑,当在弹出最后一个场景,或者直接调用 Director::end(); 方法后,触发游戏的清理工作,执行 purgeDirector 方法,从而结束了 EGLView(不同平台不同封装,PC使用OpenGl封装,移动终端封装的为 OpenGl ES) 的运行,调用其 end() 方法,从而直接执行 exit(0); 退出程序进程,从而结束了整个程序的运行。(Android 平台的 end() 方法内部通过Jni 方法 terminateProcessJNI(); 调用 Java 实现的功能,其功能一样,直接结束了当前运行的进程)

3、cocos2d-x内存管理?

  目前主要有两种实现智能管理内存的技术,一种是引用计数,一种是垃圾回收。Cocos2d-x采用的是引用计数机制。为此实现了自己的根类CCObject,每个对象都包含了一个用来控制生命周期的引用计数器,就是CCObject的成员变量m_uReference。

  对于m_uReference,构造函数创建时对该引用计数器赋值为1(自引用,并没有实际的使用),当需要引用对象时调用retain()方法增1,当引用结束的时候调用release()方法减一。而autorelease()方法(create工厂方法迫切需要)会将对象放入自动回收池(CCAutoReleasePool)实现灵活的垃圾回收。当每一帧结束的时候,自动回收池中的对象都会被执行一次release()

autorelease()方法里面代码将该对象添加到自动释放池中:CCPoolManager::sharedPoolManager()->addObject(this);

create方法将对象加入内存池后,对象的所有权已经属于内存池了, 我们返回的指针其实是没有所有权的. 主循环mainloop干了件非常重要的事情, 那就是pop最上层的autorelease pool, 此时是在release全部仅仅由此内存池所有的对象. 就是依靠这样的原理, 我们可以放心的将对象放在autorelease pool中, 知道在需要的时候, 这个对象就能正确的释放, 同时只要有上层的父节点通过addChild对游戏对象有了所有权以后, 又能正确的保证该对象不会被删除.

如果在一帧之内生成了大量的autorelease对象,将会导致回收池性能下降。因此,在生成autorelease对象密集的区域(通常循环中)的前后,我们最好可以手动创建并释放一个回收池。CCAut0m_pReleasePoolStack

 CCPoolManager::sharePoolManage()->push()  

 for(){}

 CCPoolManager::sharePoolManage()->pop()

  CCAutoreleasePool

 

 

4、Cocos2d-x 3版本的特性?

3.0版1、将有一个新的渲染系统(epenGL ES 2.0)。

2、支持多线程,并且易于支持新的GPU平台。

    3、更快,更高效也更易于维护的Label文本绘制。

 4、拥有一个新的,统一的事件派发器(EventDispacher)。

 5、减少对objectc的兼容考虑,更多考虑对C++开发者更友好。用C++最佳实践,替换掉了objectc模式;移除匈牙利命名法。

 6、menu和action可以接受Lambda表达式作为输入

 

 

5、阐述cocos2d-x 中CCScene CCLayer CCSprite CCNode

CCNode是CCScene,CCLayer,CCSprite的基类,是一个抽象类,没有可视化的表现形式。是为了方便构造渲染树而定义的一个类。CCScence是场景类,里面可以放CCLayer和CCSprite。一个app里面可以放多个scence,但是同一时刻只有一个scence被激活。CCLayer是层类,里面可以放CCSprite。CCSprite是最小的精灵单元。

 

 

6、说一下CCActionCCActionMessager

CCAction是动作的基类,所有的动作都派生自这个类,它创建的一个对象代表一个动作,动作作用于CCNode。主要使用CCFiniteTimeAction有限次动作执行,就是按时间顺序执行一系列动作,执行完后动作结束;CCFiniteTimeAction 继承自CCAction。CCFiniteTimeAction又分为CCActionInstanse(瞬时动作的基类)和CCActionInterval(延时动作的基类)。

 

CCActionInstanse:没什么特别,跟CCActionInterval主要区别是没有执行过程,动作瞬间就执行完成了;CCActionInterval:执行需要一定的时间(或者说一个过程)。我们用的最多的就是延时动作,下面对它进行单独介绍。

 

     CCActionMessage是管理所有Action的单例,一般情况下并不直接使用这个单例,而是使用CCNode的接口,(CCNiode*)->runaction()

 

而在runaction函数里,通过CCActionMessage动作管理类将新的CCAction和对应的目标节点添加到其管理的动作表中。

m_pActionManager->addAction(action, this, !m_bIsRunning); 再调用 action->startWithTarget(pTarget);

CCActionMessage的初始化在CCDirector的初始化里执行。在里面通过CCSchedule定时调度器为CCActionMessage注册了一个定期更新任务。所以每一帧刷新更新时都会触发CCActionMessage的update方法,系统都会遍历动作表中每一个动作,并调用该动作的setup方法。

 但是假如你想操作的目标不是CCNode的子类或者你想暂停/恢复行动就要使用到CCActionMessager

 

7、简述CCSpriteframeCache   CCSpriteBatchNode,并说出CCNode,CCSprite是如何实现绘制的?

CCSpriteframeCache:精灵框帧缓存,缓存了精灵框帧,主要是为了处理多张碎图合并出来的纹理图片。由于一张大图包含了多张小图所以不适合使用CCTextureCache。

CCSpriteBatchNode 中的所有CCSprite只会被渲染1次,因此可以提高游戏的FPS,但是加入到 CCSpriteBatchNode 中的CCSpr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值