MIL12——模拟面试题

C#

  1. List​ 是链表还是数组
  2. 上一题追问:当 list​ 满了的时候,我再加入一个元素它的效率会比较低啊,它内部大概是一个什么样的执行过程呢?
  3. C# 里面有一个常用的接口叫做 IDispose​,它的作用是?
  4. 上一题追问:C# 有垃圾回收机制,把一个对象设置为空的时候,系统会帮我们回收,它和接口 IDispose​ 有什么关系吗?为什么会存在两个做析构事情的东西呢?
  5. Unity 中的生命周期函数,为什么设计为反射调用,而不是通过继承重写生命周期函数的形式去实现呢?(至少答出一种原因)

Unity

  1. CPU 和 GPU 他们分别是什么?他们主要完成什么工作
  2. 渲染管线中的几何阶段是由 CPU 主导还是 GPU 主导?该阶段主要是在做什么?
  3. 是不是所有矩阵都有逆矩阵?如何计算一个矩阵的逆矩阵?
  4. 齐次坐标是什么?对于我们有什么作用?
  5. Shader 开发中的坐标空间变换,主要是在哪几个空间中进行变换?变换顺序是什么?

答案

C#

  1. List​ 是链表还是数组

    数组

  2. 上一题追问:当 list​ 满了的时候,我再加入一个元素它的效率会比较低啊,它内部大概是一个什么样的执行过程呢?

    数组搬家,会讲原数组移动到一个更大容量的新数组中,效率较低,并且会产生内存垃圾

  3. C# 里面有一个常用的接口叫做 IDispose​,它的作用是?

    IDispose​ 接口是 C# 中用于手动释放资源的机制 通过显式调用 Dispose()​ 方法来实现资源的释放,避免资源泄漏和浪费
    它允许对象在不再需要时显式地释放资源,而不依赖于垃圾回收器的自动内存管理

  4. 上一题追问:C# 有垃圾回收机制,把一个对象设置为空的时候,系统会帮我们回收,它和接口 IDispose​ 有什么关系吗?为什么会存在两个做析构事情的东西呢?

    C# 中的垃圾回收机制,只会回收托管堆上分配的对象。
    对于非托管资源以及其它需要显示释放的资源,垃圾回收是无法自动处理的,因为这些资源不属于托管堆,因此垃圾回收器无法自动识别和回收。
    这种情况下我们就需要显示的手动释放这些资源了。 而 IDispose​ 接口就提供了一种通用的机制来进行资源清理,主要用于释放非托管资源。

    非托管资源:

    1. 文件句柄,在操作系统中打开的文件等
    2. 数据库链接,与数据库服务器简历的链接
    3. 网络链接:比如 Socket 的连接对象
    4. unsafe​ 关键词中使用的指针

    等等

  5. Unity 中的生命周期函数,为什么设计为反射调用,而不是通过继承重写生命周期函数的形式去实现呢?(至少答出一种原因)

    可能原因包括:

    1. 并非所有继承 MonoBehaviour​ 的类都需要使用所有声明周期函数,如果使用继承,就会有大量的空虚函数被调用,
      而使用反射,有哪些生命周期就调用哪些,并且反射还可以调用私有方法。
      Unity 只需要维护有对应生命周期函数的脚本列表,就可以避免空虚函数的调用了。
    2. Unity 采用组件式设计,通过使用反射,可以将某些逻辑解耦,将组件的功能模块化,使得逻辑更加灵活和可复用,
      当触发一个生命周期,需要通知相应 GameObject 的所有组件,
      如果使用继承多态来实现,则所有组件都要派生自包含对应生命周期的基类,或者是筛选出派生自此基类的组件逐一通知。
      这样一来容易带来复杂的继承关系,并且很麻烦,就和组件式倡导的聚合代替继承的设计从理念上相悖了。
    3. Unity 提供插件和外部脚本支持,这些脚本可能不是在 Unity 中编写的,
      而是通过第三方库或外部工具生成的,为了支持这些脚本,可以使用反射机制调用其生命周期函数

Unity

  1. CPU 和 GPU 他们分别是什么?他们主要完成什么工作

    • CPU为中央处理器

      负责算数运算、逻辑操作、数据传输等通用计算任务,同时还管理和调度计算机的资源 (游戏开发中 —— 游戏逻辑处理),
      主要处理操作系统管理、程序执行、通用计算等等 CPU一般处理串行任务,即顺序执行的单个任务,适用于大多数常规计算

    • GPU为图形处理器

      是专门用于图形和并行计算的处理器,显卡就是搭载 GPU 的硬件设备,
      显卡包含一个或多个 GPU 芯片,还包含显存(用于存储图像数据)、显示接口、视频解码器等等(游戏开发中—渲染相关处理)
      GPU 主要处理并行任务,适用于图形渲染、3D游戏、机器学习、科学计算等需要大量并行计算的领域

  2. 渲染管线中的几何阶段是由 CPU 主导还是 GPU 主导?该阶段主要是在做什么?

    渲染管线中的几何阶段主要由 GPU 主导,在几何阶段中完成的最主要工作就是 顶点、法线 等模型数据的相关处理
    对他们进行坐标空间转换,裁剪画面外图元等等,还可以进行顶点着色,为每个顶点计算颜色、纹理坐标、法线等属性,以便在后续阶段用于处理

  3. 是不是所有矩阵都有逆矩阵?如何计算一个矩阵的逆矩阵?

    1. 并不是所有矩阵都有逆矩阵

    2. 计算流程

      1. 第一步:确定矩阵是否为方阵(即行列数相等)
      2. 第二步:计算矩阵的行列式(若行列式为0,则该矩阵没有逆矩阵)
      3. 第三步:计算矩阵的代数余子式矩阵
      4. 第四步:计算标准伴随矩阵(转置代数余子式矩阵)
      5. 第五步:计算逆矩阵(标准伴随矩阵 / 行列式)
  4. 齐次坐标是什么?对于我们有什么作用?

    齐次坐标就是将一个原本是 n 维的向量或矩阵用 n + 1 维来表示,是一种扩展的坐标系统,
    用于在计算机图形学等学科中进行数学运算,利用齐次坐标,我们可以明确的区分向量和点,能够表示出平移变换

  5. Shader 开发中的坐标空间变换,主要是在哪几个空间中进行变换?变换顺序是什么?

    主要是将模型相关数据(顶点、法线、切线等)在:模型空间 —> 世界空间 —> 观察空间 —> 裁剪空间 —> 屏幕空间 之间进行变换