Unity面试准备

前言

为Unity面试而准备一些问题,如果有什么说的不对的,欢迎指正

语言机制类

1、GC机制

在C/C++中程序员要自己负责系统的内存管理,而C#采用Garbage Collection自动回收内存,
当Java虚拟机(VM)或.NETCLR发觉内存资源紧张的时候,就会自动地去清理无用对象(没有被引用到的对象)所占用的内存空间,
查找没有被引用的对象有一系列的算法,
Lua语言的GC机制采用是Mark and Sweep算法

2、协程线程进程

进程一个具有独立功能的程序在一个数据集合上的一次动态执行过程(程序是静态的代码,进程是动态执行的过程)
线程进程是分配资源的基本单位,而线程则是系统调度的基本单位
一个进程内部的线程可以共享该进程的所分配到的资源。线程的创建与撤消,线程之间的切换所占用的资源比进程要少很多。
总的来说就是为了更进一步提高系统的并发性,提高CPU的利用率。
协程:是一种比线程更加轻量级的存在,协程调度不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行),你可以随时把它挂起。
一个线程里可以有多个协程。协程的切换几乎没有操作系统的内核开销,不会像线程切换那样消耗资源(线程切换要改Context)。
协程的一大好处就是可以避免数据访问冲突的问题因为它的粒度相对多线程的大很多,所以往往很少出现冲突现象。协程写入死循环会将线程卡死。

3、装箱与拆箱

值类型变量封装object类型变量或者对应的object将这个值类型从栈区copy到堆区产生一个引用类型叫做装箱;
把这个堆上的obj转成值类型,从堆上往栈上搬东西叫做拆箱,装箱和拆箱会损失一定性能。
按理说C#被设计成一种完全面向对象的语言。因此,包括数字、字符、日期、布尔值等等在内的一切,都是对象。似乎只需要一种方式来对待这些对象就可以了。
但是C#必须为性能而妥协,我们知道,对于CPU来说,处理一个完整的对象,需要很多的指令,
对于内存来说,又需要很多的内存。如果连整数都是对象,那么性能自然很低。
C#于是使用了一种机制,使得这些基本类型在一般的编程中被当作非对象的简单类型处理,
在另一些场合(比如需要多个脚本引用同一个对象)又允许它们被视作是一个对象。(摘自评论

4、值类型和引用类型的区别

  • 值类型的数据存储在内存的栈中,引用类型的数据存储在内存的堆中
  • 值类型存取速度快,引用类型存取速度慢
  • 类型表示实际数据放在栈中;引用类型表示指向存储在内存堆中的数据的指针或引用,在栈中存放实际数据的地址,堆上存放实际数据
  • 栈的内存分配是自动释放;而堆在.NET中会有GC来释放
  • 值类型继承自System.ValueType,引用类型继承自System.Object

5、lua如何实现面向对象?lua的元表?

由于暂时没怎么学lua,TODOOOOOOOOOO

6、闭包

闭包是指有权访问另一个函数作用域中的变量的函数
闭包这个词本身指的是一种函数。而创建这种特殊函数的一种常见方式是在一个函数中创建另一个函数。
闭包中引用的变量实际上就是把原来声明在主体中的变量,
转移到用匿名密封类或者结构体里,最终在主体中访问的变量就是生成的匿名类中对象。来自博客
C#里可以在函数里放一个委托或者匿名函数引用局部变量。

Unity常用组件类

1、Canvas的三种渲染模式

Screen Space - Overlay:UI元素直接覆盖在任何摄像机的上方。
Screen Space - Camera:需要指定一个摄像机,UI组件可以控制和摄像机的距离,可以和场景里的物体做一些遮挡之类的交互。
World Space :画布相对于世界空间,和场景物体一样有遮挡关系,可以旋转,3d UI制作,没有屏幕自适应。

2、Mono生命周期

分阶段作展示,这里就不配图了,主要是生命周期太长了
初始化:Awake -> OnEnable ->Start ->
物理计算:FixedUpdate -> OnTrigger/Collision->
游戏逻辑:InputEvent -> Update-> yield(唤醒挂起的协程,前面fixedUpdate也有yield) ->
动画运算:OnAnimatorMove/IK(取决于Animator的 UpdateMode怎么选而有区别,
如果是Normal则处于Update后,如果是Physics的话则处于FixedUpdate之后) ->
渲染:Scence Rendering -> Gizmos ->GUI ->
应用处理:OnApplicationPause -> OnApplicationQuit ->
退出:OnDisable -> OnDestory
Unity后台主线程将 Update LateUpdate 制作成两个多线程先去执行Update的线程,
等Update 执行完毕后 在去执行LateUpdate线程,LateUpdate常用于摄像机跟随等滞后操作,Update里适合写逻辑

数据结构类

1、Dictionary的插入时间复杂度?

Dictionary内部实现为一个哈希表,通过设置好的哈希映射,达到常数级的时间复杂度。

2、平衡二叉树的插入时间复杂度?
查询是Log n的,查到应该插在哪即可用常数级去插入,合起来时间复杂度Log n。

3、手写快排

我的短板

4、散列算法&&哈希冲突

先去补一补,晚点更新

设计模式类

1、MVC

Model模型对象
View 展示界面
Controller 控制器

用户使用Controller里面的方法控制Controller关联的一个Model,然后更新View视图,Controller相当于一个访问对象的中介器。
个人感觉unity、一般的3d建模、绘图软件的结构都是MVC的,这种模式用于应用程序的分层开发。

2、工厂模式

管理对象创建,用来解耦编译阶段的new关键字而用工厂方法去完成对象的创建,调用者通过制定一个对象工厂来确定创建什么对象,是一种从编译耦合到运行耦合的转移

红色为稳定部分,一个是产品基类一个是工厂基类

猜你喜欢

转载自www.cnblogs.com/FlyingZiming/p/12521257.html