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關鍵字而用工廠方法去完成對象的建立,調用者經過制定一個對象工廠來肯定建立什麼對象,是一種從編譯耦合到運行耦合的轉移
紅色爲穩定部分,一個是產品基類一個是工廠基類

相關文章
相關標籤/搜索