MIL10——模拟面试题

问题

C#

  1. 内存中,堆和栈的区别是什么?
  2. TCP协议和UDP协议的区别
  3. TCP协议的可靠性是如何达到的?
  4. 内存抖动指什么?如何避免内存抖动
  5. buff 系统中,如何用一个 byte​,记录多种 buff 状态标识

Unity

  1. Unity中使用的是左手还是右手坐标系?我们需要注意什么?
  2. Unity中鼠标、键盘、触屏、手柄等输入事件会在 Update​ 之前、还是之后、还是同时执行?
  3. Unity中场景中一个处于激活状态的物体(场景上只有这一个物体),不能被摄像机渲染出来,可能有几种情况?(至少说出3种可能的情况)
  4. Unity制作物理游戏相关功能时,我们采用哪种方式处理位移?为什么?
  5. Unity热更新解决方案中,Lua 和 ILRuntime 方案的本质是什么?

答案

C#

  1. 内存中,堆和栈的区别是什么?

    答案:

    堆和栈是操作系统堆进程占用的内存空间的两种管理方式

    • 栈:由操作系统自动分配释放,存放函数的参数值,局部变量值,栈中数据的生命周期随着函数的执行完成而结束
    • 堆:一般由程序员分配释放,如果开发人员不释放,程序结束时由操作系统回收
      (在 C# 中 托管堆内存 会由 C# 帮助我们管理,存在 GC 垃圾回收机制)
  2. TCP协议和UDP协议的区别

    答案:

    • 连接方面:TCP面向连接,UDP无连接
    • 是否可靠:TCP可靠(无差错、不丢失、不重复、按顺序),UDP不可靠
    • 传输效率:TCP相对UDP较低
    • 连接对象:TCP一对一,UDP n对n
  3. TCP协议的可靠性是如何达到的?

    答案:TCP协议是通过 检验和、确认应答信号、重发机制、连接管理、流量控制、拥塞控制等手段达到可靠的

  4. 内存抖动指什么?如何避免内存抖动

    答案:
    内存抖动指短时间内有大量的对象被创建或者被回收的现象,频繁的内存抖动会造成 GC 频繁运行,造成卡顿

    避免方式:

    • 对象池
    • 享元模式

  5. buff 系统中,如何用一个 byte​,记录多种 buff 状态标识

    答案:
    一个byte,有8位,我们可以让每一位代表一种状态,0代表无,1代表有

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    byte buffType = 0;
    0000 0000
    0000 0001 中毒 buff
    0000 0010 灼烧 buff
    0000 0100 回春 buff
    当状态添加时,进行 或 ( | ) 运算
    buffType | 灼烧 buff = 0000 0010
    buffType | 中毒 buff = 0000 0011
    当状态移除时,进行 异或 ( ^ ) 运算
    buffType 0000 0011
    buffType ^ 中毒 buff = 0000 0011 ^ 0000 0001 = 0000 0010

Unity

  1. Unity中使用的是左手还是右手坐标系?我们需要注意什么?

    答案: 左手坐标系 在进行向量相关计算时,要注意左手和右手坐标系的区别

  2. Unity中鼠标、键盘、触屏、手柄等输入事件会在 Update​ 之前、还是之后、还是同时执行?

    答案: 之前

    image

  3. Unity中场景中一个处于激活状态的物体(场景上只有这一个物体),不能被摄像机渲染出来,可能有几种情况?(至少说出3种可能的情况)

    答案:

    1. 在摄像机可视范围外(视口范围外)
    2. 在摄像机可视范围外(远近裁剪面之外范围)
    3. 物体的层级不能被摄像机渲染
    4. 该物体使用了透明材质,处于透明状态
    5. 该物体使用了单面渲染材质,摄像机看到的是该物体的背面
    6. 如果存在多摄像机,摄像机深度可能会影响

    等等

  4. Unity制作物理游戏相关功能时,我们采用哪种方式处理位移?为什么?

    答案:通过刚体相关API来处理位移,比如加力、改变刚体速度变量

    原因:在碰撞检测时能更准确无误

  5. Unity热更新解决方案中,Lua 和 ILRuntime 方案的本质是什么?

    答案:

    • Lua 热更本质:

      Lua 是解释型语言,不需要实现编译,在运行时动态解释执行。
      xLua 和 toLua 等 Lua热更新解决方案,是通过在 Unity 中内置 Lua 虚拟机(解释器)来执行 Lua 逻辑的

    • ILRuntime 热更本质:

      ILRuntime 通过读取DLL文件中的 IL 汇编码,通过在 Unity 中内置的 IL 解释执行虚拟机(解释器)来执行热更 DLL 中的代码

    总体来说,他们都是在 Unity 中内置各自的解释器(写好的用于解释执行相关的代码)来执行我们的热更新代码