MIL15——模拟面试题
MIL15——模拟面试题
C#
-
抽象类中的虚函数和抽象函数,是否必须在子类中重写?
-
当我们使用里式替换原则,用父类容器装载子类对象时,我们通过该父类容器调用其中的一个虚函数,执行的逻辑是父类中的还是子类中的逻辑呢?
-
我们在游戏开发时,想要获取系统时间,应该如何获取?
-
C# 使用
var
声明临时变量相比用指定变量类型声明临时变量,在最终执行时是否会增加性能消耗? -
我们知道,下面的代码
b
改为 20 后,a
还是 10。(值类型的特点)
我们是否可以简单修改以上代码,让b
变成 20 后,a
跟着一起变。请说出修改方案1
2
3int a = 10;
int b = a;
b = 20;
Unity
- Unity 中摄像机组件中的投影(Projection)参数 其中的两个选项:透视投影(Perspective)和 正交投影(Orthographic)有什么区别?
- FSM 和 BT 指什么?他们是用来处理什么的?
- 10000 个
Monobehaviour
,每个各自执行Update
,和放到一个Update
里执行,哪个效率更高?为什么? - 我们在编写代码时,有什么常用的优化代码性能的手段?至少说出 3 点
- OpenGL 和 DirectX 的最大区别是什么?
答案
C#
-
抽象类中的虚函数和抽象函数,是否必须在子类中重写?
子类中虚函数的重写是可选的,当需要在子类中修改逻辑时可以选择重写,抽象函数必须重写
-
当我们使用里式替换原则,用父类容器装载子类对象时,我们通过该父类容器调用其中的一个虚函数,执行的逻辑是父类中的还是子类中的逻辑呢?
- 若子类没有重写虚函数,那么执行的逻辑会是父类中的逻辑
- 若子类重写了虚函数,那么执行的逻辑会是子类中的逻辑(是否执行父类中逻辑,主要看子类重写时是否利用了
base
执行父类逻辑)
-
我们在游戏开发时,想要获取系统时间,应该如何获取?
利用 C# 中提供的
DateTime
类(System
命名空间中),DateTime
中的DateTime.Now
静态成员可以获取到当前的系统时间 -
C# 使用
var
声明临时变量相比用指定变量类型声明临时变量,在最终执行时是否会增加性能消耗?不会,
var
在编译时会被推断为正确的类型,所以在运行时不会引入额外的性能开销。
相当于在编译阶段var
就会被翻译为指定的类型。var
声明临时变量只会影响代码的可读性和可维护性(双刃剑) -
我们知道,下面的代码
b
改为 20 后,a
还是 10。(值类型的特点)
我们是否可以简单修改以上代码,让b
变成 20 后,a
跟着一起变。请说出修改方案1
2
3int a = 10;
int b = a;
b = 20;C# 7 中加入了
ref
的新用法,使用ref
修饰临时变量和函数返回值,可以让赋值变为引用传递,Unity 2018.3 及其以上版本支持 C# 71
2
3int a = 10;
ref int b = ref a;
b = 20;
Unity
-
Unity 中摄像机组件中的投影(Projection)参数 其中的两个选项:透视投影(Perspective)和 正交投影(Orthographic)有什么区别?
- 透视投影:模拟人眼看世界的方式,近大远小,并呈现出显示世界中的景深和透视效果,通常用于制作3D游戏
- 正交投影:不考虑对象到摄像机的距离,所有对象无论在场景中任何位置,都以相同大小显示,通常用于制作2D游戏
-
FSM 和 BT 指什么?他们是用来处理什么的?
- FSM(finite state machine):有限状态机
- BT(Behavior Tree):行为树
他们都是用来制作游戏中AI功能的设计方案
-
10000 个
Monobehaviour
,每个各自执行Update
,和放到一个Update
里执行,哪个效率更高?为什么?放在一个
Update
中执行效率较高,原因:- 因为每调用一次
Update
,相当于就是执行了一次方法,而每一次方法的调用在底层是有开销的,当在一帧里进行过多的方法调用自然会增加额外的开销 - Unity 内部对生命周期函数采用了引用和查找机制,每次调用
Update
时,也会存在查找相关操作,也会增加部分开销
- 因为每调用一次
-
我们在编写代码时,有什么常用的优化代码性能的手段?至少说出 3 点
- 间隔几帧执行一次逻辑(自己手动间隔、协同程序分时分步)
- 在帧更新函数中尽量少用临时变量(比如
Update
、OnGUI
等每帧执行的生命周期函数中) - 定时进行手动垃圾回收(GC)(比如切换场景时)
- 优化数学计算,比如尽量少用浮点数,用乘法代替除法等等
- 应用缓存池
- 尽量减少
Update
生命周期函数的数量
-
OpenGL 和 DirectX 的最大区别是什么?
OpenGL 和 DX 的主要区别就是在于:
- OpenGL 是一个跨平台、跨语言的开放图形库,可以支持各种平台,比如 Windows、Linux、MacOS 等等,
- DirectX 是微软创建的,它不跨平台,只针对微软相关平台,比如 Windows 操作系统,XBOX 主机系
游戏引擎底层就会对图形 API 进行封装,为了适应更多的平台,往往会针对多种图形 API 进行封装