MIL3——模拟面试题
MIL3——模拟面试题
问题
C#
-
泛型的约束有哪几种?
-
什么是闭包?可以举例说明
-
内存泄漏指什么?常见的内存泄漏有哪些?
-
序列化是什么?常见的序列化方式有哪些?什么时候我们会用到序列化?
-
请问A、B、C 三处打印结果分别为多少?为什么?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29static unsafe void Main(string[] args)
{
int test1Value = 10;
Test1(test1Value);
Console.WriteLine($"A:{test1Value}");
int test2Value = 10;
Test2(&test1Value);
Console.WriteLine($"A:{test2Value}");
int test3Value = 10;
Test3(ref test3Value);
Console.WriteLine($"A:{test3Value}");
}
private static void Test1(int value)
{
value += 90;
}
private unsafe static void Test2(int* value)
{
*value += 90;
}
private static void Test3(ref int value)
{
value += 90;
}
Unity
-
transform.forward
和Vector3.forword
的区别 - Unity中如何解决过多创建和删除对象带来的卡顿问题?
- 游戏中的成就系统,我们一般会使用设计模式中的哪种模式来制作? 为什么?
- 请简述热更新的流程
- 我们应该如何优化UI(基于UGUI)
答案
C#
-
泛型的约束有哪几种?
答案:
- 值类型约束
T:struct
- 引用类型约束
T:class
- 公共无参构造约束
T:new()
- 类约束
T:类名
- 接口约束
T:接口名
- 另一个泛型约束
T:U
- 值类型约束
-
什么是闭包?可以举例说明
答案:
闭包是指有权访问另一个函数作用域中的变量的函数
所以闭包一般都是指的一个函数
创建这种特殊闭包函数的方式往往是在一个函数中创建另一个函数 -
内存泄漏指什么?常见的内存泄漏有哪些?
答案:
内存泄漏指的就是对象超过生命周期后而不能被GC回收,
一般指不会再使用的引用对象由于某些操作而不能被GC垃圾回收,而一直占用着内存
更风趣通俗一点的说就是:没用的家伙没有被当成垃圾回收常见的内存泄漏有:
- 静态引用,也就是
static
的引用类型变量 - 不使用的引用对象没有置
null
,一直被引用 - 文件操作时,没有使用
using
或者没有进行Dispose()
- 委托或事件注册后没有解除注册(有加就有减)
等等
- 静态引用,也就是
-
序列化是什么?常见的序列化方式有哪些?什么时候我们会用到序列化?
答案:
序列化是将程序中数据对象转换为可以存储或传输的形式 的过程。
举例:
比如我们常见的序列化方式 xml、Json、2进制等。
就是将内存中的数据按照我们自己定义的规则进行序列化,序列化之后就可以用于存储和传输,
当读取和接受数据时,只需要按照对应规则进行反序列化便可得到原始数据
所谓的存储读取和传输接受,其实一般指的就是数据持久化和网络通讯
所以我们经常会在这两块知识点看到序列化反序列化这两个关键词 -
请问A、B、C 三处打印结果分别为多少?为什么?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29static unsafe void Main(string[] args)
{
int test1Value = 10;
Test1(test1Value);
Console.WriteLine($"A:{test1Value}");
int test2Value = 10;
Test2(&test1Value);
Console.WriteLine($"A:{test2Value}");
int test3Value = 10;
Test3(ref test3Value);
Console.WriteLine($"A:{test3Value}");
}
private static void Test1(int value)
{
value += 90;
}
private unsafe static void Test2(int* value)
{
*value += 90;
}
private static void Test3(ref int value)
{
value += 90;
}答案:
A
是10,B
和C
为100-
Test1
处参数传递进去后,函数内部的形参value
是在栈上重新开辟的空间,将传入参数的值拷贝到了该空间中,和传入参数没有关系 -
Test2
处参数是指针类型,指针是用于存储内存地址的变量,我们传入的是值得地址&test2Value
,
在函数内部改变的是地址中存储的值,所以外部的test2Value
会随之改变 -
Test3
处ref
关键字,底层逻辑中是将value
作为test3Value
的一个别名,他们指向的空间一致,
所以value
改变后,外部的test3Value
也会改变
-
Unity
-
transform.forward
和Vector3.forword
的区别答案:
-
Vector3.forword
始终时(0,0,1)
可以认为是世界坐标系的Z轴朝向 -
transform.forword
是当前物体的局部坐标系的Z轴在世界坐标系下的朝向 可以认为是物体自己的Z轴朝向
-
-
Unity中如何解决过多创建和删除对象带来的卡顿问题?
答案: 可以通过协同程序,分时分步创建或删除,原理是避免一帧中处理太多对象
-
游戏中的成就系统,我们一般会使用设计模式中的哪种模式来制作? 为什么?
答案: 观察者模式,Unity基础小框架中 讲解的 事件中心 就是基于观察者模式的 是一种订阅通知机制
-
请简述热更新的流程
答案:本地存在资源对比文件和已有资源
- 下载资源服务器中的对比文件
- 将下载下来的远端对比文件和本地的做对比,记录需要更新的资源和要移除的资源
- 根据第二步中记录的信息,进行资源下载和移除
- 更新本地对比文件,其内容和刚才下载的远端对比文件一致
-
我们应该如何优化UI(基于UGUI)
答案:
-
性能上
- 打图集,将同一画面的图片放入一个图集中,目的是减少DrawCall
- 面板中的图片和文字尽量不要交叉,因为这样会产生多余的DrawCall
- 取消勾选不必要的射线检测,UI组件上的
- 减少透明图片的重叠使用
等等
-
内存上
- 大图尽量使用9宫格缩放,让美术设计UI面板底图时不要过于复杂,尽量是有规律的纹理和颜色变化
- 图片的RGBA通道分离
等等
-