英雄互娱面试题目

    xiaoxiao2021-12-14  22

    1. 如何避免内存泄漏,如何查找内存泄漏。 答: 每开辟一片内存的时候要时刻记着对它的释放,防御型编程,断言,异常处理, windows下查看任务管理器,查看进程,检查代码块 Mac下用Instrument工具来检测内存使用状况 2. 列举Cocos2dx内常用设计模式,并举例说明。 答: 工厂模式: 工厂方法是程序设计中一个经典的设计模式,指的是基类中只定义创建对象的接口,将实际的实现推迟到子类中。在这里,我们将它稍加推广,泛指一切生成并返回一个对象的静态函数 单例模式:Director,精灵帧缓存,Audio音频管理,均为单例模式,实现为封装一个私有静态变量,构造函数被设计成私有的,并提供一个公有的静态获取实例函数(为程序健壮性考虑,还需要考虑防止被复制,“=”的重载,多线程并发访问问题处理) 观察者模式:当我们想要监听一个动作,但是不能老是盯在这一件事情上,还有其他时间需要我们监听的时候就可以用到观察者模式。cocos2dx中封装为 NotificationCen ter 就是被观察者含有一个数组,里边存放了所有观察者的引用,在被观察者的状态发生改变的时候,通过调用观察者的函数来通知观察者,实现了信息的传递。 委托设计模式: // 总结来说,代理者模式就是设置一个虚拟的对象类,实例化的时候传入需要委托的对象,以便操作真实的对象     // 抽象角色:代理角色与真实角色的共用接口     // 代理角色:代理对象角色内部含有对真实对象的引用 ,     // 而可以操作真实对象 , 同时代理对象提供与真实对象相同的     // 接口以便在任何时刻都能代替真实对象。同时 , 代理对象可     // 以在执行真实对象操作时 , 附加其他的操作 , 相当于对真实     // 对象进行封装。    // 真实角色:真实需要调用的 对象 3. 简述Action的父类及子类继承结构和用途。 答: 有两个父类Ref,Clonable  所有的动作允许克隆 三个子类:FiniteTimeAction,Follow,Speed 受时间限制的动作,允许精灵跟随另一个精灵的动作,动作运行时改变其运动速率 4. 减少内存开销的方法有哪些?图片压缩的方法有哪些? 答:纹理图集和缓存。将多张小图拼成一张大图,绘制为纹理图片。 (1)减少绘制调用。使用CCSpriteBatchNode  (2)按照最大到最小的顺序的加载纹理  (3)避开内存使用高峰、  (4)当不需要的时候释放无用的资源  (5)当有内存警告的时候释放缓存的资源  (6)使用texturePacker来优化纹理尺寸,格式,色彩深度。  (7)小心使用JPG文件  (8)使用16位RBGA4444色彩深度的纹理  (9)避开加载大尺寸图片  5. cache机制原理是什么? 纹理缓存TextureCache 、精灵帧缓存SpriteFrameCache 、动画缓存 AnimationCache 答:将资源添加统一添加到缓存池中,在程序的生命周期之内,拿来使用,好处是可以 减少文件读取次数,减少OpenGL绘制并加速渲染,减少内存消耗 ,坏处是不使用的时候也不能立即释放,占用系统资源 void removeSpriteFramesFramesFromFile(string &plist)//指定移除帧缓存  void removeUnusedSpriteFrames()// 移除未使用到的精灵帧 6. cocos2d-x的图形渲染机制是什么? 答: 从Cocos2d-x3.0开始,Cocos2d-x引入了新的渲染流程,它不像2.x版本直接在每一个node中的draw函数中直接调用OpenGL代码进行图形渲染,而是通过各种RenderCommand封装起来,然后添加到一个CommandQueue队列里面去,而现在draw函数的作用就是在此函数中设置好相对应的RenderCommand参数,然后把此RenderCommand添加到CommandQueue中。最后在每一帧结束时调用renderer函数进行渲染,在renderer函数中会根据ID对RenderCommand进行排序,然后才进行渲染。 7. autorelease和release的区别? 答:autorelease实际上是将release的调用延迟了 cocos2dx由于是移植自cocos-iphone,所以内存机制也为引用计数内存管理机制。 引用计数默认值为0,创建对象、加入数组、加入父节点均会使该对象的引用计数+1,此外每引用一次也会使引用计数+1,从父节点移除、从数组中移除会使引用计数-1,当引用计数为0时,系统回收资源,释放内存。对于一些难以手动释放的,或者不便于立即释放的对应,可以将其放入自动释放池autoreleas pool 中。对于存入自动释放池中的对象,每一个runloop均会清除引用计数为0的对象。 1)在Iphone项目中,大家会看到一个默认的Autorelease pool,程序开始时创建,程序退出时销毁,按照对Autorelease的理解,岂不是所有autorelease pool里的对象在程序退出时才release, 这样跟内存泄露有什么区别? 答案是,对于每一个Runloop, 系统会隐式创建一个Autorelease pool,这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。 那什么是一个Runloop呢? 一个UI事件,Timer call, delegate call, 都会是一个新的Runloop。 8.常引用的使用时机 当既要使用“引用”所带来的高效率时又避免避免参数在函数体内被修改时,使用常引用。
    转载请注明原文地址: https://ju.6miu.com/read-968384.html

    最新回复(0)