MIL19——模拟面试题

C#

  1. 请问以下这段代码的打印结果是多少?

    c#
    1
    2
    3
    float f = 10.4;
    int i = f / 2;
    Console.WriteLine(i);
  2. 在 C# 当中,我们想要用一个字典容器存储场景中的所有敌对对象,比如 怪物、Boss、可被攻击的场景物件等等,应该如何存储

  3. 在 C# 中,给你一个数字,表示有 n 秒,请问如何在不改变这个数字的前提下,将它转换成格式为 __小时__分__秒

  4. 请问执行以下代码后,List​ 中还存在哪些内容?

    c#
    1
    2
    3
    List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
    for (int i = 0; i < list.Count; i++)
    list.RemoveAt(i);
  5. 假设游戏中有一个怪物管理器管理所有怪物那么在开发时,为了避免内存泄漏,我们需要注意什么?

Unity

  1. Unity 生命周期函数中的 OnEnable​ 和 Start​,我们在使用时应该如何选择?可以举例说明
  2. 如果你要开发一个项目 Assetbundle​ 和 Addressables​ 你会如何选择?
  3. 网络通讯中分包黏包指的是什么?我们应该如何解决这些问题?
  4. TCP 和 UDP 通讯最大的区别是什么?
  5. 如果想要让 UDP 通讯具备 TCP 的优点,应该如何处理?

答案

C#

  1. 请问以下这段代码的打印结果是多少?

    c#
    1
    2
    3
    float f = 10.4;
    int i = f / 2;
    Console.WriteLine(i);

    会报错,代码片段中存在两个错误,应该改为:

    1. float f = 10.4f
    2. int i = (int)(f/2)
  2. 在 C# 当中,我们想要用一个字典容器存储场景中的所有敌对对象,比如 怪物、Boss、可被攻击的场景物件等等,应该如何存储

    里式替换原则,父类容器装载子类对象

  3. 在 C# 中,给你一个数字,表示有 n 秒,请问如何在不改变这个数字的前提下,将它转换成格式为 __小时__分__秒

    c#
    1
    2
    3
    int h = n / 3600;
    int m = (n % 3600) / 60;
    int s = n % 60;
  4. 请问执行以下代码后,List​ 中还存在哪些内容?

    c#
    1
    2
    3
    List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
    for (int i = 0; i < list.Count; i++)
    list.RemoveAt(i);

    答:2、4、6、8、10

    • 第 1 次:i = 0​ 移除了 1​,后面往前放 2,3,4,5,6,7,8,9,10
    • 第 2 次:i = 1​ 移除了 3​,后面往前放 2,4,5,6,7,8,9,10
    • 第 3 次:i = 2​ 移除了 5​,后面往前放 2,4,6,7,8,9,10
    • 第 4 次:i = 3​ 移除了 7​,后面往前放 2,4,6,8,9,10
    • 第 5 次:i = 4​ 移除了 9​,后面往前放 2,4,6,8,10
    • 结束
  5. 假设游戏中有一个怪物管理器管理所有怪物那么在开发时,为了避免内存泄漏,我们需要注意什么?

    当某一怪物真正需要移除时,我们需要清除怪物管理器对该怪物的引用

Unity

  1. Unity 生命周期函数中的 OnEnable​ 和 Start​,我们在使用时应该如何选择?可以举例说明

    在对象的整个生命周期中,OnEnable​ 在对象激活时都会自动调用一次,Start​ 在第一次 Update​ 调用之前只会调用一次
    我们需要根据执行时机的这个特点来决定何时调用他们,OnEnable​ 可以将一些想要重置的数据,放在其中处理,Start​ 一般放只会初始化一次的数据内容

  2. 如果你要开发一个项目 Assetbundle​ 和 Addressables​ 你会如何选择?

    首先应该将两者的关系回答清楚:Addressables​ 是 Unity 提供的基于 Assetbundle​ 的资源管理系统

  3. 如何选择?如果想要对 Assetbundle​ 资源进行更多的底层控制,那么选择 Assetbundle​ 可操作性更多,
    可以根据自己的项目实际情况来定制需求,如果团队更熟悉传统的 AssetBundle​ 工作流程,那么选择 AssetBundles​ 可能更合适。
    因为一般情况下,老团队肯定会有一套基于 Assetbundle​ 的资源管理机制,也经过了上线项目验证

  4. 网络通讯中分包黏包指的是什么?我们应该如何解决这些问题?

    • 分包:一个独立的数据包(消息)被拆分成了多个小数据,分别发送出去
    • 黏包:多个数据包(消息)被粘合在了一起,变成了一个更大的数据包,发送出去
    • 解决:加入消息头,在消息头中加入长度等其他信息,用于接收后判断消息长度,进行对应的逻辑处理
  5. TCP 和 UDP 通讯最大的区别是什么?

    • 安全性上: TCP 是安全可靠的,有序、无差错、不丢失,而 UDP 不保证可靠性,发送的数据可能会丢失,也可能会乱序
    • 效率上: UDP 通讯效率更高
  6. 如果想要让 UDP 通讯具备 TCP 的优点,应该如何处理?

    主要思路就是基于 UDP 模拟出 TCP 的安全性,主要做法:

    1. 为消息加入序号:为 UDP 发送的每一个消息加入一个序号
    2. 加入消息确认机制:接收端在成功接收到一个消息后,向发送端发送一个确认消息,表示该消息已经被正确接收。
    3. 加入超时重传机制:发送端在超时时间内未收到确认,则进行消息的重传。