MIL15——模拟面试题

C#

  1. 抽象类中的虚函数和抽象函数,是否必须在子类中重写?

  2. 当我们使用里式替换原则,用父类容器装载子类对象时,我们通过该父类容器调用其中的一个虚函数,执行的逻辑是父类中的还是子类中的逻辑呢?

  3. 我们在游戏开发时,想要获取系统时间,应该如何获取?

  4. C# 使用 var​ 声明临时变量相比用指定变量类型声明临时变量,在最终执行时是否会增加性能消耗?

  5. 我们知道,下面的代码 b​ 改为 20 后,a​ 还是 10。(值类型的特点)
    我们是否可以简单修改以上代码,让 b​ 变成 20 后,a​ 跟着一起变。请说出修改方案

    1
    2
    3
    int a = 10;
    int b = a;
    b = 20;

Unity

  1. Unity 中摄像机组件中的投影(Projection)参数 其中的两个选项:透视投影(Perspective)和 正交投影(Orthographic)有什么区别?
  2. FSM 和 BT 指什么?他们是用来处理什么的?
  3. 10000 个 Monobehaviour​,每个各自执行 Update​,和放到一个 Update​ 里执行,哪个效率更高?为什么?
  4. 我们在编写代码时,有什么常用的优化代码性能的手段?至少说出 3 点
  5. OpenGL 和 DirectX 的最大区别是什么?

答案

C#

  1. 抽象类中的虚函数和抽象函数,是否必须在子类中重写?

    子类中虚函数的重写是可选的,当需要在子类中修改逻辑时可以选择重写,抽象函数必须重写

  2. 当我们使用里式替换原则,用父类容器装载子类对象时,我们通过该父类容器调用其中的一个虚函数,执行的逻辑是父类中的还是子类中的逻辑呢?

    1. 若子类没有重写虚函数,那么执行的逻辑会是父类中的逻辑
    2. 若子类重写了虚函数,那么执行的逻辑会是子类中的逻辑(是否执行父类中逻辑,主要看子类重写时是否利用了 base​ 执行父类逻辑)
  3. 我们在游戏开发时,想要获取系统时间,应该如何获取?

    利用 C# 中提供的 DateTime​ 类(System​ 命名空间中),DateTime​ 中的 DateTime.Now​ 静态成员可以获取到当前的系统时间

  4. C# 使用 var​ 声明临时变量相比用指定变量类型声明临时变量,在最终执行时是否会增加性能消耗?

    不会,var​ 在编译时会被推断为正确的类型,所以在运行时不会引入额外的性能开销。
    相当于在编译阶段 var​ 就会被翻译为指定的类型。var​ 声明临时变量只会影响代码的可读性和可维护性(双刃剑)

  5. 我们知道,下面的代码 b​ 改为 20 后,a​ 还是 10。(值类型的特点)
    我们是否可以简单修改以上代码,让 b​ 变成 20 后,a​ 跟着一起变。请说出修改方案

    1
    2
    3
    int a = 10;
    int b = a;
    b = 20;

    C# 7 中加入了 ref​ 的新用法,使用 ref​ 修饰临时变量和函数返回值,可以让赋值变为引用传递,Unity 2018.3 及其以上版本支持 C# 7

    1
    2
    3
    int a = 10;
    ref int b = ref a;
    b = 20;

Unity

  1. Unity 中摄像机组件中的投影(Projection)参数 其中的两个选项:透视投影(Perspective)和 正交投影(Orthographic)有什么区别?

    • 透视投影:模拟人眼看世界的方式,近大远小,并呈现出显示世界中的景深和透视效果,通常用于制作3D游戏
    • 正交投影:不考虑对象到摄像机的距离,所有对象无论在场景中任何位置,都以相同大小显示,通常用于制作2D游戏
  2. FSM 和 BT 指什么?他们是用来处理什么的?

    • FSM(finite state machine):有限状态机
    • BT(Behavior Tree):行为树

    他们都是用来制作游戏中AI功能的设计方案

  3. 10000 个 Monobehaviour​,每个各自执行 Update​,和放到一个 Update​ 里执行,哪个效率更高?为什么?

    放在一个 Update​ 中执行效率较高,原因:

    1. 因为每调用一次 Update​,相当于就是执行了一次方法,而每一次方法的调用在底层是有开销的,当在一帧里进行过多的方法调用自然会增加额外的开销
    2. Unity 内部对生命周期函数采用了引用和查找机制,每次调用 Update​ 时,也会存在查找相关操作,也会增加部分开销
  4. 我们在编写代码时,有什么常用的优化代码性能的手段?至少说出 3 点

    1. 间隔几帧执行一次逻辑(自己手动间隔、协同程序分时分步)
    2. 在帧更新函数中尽量少用临时变量(比如 Update​、OnGUI​ 等每帧执行的生命周期函数中)
    3. 定时进行手动垃圾回收(GC)(比如切换场景时)
    4. 优化数学计算,比如尽量少用浮点数,用乘法代替除法等等
    5. 应用缓存池
    6. 尽量减少 Update​ 生命周期函数的数量
  5. OpenGL 和 DirectX 的最大区别是什么?

    OpenGL 和 DX 的主要区别就是在于:

    • OpenGL 是一个跨平台、跨语言的开放图形库,可以支持各种平台,比如 Windows、Linux、MacOS 等等,
    • DirectX 是微软创建的,它不跨平台,只针对微软相关平台,比如 Windows 操作系统,XBOX 主机系

    游戏引擎底层就会对图形 API 进行封装,为了适应更多的平台,往往会针对多种图形 API 进行封装