MIL3——模拟面试题

问题

C#

  1. 泛型的约束有哪几种?

  2. 什么是闭包?可以举例说明

  3. 内存泄漏指什么?常见的内存泄漏有哪些?

  4. 序列化是什么?常见的序列化方式有哪些?什么时候我们会用到序列化?

  5. 请问A、B、C 三处打印结果分别为多少?为什么?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    static unsafe void Main(string[] args)
    {
    int test1Value = 10;
    Test1(test1Value);
    Console.WriteLine($"A:{test1Value}");

    int test2Value = 10;
    Test2(&test1Value);
    Console.WriteLine($"A:{test2Value}");

    int test3Value = 10;
    Test3(ref test3Value);
    Console.WriteLine($"A:{test3Value}");
    }

    private static void Test1(int value)
    {
    value += 90;
    }

    private unsafe static void Test2(int* value)
    {
    *value += 90;
    }

    private static void Test3(ref int value)
    {
    value += 90;
    }

Unity

  1. transform.forward​ 和 Vector3.forword​ 的区别
  2. Unity中如何解决过多创建和删除对象带来的卡顿问题?
  3. 游戏中的成就系统,我们一般会使用设计模式中的哪种模式来制作? 为什么?
  4. 请简述热更新的流程
  5. 我们应该如何优化UI(基于UGUI)

答案

C#

  1. 泛型的约束有哪几种?

    答案:

    1. 值类型约束 T:struct
    2. 引用类型约束 T:class
    3. 公共无参构造约束 T:new()
    4. 类约束 T:类名
    5. 接口约束 T:接口名
    6. 另一个泛型约束 T:U
  2. 什么是闭包?可以举例说明

    答案:
    闭包是指有权访问另一个函数作用域中的变量的函数
    所以闭包一般都是指的一个函数
    创建这种特殊闭包函数的方式往往是在一个函数中创建另一个函数

  3. 内存泄漏指什么?常见的内存泄漏有哪些?

    答案:
    内存泄漏指的就是对象超过生命周期后而不能被GC回收,
    一般指不会再使用的引用对象由于某些操作而不能被GC垃圾回收,而一直占用着内存
    更风趣通俗一点的说就是:没用的家伙没有被当成垃圾回收

    常见的内存泄漏有:

    1. 静态引用,也就是 static​ 的引用类型变量
    2. 不使用的引用对象没有置 null​,一直被引用
    3. 文件操作时,没有使用 using​ 或者没有进行 Dispose()
    4. 委托或事件注册后没有解除注册(有加就有减)

    等等

  4. 序列化是什么?常见的序列化方式有哪些?什么时候我们会用到序列化?

    答案:

    序列化是将程序中数据对象转换为可以存储或传输的形式 的过程。

    举例:

    比如我们常见的序列化方式 xml、Json、2进制等。
    就是将内存中的数据按照我们自己定义的规则进行序列化,序列化之后就可以用于存储和传输,
    当读取和接受数据时,只需要按照对应规则进行反序列化便可得到原始数据
    所谓的存储读取和传输接受,其实一般指的就是数据持久化和网络通讯
    所以我们经常会在这两块知识点看到序列化反序列化这两个关键词

  5. 请问A、B、C 三处打印结果分别为多少?为什么?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    static unsafe void Main(string[] args)
    {
    int test1Value = 10;
    Test1(test1Value);
    Console.WriteLine($"A:{test1Value}");

    int test2Value = 10;
    Test2(&test1Value);
    Console.WriteLine($"A:{test2Value}");

    int test3Value = 10;
    Test3(ref test3Value);
    Console.WriteLine($"A:{test3Value}");
    }

    private static void Test1(int value)
    {
    value += 90;
    }

    private unsafe static void Test2(int* value)
    {
    *value += 90;
    }

    private static void Test3(ref int value)
    {
    value += 90;
    }

    答案:

    A​ 是10,B​ 和 C​ 为100

    • Test1​ 处参数传递进去后,函数内部的形参 value​ 是在栈上重新开辟的空间,将传入参数的值拷贝到了该空间中,和传入参数没有关系
    • Test2​ 处参数是指针类型,指针是用于存储内存地址的变量,我们传入的是值得地址 &test2Value​,
      在函数内部改变的是地址中存储的值,所以外部的 test2Value​ 会随之改变
    • Test3​ 处 ref​ 关键字,底层逻辑中是将 value​ 作为 test3Value​ 的一个别名,他们指向的空间一致,
      所以 value​ 改变后,外部的 test3Value​ 也会改变

Unity

  1. transform.forward​ 和 Vector3.forword​ 的区别

    答案:

    • Vector3.forword​ 始终时 (0,0,1)​ 可以认为是世界坐标系的Z轴朝向
    • transform.forword​ 是当前物体的局部坐标系的Z轴在世界坐标系下的朝向 可以认为是物体自己的Z轴朝向
  2. Unity中如何解决过多创建和删除对象带来的卡顿问题?

    答案: 可以通过协同程序,分时分步创建或删除,原理是避免一帧中处理太多对象

  3. 游戏中的成就系统,我们一般会使用设计模式中的哪种模式来制作? 为什么?

    答案: 观察者模式,Unity基础小框架中 讲解的 事件中心 就是基于观察者模式的 是一种订阅通知机制

  4. 请简述热更新的流程

    答案:本地存在资源对比文件和已有资源

    1. 下载资源服务器中的对比文件
    2. 将下载下来的远端对比文件和本地的做对比,记录需要更新的资源和要移除的资源
    3. 根据第二步中记录的信息,进行资源下载和移除
    4. 更新本地对比文件,其内容和刚才下载的远端对比文件一致
  5. 我们应该如何优化UI(基于UGUI)

    答案:

    • 性能上

      1. 打图集,将同一画面的图片放入一个图集中,目的是减少DrawCall
      2. 面板中的图片和文字尽量不要交叉,因为这样会产生多余的DrawCall
      3. 取消勾选不必要的射线检测,UI组件上的
      4. 减少透明图片的重叠使用

      等等

    • 内存上

      1. 大图尽量使用9宫格缩放,让美术设计UI面板底图时不要过于复杂,尽量是有规律的纹理和颜色变化
      2. 图片的RGBA通道分离

      等等