MIL13——模拟面试题

C#

  1. C# 中哪些变量类型是值类型(至少说出13种),哪些是引用类型(至少说出5种)

    • 值类型: int​、float​、double​、byte​、short​、long​、uint​、ulong​、uint​、sbyte​、decimal​、char​、bool​、自定义结构体
    • 引用类型: 自定义类、数组、字符串、委托、接口、object
  2. 第一个问题:在自定义类中声明的成员变量,类型为 int​,该 int​ 变量存储在栈上还是堆上?
    第二个问题:在自定义结构体中声明的成员变量,类型为 string​,该 string​ 变量存储在栈上还是堆上?

    1. 堆上

      自定义类中声明的成员变量,无论什么类型,都会存储在堆上。
      类(引用类型)的实例本身存储在堆上,而成员变量也存储在该实例所指向的内存区域(堆上)

    2. 堆上

      在结构体变量中的引用类型成员实际上会存储在堆上。
      虽然结构体本身是值类型,存储在栈上,但是如果结构体的成员包含引用类型,
      那么引用类型的对象会存储在堆上,而结构体的实例内部会包含对这些堆上对象的引用。

  3. C# 中在什么情况下会选择使用接口,什么情况下会选择使用抽象类?

    • 接口:

      1. 不同对象的共同行为
      2. 需要多继承时
    • 抽象类:

      1. 同类对象的共同行为
      2. 共享成员变量
  4. C# 中什么是托管内存和非托管内存?

    • 托管内存: 托管内存是由 .NET 运行时(CLR,Common Language Runtime)进行管理的内存。

      C# 中大部分对象都是托管内存,它们的内存分配、回收和资源管理都由 CLR 负责。
      CLR 提供了自动垃圾回收机制(GC),可以自动检测不再使用的对象并释放它们占用的内存,从而避免了内存泄漏问题。
      比如我们平时声明的引用类型的变量都属于托管内存

    • 非托管内存: 非托管内存是由应用程序自己负责管理的内存,它通常是通过调用本机API或与外部系统进行交互时使用的。

      非托管内存可能不受 CLR 的管理,这意味着它不会受到垃圾回收的影响。
      但是,这也意味着开发人员需要自己负责内存的分配和释放,否则可能会导致内存泄漏或者访问无效内存的问题。
      比如我们平时声明的 unsafe​ 语句块中的指针成员,数据库链接对象,Socket 通讯对象,文件流等对象都存在非托管内存,需要我们自己释放

  5. 请问什么是线程安全?如何在 C# 中实现线程安全操作?

    • 线程安全,是指在多线程环境中,对共享资源(如数据、变量、对象等)进行操作时,不会产生不正确的结果或不可预期的行为。

      在多线程程序中,由于多个线程可以同时访问和修改共享资源,如果没有适当的同步机制,就可能会导致数据损坏、竞态条件(Race Condition)和其他错误

      • 数据损坏:数据损坏是指数据在存储、传输或处理过程中发生错误,导致数据的内容或结构出现不一致、不正确或不完整的情况
      • 竞态条件:多个线程试图同时访问和修改共享资源(如变量、数据结构、文件等),从而导致程序的行为出现不确定性或不正确的结果。
        竞态条件可能会导致程序的运行结果与预期不符,产生难以预测和复现的错误
    • 如何在 C# 中实现线程安全操作? 使用锁(Lock)、异步编程(async、await)等方式

Unity

  1. Unity 中的 Lerp​ 和 Slerp​ 分别是什么?

    Lerp​ 和 Slerp​ 是两个方法,在 Mathf​ 和 Vector​ 等类中都提供了对应的方法

    1. Lerp​:线性插值函数,接受三个参数,起始值、目标值和插值比例
      Lerp​ 用于在两个值之间进行平滑的线性插值,适用于直线运动、颜色过渡等场景
    2. Slerp​:球面插值函数,接受三个参数,起始值、目标值和插值比例
      Slerp​ 在插值过程中会在两个旋转之间沿着曲线(球面)插值,从而保持较为自然的旋转过渡
  2. Unity 底层是单线程还是多线程

    Unity 底层实现是基于单线程的,这个线程通常被称为 主线程 或 渲染线程,意味着大部分的游戏逻辑、渲染和更新都在主线程上执行。
    但是 Unity 也支持自定义多线程处理复杂逻辑,并且 Unity 目前的版本也提供了一些多线程技术来改善性能,比如 Job System、DOTS 等

  3. 如何在 Unity 中实现多语言支持?(不同国家的人,看到的游戏内的语言是不一样的)

    1. 单包:将所有设计多语言的图片、文本通过配置表去配置,当显示这些内容时,根据配置表中的信息去动态的加载,
      所有地区通用一个安装包,只是游戏中进行地区判断或者语言选择
    2. 分包:根据不同地区发布不同的安装包
  4. Shader 当中的顶点和片元着色器有什么作用?

    • 顶点着色器: 主要作用是对物体的顶点位置进行变换和投影,从本地坐标系转换到世界坐标系和相机坐标系等。

      在这个阶段,顶点着色器还可以计算光照的影响、法线的变换,以及传递一些数据供后续阶段使用

    • 片元着色器: 主要处理像素的颜色、纹理和光照。在顶点着色器之后,渲染管线会对物体进行光栅化,将物体的几何形状转换为像素。

      在片元着色器中,针对每个像素,会进行插值和纹理采样,以及计算光照、阴影、反射等效果。
      片元着色器最终输出的颜色将决定每个像素的显示效果。

    这两个着色器阶段协同工作,将 3D 场景中的几何信息转换为 2D 屏幕上的像素颜色,从而实现图形的渲染和显示。

  5. Unity 目前版本中创建的普通项目、URP 项目、HDRP 项目的区别是什么?

    • 普通项目: 使用 Unity 默认的渲染管线,也被称为内置渲染管线或标准渲染管线。

      这种渲染管线适用于较简单的游戏和应用,具有适中的性能和视觉效果。它不支持一些高级渲染特性,但适用于广泛的平台和设备

    • URP 项目: URP 是 Unity 官方提供的一种渲染管线,旨在为轻量级、移动端和跨平台开发提供优化的解决方案。

      URP 在性能和质量之间取得了平衡,适用于移动平台、虚拟现实(VR)和增强现实(AR)应用。
      它提供了一些轻量级的效果和优化,使开发者能够在保持性能的同时实现较好的视觉效果。

    • HDRP 项目: HDRP 是 Unity 官方提供的高级渲染管线,专注于提供逼真的图形质量和高度可定制的渲染效果。

      HDRP 支持高动态范围(HDR)渲染、物理真实的材质和光照模型,以及其他高级特效。
      HDRP 适用于需要高质量视觉效果的游戏项目,例如逼真的游戏、电影制作等。
      但由于其高级特性,可能会对性能产生较大的负担,因此更适合较强的硬件平台。

    主要区别:

    • 渲染质量和性能:普通项目适用于简单项目,URP 在性能和质量之间取得平衡,HDRP 专注于高质量渲染效果
    • 平台适用性:URP 适用于移动端、VR 和 AR 应用,HDRP 适用于较强硬件平台和需要高质量视觉效果的项目。
    • 特效和定制性:HDRP 提供了更多的高级渲染特效和自定义选项,允许开发者实现逼真的渲染效果。