cocos2dx 面试题

本文详细解答了cocos2dx跨平台实现、程序启动与结束流程、内存管理、内存泄漏检测工具、版本特性、核心组件如CCScene、CCLayer、CCSprite、CCNode的职责,以及动作处理、内存优化策略、数据结构如Vector和Map的使用、图形渲染机制等内容,涵盖了cocos2dx开发的多个关键知识点。
摘要由CSDN通过智能技术生成

1、Cocos2d-x是怎样实现跨平台?
  AppDelegate 作为跨平台程序入口,在这之上做了另一层的封装,封装了不同平台的不同实现。比如我们通常认为一个程序是由 main 函数开始运行,那我们就去找寻,我们看到了在 proj.linux 目录下存在 main.cpp 文件。在main.cpp 中 CCApplication::sharedApplication()–>run(); 这一句看起,这一句标志着, cocos2d-x 程序正式开始运行,现在定位到 sharedApplication() 方法的实现,在CCAplication类中我们可以看到从 sharedApplication() 方法,在调用 run() 方法,在这之前,我们需要调用到它的构造函数,否则不能运行,这就是为什么在 CCApplication::sharedApplication()–>run(); 之前,我们首先有语句 AppDelegate app; 而创建 AppDelegate 变量的原因是 AppDelegate 是 CCApplication 的子类,在创建子类对象的时候,调用其构造函数的同时,父类构造函数也会执行,然后就将 AppDelegate 的对象赋给了 CCApplication 的静态变量,而在 AppDelegate 之中我们实现了 applicationDidFinishLaunching方法,所以在 CCApplication 中 run 方法的开始处调用的就是 AppDelegate 之中的实现。而我们在此方法中我们初始化了一些变量,创建了第一个 CCScene 场景等,之后的控制权,便全权交给了CCDirector::sharedDirector()–>mainLoop(); 方法了。
在cocos2d-x的文件夹下,有一个platform文件夹,里面存放了跨平台的封装接口。当前目录下有CCApplicationProtocol.h头文件,子目录有win32,Android,IOS三个文件夹,里面分别存放跨平台需要的函数,其中包括CCApplication。而AppDelegate 类则是继承自CCApplication。CCApplication又继承自
CCApplicationProtocol。在CCApplicationProtocol中定义了applicationDidFinishLaunching虚方法,由CCApplication 继承, AppDelegate 实现的。以此实现了跨平台。
java输入→Jni→c++输入→c++处理(API实现)→c++输出→Jni→java输出
而在Android 平台启动 cocos2d-x程序。可以找到Android 平台与上面等价的入口点,proj.android/jni/hellocpp/main.cpp。在main.cpp文件里面并没有看到 main 函数,这是由于不同的平台封装所以有着不同的实现,在 Android 平台,默认是使用 Java 开发,可以使用 Java 通过 Jni 调用 C++ 程序,而这里也正式如此。我们暂且只需知道,由 Android 启动一个应用,通过各种峰回路转,最终执行到了 Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit 函数,由此,变开始了我们 cocos2d-x Android 平台的程序入口处。,其它平台程序的入口必然包含着其它平台的不同封装实现 。
参考:http://blog.leafsoar.com/archives/2013/05-05.html

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

3、cocos2d-x内存管理?
Cocos2d-­‐x 中所有内存管理方式的基础是引用计数,动态分配一个 Ref 对象后其引用计数为 1,并通过 retain 和 release 来增持和减少其引用计数。引用计数本身并不能帮助我们进行内存管理。 为了正确地释放对象的内存, Cocos2d-­x 使用 Objective-­C 里面的自动回收池的机制来管理对象内存的释放。Autorelease 有点类似于一个共享的”智能指针”,该”智能指针”的作用域为一帧,该帧结束后,它将释放自己的引用计数,此时,如果该对象没有被其他”共享指针”引用, 则对象被释放。 如果对象被引用, 则保留。
(详细说明:https://blog.csdn.net/whuancai/article/details/23347143)

4、Cocos2d-x中如何处理内存泄露,处理内存泄露有哪些检测工具,如何针对crash后的游戏声称报告发送回服务器
 VS下内存泄露检测工具Visual Leak Detector:教程http://blog.csdn.net/onerain88/article/details/8574938
xcode ios下内存泄露使用Instruments来查找程序中的内存泄露:http://blog.csdn.net/totogo2010/article/details/8233565

5、Cocos2d-x 3版本的特性?
3.0版 1、将有一个新的渲染系统。
    2、支持多线程,并且易于支持新的GPU平台。
3、更快,更高效也更易于维护的Label文本绘制。
   4、拥有一个新的,统一的事件派发器。
   5、减少对objectc的兼容考虑,更多考虑对C++开发者更友好。用C++最佳实践,替换掉了objectc模式。移除匈牙利命名法。
   6、menu和action可以接受Lambda表达式作为输入
6、阐述cocos2d-x 中CCScene CCLayer CCSprite CCNodee
  CCNode是CCScene,CCLayer,CCSprite的基类,是一个抽象类,没有可视化的表现形式。是为了方便构造渲染树而定义的一个类。CCScence是场景类,里面可以放CCLayer和CCSprite。一个app里面可以放多个scence,但是同一时刻只有一个scence被激活。CCLayer是层类,里面可以放CCSprite。CCSprite是最小的精灵单元。

7、说一下CCAction和CCActionMessager
CCAction是动作的基类,所有的动作都派生自这个类,它创建的一个对象代表一个动作,动作作用于CCNode。主要使用CCFiniteTimeAction有限次动作执行,就是按时间顺序执行一系列动作,执行完后动作结束;CCFiniteTimeAction 继承自CCAction。CCFiniteTimeAction又分为CCActionInstanse(瞬时动作的基类)和CCActionInterval(延时动作的基类)。
CCActionInstanse:没什么特别,跟CCActionInterval主要区别是没有执行过程,动作瞬间就执行完成了;CCActionInterval:执行需要一定的时间(或者说一个过程)。我们用的最多的就是延时动作,下面对它进行单独介绍。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值