欢迎来到光光的奇妙冒险,我是你们的煎饼光子老师。
今天是我们的第十期试题总结。
C#部分:
1、内存中,堆和栈的区别是什么?
答案:
堆和栈是操作系统堆进程占用的内存空间的两种管理方式
栈:由操作系统自动分配释放,存放函数的参数值,局部变量值,栈中数据的生命周期随着函数的执行完成而结束
堆:一般由程序员分配释放,如果开发人员不释放,程序结束时由操作系统回收
(在C#中 托管堆内存 会由 C#帮助我们管理,存在GC垃圾回收机制)
更多更全面的堆栈区别讲解:
https://blog.csdn.net/K346K346/article/details/80849966/
2、TCP协议和UDP协议的区别
答案:
连接方面:TCP面向连接,UDP无连接
是否可靠:TCP可靠(无差错、不丢失、不重复、按顺序),UDP不可靠
传输效率:TCP相对UDP较低
连接对象:TCP一对一,UDP n对n
3、TCP协议的可靠性是如何达到的?
答案:
TCP协议是通过 检验和、确认应答信号、重发机制、连接管理、流量控制、拥塞控制等手段达到可靠的
具体的一些理论知识,可以浏览该文章
http://www.360doc.com/content/22/1111/20/78411425_1055522293.shtml
4、内存抖动指什么?如何避免内存抖动
答案:
内存抖动指短时间内有大量的对象被创建或者被回收的现象
频繁的内存抖动会造成 GC 频繁运行,造成卡顿
避免方式:
对象池
享元模式
等
5、buff 系统中,如何用一个 byte,记录多种buff状态标识
答案:
一个byte,有8位,我们可以让每一位代表一种状态,0代表无,1代表有
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 之前、还是之后、还是同时执行?
答案:
之前,具体可以查看生命周期函数的那张图片
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中内置各自的解释器(写好的用于解释执行相关的代码)来执行我们的热更新代码