MIL24——模拟面试题

C#

  1. value1​ 和 value2 谁先初始化

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Main1
    {
    static object value1;
    static Main1()
    {
    value1 = new object();
    }
    static object value2 = new object();
    }
  2. C# 中数值在调用 ToString() 方法时,若传入字符串参数,有哪些格式转换规则?(至少说出3点)

  3. C# 中 ulong​ 类型可以表示最大的整数为多少?C# 中的 BigInteger 类对于我们来说有什么意义?

  4. C# 中如何把 int​ 数组转换为 string 数组?(请至少说出 2 种方式)

  5. 为什么我们使用单例模式更多,而几乎不使用静态类?

Unity

  • Unity 中的 PlayerPrefs 支持存储什么类型的数据?
    为什么我们一般不会使用它来制作角色数据存档功能?
  • 在进行数据持久化时(存档、数据存储等功能时)
    如果使用 Unity 中的 JsonUtility​(Json),C# 中的 BinaryFormatter​(2进制)和 XmlSerializer (xml)
    这些公共类进行序列化和反序列化时,如果在反序列化时,对应的数据结构类发生变化了,是否影响数据的读取?
  • 游戏在设备上运行时,出现崩溃闪退现象,排查方向有哪些?(至少说出 2 点)
  • 游戏在设备上运行时,出现卡顿掉帧现象,排查方向有哪些?(至少说出 2 点)
  • 在进行游戏开发时,我们一般如何测试项目在目标设备的最大内存上限和性能上限?

答案

C#

  1. value1​ 和 value2 谁先初始化

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Main1
    {
    static object value1;
    static Main1()
    {
    value1 = new object();
    }
    static object value2 = new object();
    }

    value2​ 先初始化,然后 value1 初始化。 静态字段的初始化会比静态构造方法的执行实际要早

  2. C# 中数值在调用 ToString() 方法时,若传入字符串参数,有哪些格式转换规则?(至少说出3点)

    1. Fn​;F1​,F2​,F3​… 后面的 n 代表保留几位小数
    2. E;将数字以科学计数法表示
    3. X​;将数字转为 16 进制,比如:255.ToString("X") = FF
    4. P;将数字以百分比表示
    5. Dn​;D1​,D2​,D3​… 后面的 n 代表结果字符串长度至少为 5 位,如果不足 5 位,则在前面加 0
    6. C;将数字以货币格式表示
    7. N​;将数字以数字格式表示,比如:2500000.ToString("N") = 2,500,000.00 等等
  3. C# 中 ulong​ 类型可以表示最大的整数为多少?C# 中的 BigInteger 类对于我们来说有什么意义?

    1. ulong 表示的最大整数位 26412^{64}-1 为 18446744073709551615 ≈ 1844千万兆
    2. BigInterger 是一个可以表示任意大小整数的类,不受系统整数范围的限制。当你的项目中需要处理超出标准整数范围的整数时,可以使用它
  4. C# 中如何把 int​ 数组转换为 string 数组?(请至少说出 2 种方式)

    1. 声明一个长度和 int​ 数组相同的 string​ 数组,遍历 int​ 数组,边遍历边转换存储 string 数组中
    2. 使用 Array.ConvertAll 方法
    3. 使用 LINQ,所有 Select 方法对所有元素进行转换
  5. 为什么我们使用单例模式更多,而几乎不使用静态类?

    1. 单例模式允许延迟实例化对象
    2. 单例模式可以被继承和拓展

Unity

  • Unity 中的 PlayerPrefs 支持存储什么类型的数据?为什么我们一般不会使用它来制作角色数据存档功能?

    float​、int​、string​ 三种类型,不使用 PlayerPrefs 来制作存档功能的主要原因:

    1. 需要进行二次封装才能用于存储自定义数据
    2. 存储位置时固定的,容易被玩家修改,安全性较差
  • 在进行数据持久化时(存档、数据存储等功能时)
    如果使用 Unity 中的 JsonUtility​(Json),C# 中的 BinaryFormatter​(2进制)和 XmlSerializer (xml)
    这些公共类进行序列化和反序列化时,如果在反序列化时,对应的数据结构类发生变化了,是否影响数据的读取?

    • 不影响,不会报错
    • 抛弃的字段不会再赋值
    • 新增的字段将使用默认值
  • 游戏在设备上运行时,出现崩溃闪退现象,排查方向有哪些?(至少说出 2 点)

    首先,尝试复现问题,看是否是在同一情况下出现该问题,根据表现精准定位问题,若问题出现随机性较强,那么从以下几方面排查:

    1. 内存问题,排查是否存在内存溢出,内存泄漏
    2. 报错问题,排查日志信息
    3. 排查设备兼容性,看是否是某些功能与该设备不兼容

    等等

  • 游戏在设备上运行时,出现卡顿掉帧现象,排查方向有哪些?(至少说出 2 点)

    首先,配合性能分析工具进行排查,比如 Unity Profiler 通过分析 CPU、GPU、帧率等性能数据确定性能瓶颈所在,主要排查方向:

    1. CPU 使用率,检查是否有计算量过大、循环过多、算法低效的情况
    2. GPU 使用率,检查是否有过多的渲染操作,Shader 着色器的算法是否效率低下等情况
    3. 是否存在内存抖动严重的情况,不停地频繁触发GC
    4. 是否是因为资源加载国语频繁导致卡顿

    等等

  • 在进行游戏开发时,我们一般如何测试项目在目标设备的最大内存上限和性能上限?

    结合性能测试工具(比如Unity自带的性能检测窗口)在多台真实的目标设备上进行测试(多台目的是避免不同设备之间存在的差异性)
    可以专门制作测试场景

    • 添加一些动态生成的功能(比如动态增加内存分配,比如动态增加性能消耗)

    • 动态增加内存分配常用方法:加载更多的图片、模型、特效资源

    • 动态增加性能消耗的常用方法:

      • CPU ——> 添加寻路对象数量,让场景上模型不停地切换动作
      • GPU ——> 场景上增加同屏显示的模型、特效等对象数量
    • 不停地观察随着内存分配提升,性能消耗提升时,整体游戏表现的变化

    主要观察变化内容为: 内存到达多少时,出现崩溃现象,场景中模型、特效、动作、寻路对象等等内容到达多少时,出现掉帧卡顿现象