MIL25——模拟面试题

C#

  1. C# 中常用的命名规范有哪些?(至少说出3种)
  2. C# 编程中常见的内存管理问题有哪些?
  3. 在 Unity 中使用 C# 的 foreach 是否会带来额外内存和性能开销?
  4. 在游戏开发中的日志系统一般会配合 C# 中的什么一起使用?用于记录报错信息
  5. 对于一个 ARPG 游戏来说,如何设计技能配置表,请简要描述(比如:大概需要配置几张表,分别配置什么信息)

Unity

  1. Unity 中如果想要改变物理系统中默认重力的方向或大小,应该在哪里修改?
  2. Unity 中动态批处理和静态批处理的区别?
  3. Unity 发布后的应用程序的美术表现效果比在编辑器中看起来差,可能原因有哪些?
  4. Unity 中线性颜色空间和伽马颜色空间的主要区别是什么?
  5. 为什么线性的表现效果更好,Unity 默认还是使用的伽马呢?

答案

C#

  1. C# 中常用的命名规范有哪些?(至少说出3种)

    1. 帕斯卡命名法,即每个单词的首字母大写(比如:MyClass
    2. 驼峰命名法,第一个单词小写,后续单词首字符大写(比如:myValue
    3. 下划线命名法,单词之间以下划线链接(比如:my_value_name
    4. 匈牙利命名法,变量名中包含类型缩写前缀(比如:strName​, iCount)
    5. 常量命名法,常用使用全大写字母,单词之间下划线分割(比如:MAX_VALUE
    6. 私有成员下划线前缀法,私有成员前加下划线(比如:_myValue
  2. C# 编程中常见的内存管理问题有哪些?

    1. 内存泄漏
    2. 内存抖动
    3. 线程访问冲突
    4. 递归造成的栈溢出

    等等

  3. 在 Unity 中使用 C# 的 foreach 是否会带来额外内存和性能开销?

    在老版本 Unity 中,由于 mono 编译器的一个 bug,
    在使用 foreach​ 时编译器会通过 IEnumerable<T>​ 或 IEnumerable 接口访问集合的枚举器,
    导致值类型被装箱,产生额外内存分配和垃圾回收。这个问题在 Unity 5.6 版本后已经就已经进行了修复。

    只要避免在 Update​ 循环中使用 foreach​ 即可,在其他地方使用 foreach 没有太大的顾虑了

  4. 在游戏开发中的日志系统一般会配合 C# 中的什么一起使用?用于记录报错信息

    需要配合 C# 中的异常捕获(try...catch...​)一起使用,在 catch 中通过日志系统记录报错信息

  5. 对于一个 ARPG 游戏来说,如何设计技能配置表,请简要描述(比如:大概需要配置几张表,分别配置什么信息)

    1. 技能总表:主要配置技能所用动作,技能伤害时间点,技能是否产生分离特效等等
    2. 技能伤害表:主要配置技能造成伤害时,给对象带来的变化(比如击退多少,击飞多少等)
    3. 技能分离特效表:主要配置分离特效资源 ID,对应技能伤害时间点等信息

Unity

  1. Unity 中如果想要改变物理系统中默认重力的方向或大小,应该在哪里修改?

    Project Setting —— Physics —— Gravity

    image

  2. Unity 中动态批处理和静态批处理的区别?

    批处理技术是 Unity 提供的优化渲染性能的技术 通过减少 DrawCall 来提高渲染效率,基本原理是合并网格

    1. 动态批处理和静态批处理都可以在 Player Setting 中 Other Settings 中设置是否开启

      静态批处理默认开启,动态批处理默认关闭

    2. 动态批处理是 Unity 自动会帮助我们将小型动态对象进行批处理,而静态批处理只会处理设置为静态 Static 的对象(注意:相同材质的对象)

      动态批处理无法处理超过 900 个顶点属性和 225 个顶点的网格,
      比如着色器使用顶点位置、顶点法线和单个 UV,则 Unity 最多可以动态批处理 225 个顶点。
      但是,如果着色器使用顶点位置、顶点法线、UV0、UV1 和顶点正切,则 Unity 只能动态批处理 180 个顶点

    3. 动态批处理主要消耗 CPU 性能,静态批处理主要消耗内存

    4. 动态批处理在运行时随时可能变化(对象可以频繁进行移动、旋转、缩放等操作),静态批处理结果运行时不变(静态对象不能有变化)

    5. 静态批处理支持内置渲染管线、通用渲染管线、高清渲染管线、自定义可编程渲染管线,动态批处理不支持高清渲染管线

  3. Unity 发布后的应用程序的美术表现效果比在编辑器中看起来差,可能原因有哪些?

    1. Quality Setting 质量设置问题,采用了低质量级别发布
    2. Lighting Setting 光照设置问题,有光照贴图没有正确打包和发布
    3. Shader Setting 着色器设置,发布时没有包含所有着色器变体,导致效果无法再对应平台上正常显示
    4. Texture Setting 纹理设置,采用了低质量高压缩比的纹理压缩格式
    5. 不兼容,一些 Shader 或者后处理效果不被对应平台支持
    6. 不同的图形接口程序,DX、OpenGL、Vulkan等图形接口程序不一致导致渲染效果差异
    7. 平台差异性,PC 和移动平台在硬件性能和渲染性能上有差异

    等等

  4. Unity 中线性颜色空间和伽马颜色空间的主要区别是什么?

    颜色空间可以在 PlayerSettings 中的 Other Settings 中进行设置

    主要区别:

    • 伽马颜色空间假设颜色值以非线性方式存储和处理
    • 线性颜色空间假设颜色值以线性方式存储和处理

    这为最终呈现出来的颜色效果带来了差异,整体上来说:

    1. 线性颜色空间表现效果更好 但是伽马颜色空间的显示设备兼容性更好
    2. 伽马颜色空间计算复杂度较低,线性颜色空间计算复杂度较高
    3. 伽马颜色空间适用于传统显示设备,线性颜色空间适用于高保真需要真实光照效果的场景
  5. 为什么线性的表现效果更好,Unity 默认还是使用的伽马呢?

    1. 早期的计算机图形学和显示技术主要使用伽马颜色空间,
      传统的显示设备(如CRT显示器:阴极射线管显示器)也默认使用伽马曲线来显示颜色。
      为了确保向前兼容性,很多图形应用程序和引擎默认都使用的伽马颜色空间。
    2. 即使目前较新的显示器采用的也是 sRGB 颜色空间,是一种与伽马非常相近的非线性颜色空间
    3. 伽马颜色空间下的性能消耗更低,颜色和光照计算都是直接进行的,无需进行线性化和去线性化的转换步骤。
      在线性颜色空间中,需要将输入的 sRGB 颜色值转换为线性颜色值进行计算,完成后再将结果转换回 sRGB 以供显示