游戏开发面试题3
unity如何判断子弹射击到敌人,如果子弹特别快怎么办
- 使用物理学碰撞检测。使用Unity的物理组件,如Rigidbody和Collider,将子弹和敌人都设置为有一定的物理碰撞属性,当子弹碰到敌人的时候,就会触发OnCollisionEnter()事件,这样就可以判断子弹射击到了敌人。
- 如果子弹特别快,可以使用射线检测。可以在子弹发射的时候,每帧在子弹发射点和子弹当前位置之间发射一条射线,检测射线碰撞到的物体,如果碰撞到了敌人,那么就认为子弹射击到了敌人。
状态同步 帧同步原理细节
状态同步是游戏开发中经常用到的技术,它的作用是实现网络游戏中所有客户端的状态的实时同步,让所有玩家看到的游戏状态一致。
帧同步是状态同步的一种实现技术,它利用游戏的帧概念,定义每帧的游戏状态,每帧的游戏状态都会发送到所有的客户端,客户端收到每帧游戏状态后,按照游戏的规则进行游戏模拟,从而实现状态同步。
帧同步原理:首先,服务器端会将当前帧的游戏状态发送给每个客户端;然后,客户端根据每一帧收到的游戏状态,按照游戏的规则,进行游戏模拟,模拟游戏的状态变化,实现每个客户端的游戏状态同步;最后,客户端会将同步后的游戏状态发送到服务器端,服务器端收到客户端发来的游戏状态后,会将此状态发送给其他客户端,从而实现所有客户端的游戏状态同步。
内存对齐概念
内存对齐就是将访问的地址对齐到最小的访问单位,比如访问一个4字节的数据,最小的访问单位是4字节,所以访问地址应该是4字节的整数倍,而不是任意的地址。如果不做内存对齐,会导致读取的数据不准确,这就是内存对齐的作用。
内存对齐的好处:
- 可以提高数据的访问性能。
- 减少内存的访问时间,比如访问4字节的数据,如果不对齐,则需要先读取2字节,再读取2字节,而加上对齐,则只需要读取一次4字节的数据即可。
- 减少内存访问错误和内存碎片。
C#怎么避免频繁装拆箱
- 尽量使用包装类型,在需要使用基本类型的地方优先使用包装类型,而不是自己定义结构体等。
- 优先使用泛型来实现方法,避免装拆箱操作。
递归的定义、优缺点
递归是指一个函数在调用自身的过程中实现某种功能
优点:使用递归,代码结构清晰,可读性和可维护性高。递归将复杂的问题分为一个一个子问题,容易理解
缺点:递归的时间复杂度都很高,还容易造成栈溢出,每次调用都需要在栈中保存参数,浪费大量的内存
面向对象的特性,在项目中的体现
封装:
继承:
多态:
项目中用到了哪些数据结构和算法,应用场景
- 数组:线性数据结构,由一组相同的数据类型组成的集合
- 列表(List)可变的数据结构,可以动态的添加移除元素
- 堆栈(Stack):先进后出的数据结构
- 队列(Queue):先进先出的数据结构
- 链表(LinkList):线性数据结构,由结点构成,每个结点都有一个指向下一个结点的指针
- 哈希表(HashSet):将键映射到值,使用哈希函数确定键的位置
- 字典(Dictionary):由键值对组成,其中每一个键都对应着一个值
C++11新特性
- 右值引用
- 智能指针
- Lanbda函数
- 多线程
智能指针中常用哪些
智能指针可以自动管理内存。如果程序员忘记释放内存,智能指针可以自动释放内存,也可以避免重复的内存分配
- std::unique_ptr:唯一拥有权的智能指针,用于管理独占的动态内存,它有效地防止了内存泄漏;
- std::shared_ptr:共享拥有权的智能指针,可以让多个对象共享同一块内存;
- std::weak_ptr:弱引用智能指针,指向一个std::shared_ptr所管理的对象,它不改变共享对象的引用计数;
- std::auto_ptr:可移动智能指针,可以拥有一个动态内存的拥有权,但不能共享它。