MIL21——模拟面试题

C#

  1. 为什么要为缓存池中的单个池子设置对象上限?

  2. 任务系统中,某任务是要采集某一种植物 n 株后才能完成。说一说制作思路

  3. 有两个泛型类,他们是父子关系

    1
    2
    public class Father<T> {}
    public class Son<T> : Father<T>

    这个写法是否正确?

    1
    2
    3
    4
    public Father<Father<int>> Test()
    {
    return new Son<Son<int>>();
    }
  4. 数据结构中的树,一般会在游戏开发中用来处理什么?至少说出3点

  5. 游戏开发中逻辑与表现如何分离?非 UI 系统

Unity

  1. 什么是纹理映射?
  2. IK(逆运动学)可以帮助我们完成什么功能?
  3. Unity 中为 Sprite 前后关系排序的常用方式有哪些?(至少说出3种)
  4. 请介绍一些在 Unity 中减少内存的方法。(至少说出3种方法)
  5. 请介绍一些在 Unity 中提升性能的方法(至少说出5种方法)

答案

C#

  1. 为什么要为缓存池中的单个池子设置对象上限?

    有助于内存管理,避免对象无限扩张,防止资源浪费

  2. 任务系统中,某任务是要采集某一种植物 n 株后才能完成。说一说制作思路

    1. 接受任务时,根据策划需求决定是否判断身上已有的物品

      • 如果需要,则遍历有用物品是否有满足条件的物品,并统计数量
      • 如果不需要,则从 0 开始计数
    2. 执行任务时,在采集物品结束或获取物品时利用事件中心分发事件
      任务管理器监听事件,当获得满足条件物品时数量累加

    3. 判断任务是否可以交付,当物品数量达到目标时,任务状态变为可以交付

  3. 有两个泛型类,他们是父子关系

    1
    2
    public class Father<T> {}
    public class Son<T> : Father<T>

    这个写法是否正确?

    1
    2
    3
    4
    public Father<Father<int>> Test()
    {
    return new Son<Son<int>>();
    }

    不正确,会报错 因为 Son<Son<int>>​ 并不是 Father<Father<int>>​ 的子类型
    如果要修改,我们可以返回 return new Son<Father<int>>();
    关键点,泛型类的 T​ 是类型的一部分,T 并不存在里式替换的关系

  4. 数据结构中的树,一般会在游戏开发中用来处理什么?至少说出3点

    1. 游戏对象的父子关系
    2. 游戏 AI 中的行为树
    3. 技能系统中的技能树、天赋树
    4. 物理引擎中会使用空间分割树来提升碰撞检测性能

    等等

  5. 游戏开发中逻辑与表现如何分离?非 UI 系统

    以 Unity 游戏开发为例 我们可以将游戏中的对象大致分成两类

    1. 逻辑类:只关心逻辑处理,可以不用继承 Mono,管理逻辑相关的内容
      比如移动、旋转、缩放、伤害检测等等
    2. 表现类:只关心美术表现,实际持有 GameObject,管理表现相关的内容
      比如动画播放、特效播放、音效播放等等

Unity

  1. 什么是纹理映射?

    是一种图形学技术,用于将纹理图像映射到三维模型的表面上,以模拟表面的外观和细节

  2. IK(逆运动学)可以帮助我们完成什么功能?

    1. 利用 IK 控制四肢,可以完成类似抓取、推动、拖拽相关功能
    2. 利用 IK 控制头部,可以完成瞄准,头部跟随等相关功能
  3. Unity 中为 Sprite 前后关系排序的常用方式有哪些?(至少说出3种)

    1. Sprite Renderer 上的 Sorting Layer 按层排序
    2. Sprite Renderer 上的 Order in Layer(同层时)
    3. 坐标轴(一般为 Z 轴)排序
    4. Sorting Group 排序组组件排序
    5. 自定义材质球使用的 Shader 去控制
  4. 请介绍一些在 Unity 中减少内存的方法(至少说出3种方法)

    • 资源相关:

      1. 压缩纹理
      2. 减小纹理图片大小
      3. 降低模型质量(减少顶点)
      4. 使用压缩格式的音效,比如AAC、ADPCM等
    • 代码相关:

      1. 缓存池
      2. 减少静态成员
      3. new
      4. string​ 和 StringBuilder
      5. 避免内存泄漏

    等等

  5. 请介绍一些在 Unity 中提升性能的方法(至少说出 5 种方法)

    • 渲染相关:

      主要方向减少DrawCall,减少着色器计算量

      1. 批处理
      2. GPU Instancing
      3. 合并图集
      4. 减少模型顶点数
      5. LOD
      6. MipMaps
      7. 减少光源、阴影
      8. 光照烘焙贴图
      9. 遮挡剔除

      等等

    • 逻辑相关:

      1. 缓存池
      2. 利用多线程处理复杂逻辑
      3. 避免过多的 Update
      4. 异步加载
      5. 预加载
      6. 定时主动 GC(比如过场景时)

      等等

    其实逻辑代码对性能的影响,只要不太过分,都还好,主要造成卡顿的往往是渲染、IO 相关