MIL10——模拟面试题
MIL10——模拟面试题
问题
C#
- 内存中,堆和栈的区别是什么?
- TCP协议和UDP协议的区别
- TCP协议的可靠性是如何达到的?
- 内存抖动指什么?如何避免内存抖动
- buff 系统中,如何用一个
byte
,记录多种 buff 状态标识
Unity
- Unity中使用的是左手还是右手坐标系?我们需要注意什么?
- Unity中鼠标、键盘、触屏、手柄等输入事件会在
Update
之前、还是之后、还是同时执行? - Unity中场景中一个处于激活状态的物体(场景上只有这一个物体),不能被摄像机渲染出来,可能有几种情况?(至少说出3种可能的情况)
- Unity制作物理游戏相关功能时,我们采用哪种方式处理位移?为什么?
- Unity热更新解决方案中,Lua 和 ILRuntime 方案的本质是什么?
答案
C#
-
内存中,堆和栈的区别是什么?
答案:
堆和栈是操作系统堆进程占用的内存空间的两种管理方式
- 栈:由操作系统自动分配释放,存放函数的参数值,局部变量值,栈中数据的生命周期随着函数的执行完成而结束
- 堆:一般由程序员分配释放,如果开发人员不释放,程序结束时由操作系统回收
(在 C# 中 托管堆内存 会由 C# 帮助我们管理,存在 GC 垃圾回收机制)
-
TCP协议和UDP协议的区别
答案:
- 连接方面:TCP面向连接,UDP无连接
- 是否可靠:TCP可靠(无差错、不丢失、不重复、按顺序),UDP不可靠
- 传输效率:TCP相对UDP较低
- 连接对象:TCP一对一,UDP n对n
-
TCP协议的可靠性是如何达到的?
答案:TCP协议是通过 检验和、确认应答信号、重发机制、连接管理、流量控制、拥塞控制等手段达到可靠的
-
内存抖动指什么?如何避免内存抖动
答案:
内存抖动指短时间内有大量的对象被创建或者被回收的现象,频繁的内存抖动会造成 GC 频繁运行,造成卡顿避免方式:
- 对象池
- 享元模式
等
-
buff 系统中,如何用一个
byte
,记录多种 buff 状态标识答案:
一个byte,有8位,我们可以让每一位代表一种状态,0代表无,1代表有1
2
3
4
5
6
7
8
9
10
11byte 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
-
Unity中使用的是左手还是右手坐标系?我们需要注意什么?
答案: 左手坐标系 在进行向量相关计算时,要注意左手和右手坐标系的区别
-
Unity中鼠标、键盘、触屏、手柄等输入事件会在
Update
之前、还是之后、还是同时执行?答案: 之前
-
Unity中场景中一个处于激活状态的物体(场景上只有这一个物体),不能被摄像机渲染出来,可能有几种情况?(至少说出3种可能的情况)
答案:
- 在摄像机可视范围外(视口范围外)
- 在摄像机可视范围外(远近裁剪面之外范围)
- 物体的层级不能被摄像机渲染
- 该物体使用了透明材质,处于透明状态
- 该物体使用了单面渲染材质,摄像机看到的是该物体的背面
- 如果存在多摄像机,摄像机深度可能会影响
等等
-
Unity制作物理游戏相关功能时,我们采用哪种方式处理位移?为什么?
答案:通过刚体相关API来处理位移,比如加力、改变刚体速度变量
原因:在碰撞检测时能更准确无误
-
Unity热更新解决方案中,Lua 和 ILRuntime 方案的本质是什么?
答案:
-
Lua 热更本质:
Lua 是解释型语言,不需要实现编译,在运行时动态解释执行。
xLua 和 toLua 等 Lua热更新解决方案,是通过在 Unity 中内置 Lua 虚拟机(解释器)来执行 Lua 逻辑的 -
ILRuntime 热更本质:
ILRuntime 通过读取DLL文件中的 IL 汇编码,通过在 Unity 中内置的 IL 解释执行虚拟机(解释器)来执行热更 DLL 中的代码
总体来说,他们都是在 Unity 中内置各自的解释器(写好的用于解释执行相关的代码)来执行我们的热更新代码
-