Unity面试准备

前言

为Unity面试而准备一些问题,若是有什么说的不对的,欢迎指正程序员

语言机制类

一、GC机制面试

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

二、协程线程进程编程

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

三、装箱与拆箱数据结构

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

四、值类型和引用类型的区别闭包

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

五、lua如何实现面向对象?lua的元表?并发

因为暂时没怎么学lua,TODOOOOOOOOOO

六、闭包

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

Unity经常使用组件类

一、Canvas的三种渲染模式

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

二、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里适合写逻辑

数据结构类

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

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

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

三、手写快排

个人短板

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

先去补一补,晚点更新

设计模式类

一、MVC

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

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

二、工厂模式

管理对象建立,用来解耦编译阶段的new关键字而用工厂方法去完成对象的建立,调用者经过制定一个对象工厂来肯定建立什么对象,是一种从编译耦合到运行耦合的转移
红色为稳定部分,一个是产品基类一个是工厂基类

相关文章
相关标签/搜索