春招

  • 第一家 广州 寄

  1. 首先问一下学习unity 多久了
  2. C++ 在学校是怎么学习的 – oop 没有C11
  3. 那就问一个C#问题 List底层是什么
  4. 无序数组怎么增加增删的效率 –增:在最后增加 删:swap最后然后在最后删 (堆排序?)
  5. 聊天:lua现在好像淘汰 C# 技术栈就够 huatuo
  6. 场景题: 水果忍者 怎么随机生成水果和角度
  7. 场景题 : 水果忍者 怎么切割
  • 第二家 杭州 oc

  1. 首先问一下学习unity 多久了

​ 回答:大一下暑假断断续续,也是一年多

  1. 介绍一下杀戮尖塔项目

  2. 热更做了吗(没有)那做了什么

​ 回答: 做了一个lua xlua的背包系统 写了个ABmanager 然后写Panel 后面补充了BasePanel的框架

  1. 有使用过unity的性能工具吗?有遇到性能问题吗

​ 没有,但是大概知道理论

  1. 在CPU 和 GPU 方面的优化 大概了解吗

​ CPU : 代码层面:框架,缓存池 批处理:静态批处理 空间换时间

​ GPU : 太卡没回答

  1. 说一下你关于状态机的使用(后面有说公司项目有多用状态机来实现框架)
  2. unity 的进程有多少个
  3. unity 生命周期
  4. 改变timeScale 不会改变生命周期的哪个函数

回答:update,就说每一帧更新就不会更改(我也不会)

  • 第三家 北京 oc

  1. 自我介绍
  2. IOC容器的理解
  3. IOC和其他方式的区别以及项目中好处
  4. 洗牌算法
  5. 说一下单例模式
  6. 介绍一下我的项目wordJump
  7. 为什么用射线检测来实现爬墙跳,为什么不使用其他的
  8. 请介绍一下反射
  9. 为什么使用lua热更不使用C#
  10. 排序算法有哪些
  11. 请介绍一下快排
  12. 如果使用unity和py通信应该怎么使用通信协议
  13. 学过shader吗 介绍一下
  14. 学过计算机图形学吗,三维坐标怎么转为屏幕坐标

说是无人机的虚拟仿真,unity做一个页面端

  • 第四家 深圳 迷你玩 oc

  1. 自我介绍

  2. C# 类与接口的区别

  3. 数组与链表的区别

  4. 数组和链表的使用场景(增删)

  5. GC 产生的原因(就说了俩个www)

  6. ArrayList和List区别(我就说了List是接口 ArrayList会封箱拆箱)

  7. 介绍一下委托

  8. 相机三种的渲染形式(没有回答出来)

  9. 物理更新在哪里(fixUpdate)

  10. 为什么用fixUpdate

  11. Lua 类的实现

  12. Lua ipair 和pair区别

  13. 卡牌组怎么实现的

  14. 洗牌算法

  15. 缓存池怎么实现的

  16. 自研引擎的看法

    反问:

15.进去做什么 :做业务之类的,自研引擎用纯Lua

  1. 后续流程
  2. 表现 (lua要提高,基础还行,但是扩展要仔细看)

秋招

  • 剑心 一面

  1. 什么时候会形成多态,动态多态只要定义虚函数都会出现吗?只要调子类的函数就会实现多态?

答:多态分动态多态和静态多态,静态多态是通过重载和模板实现,动态多态通过继承和虚函数实现(第二个问题是引导要有继承前提),

仅定义虚函数或直接调用派生类函数并不会自动触发动态多态,必须通过基类指针或引用来调用。

  1. 编译器如何实现多态(虚函数实现方式)

答:虚函数是通过虚函数表来实现的,虚函数表包含了一个类(所有)的虚函数的地址,在有虚函数的类对象中,它内存空间的头部会有一个虚函数表指针(虚表指针),用来管理虚函数表。当子类对象对父类虚函数进行重写的时候,虚函数表的相应虚函数地址会发生改变,改写成这个虚函数的地址,当我们用一个父类的指针来操作子类对象的时候,它可以指明实际所调用的函数。

  1. 多重继承的时候 C继承与A和B虚函数表会发生什么变化

C++中的虚指针与虚函数表 - 知乎

A 的虚表 vtable_A 只包含 funcA

B 的虚表 vtable_B 只包含 funcB

C 中有两个虚表指针,分别指向 vtable_Avtable_B

vtable_AfuncA 的指针会指向 C::funcA

vtable_BfuncB 的指针会指向 C::funcB

  1. 局部变量int a 添加一个static 会出现哪些变化

答 :

  1. 内存存储区的变化 ,int a 在栈中 static 在全局数据区中

  2. 初始化: 局部变量进函数每次都会被初始化 ,静态量只会被初始化一次,会保留上一次的值不会被重新初始化

  1. 定义static前后初始值是多少

局部是垃圾值,全局是0

  1. 堆栈的区别

  2. 栈区的容量大小? 4MB

  3. 栈的容量改成堆的容量有什么后果?

栈溢出和安全隐患,系统限制和资源浪费, 内存耗尽风险

  1. malloc- free new-delete为什么要配套使用 ,new 加free一起用会有什么效果
  2. 什么时候会产生内存泄漏,野指针,举个例子
  3. c语言中free一个(void*) 指针 怎么知道这个指针多大呢

free()如何知道释放内存块的大小 - 知乎

举个例子:假设你用malloc需要申请100字节,实际是申请了104个字节。把前4字节存成该块内存的实际大小,并把前4字节后的地址返回给你。 free释放的时候会根据传入的地址向前偏移4个字节 从这4字节获取具体的内存块大小并释放。(实际上的实现很可能使用8字节做为头部:其中每四个字节分别标记大小和是否正在使用)
实际的内存管理比这个要复杂的多,但一般手段都是如上通过记录头或者叫做cookie来存储大小以及是否正在使用来确定以后到底要回收多少和是否可以复用。
内存管理比较复杂的主要原因是内存管理程序会缓存和合并已经申请的内存块并且去复用,或者申请超大的一个块,自己省着点用 ,这样不必每次都想操纵系统要。

  1. C#中协程线程进程区别
  2. 什么是单例模式

唯一性:单例模式确保在整个应用程序的生命周期中只有一个实例。

全局访问:提供一个全局访问点,使得应用程序中的任何地方都能获取该实例。

懒加载(可选):可以选择在第一次使用时创建实例,节省资源

  1. 如何将一个类改成单例模式

私有构造函数:将类的构造函数设为私有,以防止外部代码通过构造函数直接创建实例。

静态私有实例:在类中声明一个静态的私有实例,用于保存唯一的实例。

公共静态方法:提供一个公共的静态方法来获取该实例,如果实例不存在,则创建它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Singleton
{
private Sington() { }
private static Singleton _Singleton = null;
public static Singleton CreateInstance()
{
if (_Singleton == null)
{
Console.WriteLine("被创建");
_Singleton = new Singleton();
}
return _Singleton;
}
}
  1. 静态类 和单例类 有什么区别

首先理解一下什么是静态类,静态类就是一个类里面都是静态方法和静态field,构造器被private修饰,因此不能被实例化。Math类就是一个静态类。