Unity面试题总结

1.c#的GC:垃圾回收机制

.Net类型分为两大类,一个就是值类型,另一个就是引用类型。前者是分配在栈上,并不需要GC回收;后者是分配在堆上,因此它的内存释放和回收需要通过GC来完成。

托管资源:主要指托管堆上的资源,如引用类型。
非托管资源:值类型,文件句柄,GDI,数据库连接等。

GC可以自动回收托管资源,不能自动回收非托管资源。
GC在一个独立的线程回收内存中不被引用的对象。

Mark-Compact标记压缩算法:
1.Mark-Sweep:假设heap中所有对象都可以回收,找出不可回收的对象打标记。回收所有没打标记的对象。
2.对象回收之后内存变得不连续,移动对象使heap中对象连续排列。

Generational 分代算法:
Generation-0 : 当Generation-0已满时,进行一次GC,存活下来的对象会进入Generation-1
Generation-1: 当要进行GC时,发现Generation-1已满,就对Generation-1元素进行GC,存活的元素移至Generation-2;再对Generation-0元素进入GC,存活的元素移至Generation-1
Generation-2: 如果发现Generation-2已满,那没办法了,只能加大Generation-2的空间大小。

对于非托管资源:DIspose方法

2.向量的点积和叉乘:
点积:A.B=|A|*|B|*cosa 数学意义:投影
叉乘:结果是向量,垂直与A,B组成的平面。

3.MonoBehavior生命周期:Rest->Awake->OnEnable->OnStart->Update->FixedUpdate->LateUpdate->OnDrawGizomo-OnGUI->OnDisable->OnDestroy->OnApplicationQuit

4.类和结构体的区别:结构体是值类型,类是引用类型。结构体存储在栈中,类存储在堆中,栈的空间小但是访问快,堆的空间大但是访问速度较慢。

为什么栈的访问速度较快:
访问堆需要两次,第一次获得指针,第二次获得堆中的数据;
栈在一级缓存上运行,堆在二级缓存上运行。

5.抽象类和接口:
接口:定义了所有继承接口的类的语法合同。是对类的行为进行约束。
抽象类:一种特殊的类,不能被实例化。为了代码复用。

相同:不能被实例化;包含未实现方法的声明;派生类必须实现没有实现的方法:抽象类是抽象方法,接口是所有成员。
不同:抽象类可以有普通成员变量,接口不能有普通成员变量;接口中的抽象方法都是 public abstract 类型,抽象类中的抽象方法在派生类中要实现,而接口中的所有抽象方法都要在派生类中实现;一个类可以实现多个接口,但是只能继承一个抽象类;接口主要是为了定义模块之间的通信契约,抽象类主要是为了代码复用。

6.对象池用什么实现:Dictionary

7.装箱:值类型转换为object类型 拆箱:object转换为值类型

8.ref和out:使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。out用在多个返回值时,ref用在被调用方法修改被调用值时。

9.Awake在脚本实例化后被调用,生命周期中只被调用一次,在所有对象实例化以后;用于添加引用。Start在初次enable之后调用,用于初始化。

10.渲染流水线:应用阶段,几何阶段,光栅化阶段。
应用阶段:将数据加载到显存中,设置渲染状态,调用drawcall
几何阶段:进行逐点操作,将顶点坐标转换为屏幕上的坐标交给光栅器处理。
光栅化阶段:三角形设置,片元操作,逐片元着色器。

11.进程,线程,协程:
操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。
线程时cpu分配和调度资源的基本的单位
协同程序是在主程序运行时开启另一段逻辑处理,来协助主程序。

12.面向对象三个基本特征:封装,继承,多态。
封装:将客观事物封装成抽象的类,其中的成员和方法可以交给信任的对象访问,对不信任的对象隐藏。
继承:继承可以实现现有类的功能,并能无需重新编写原来的类就可以对这些功能进行拓展。
多态:覆盖和重载。覆盖是指子类可以重新定义父类的虚函数;重载是指允许存在多个重名函数,而这些函数的参数表不同。

13.虚函数:
当调用一个函数时,系统检查声明类,看调用的是否为虚函数。如果是虚函数,看实现类中是否有重写的虚函数,如果有就执行实现的虚函数,如果没有就一直向上查看他的父类,直到找到第一个已经重载虚函数的类,之后调用这个虚函数。

14.const:限定变量不允许被改变。
const隐含static,所以不可以再写static;readonly如需要可以写static readonly。
const必须再声明的时候赋值,reaonly可以进行初始化赋值。
readonly是实例化成员,不同实例可以有不同常量值。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值