Unity遊戲程序員面試題及解答

典型的一些如手寫排序算法、一些基本數學問題,在此就不列舉了。如下整理出一些表明性的、有參考價值的題,真實面試題,附有本人的解答,歡迎討論。面試

 

題1.指出下列哪些屬於值類型?算法

int  System.Object  string  UnityEngine.MonoBehaviour  UnityEngine.Object  struct  enum  Vector3函數

說明:System.Object是全部類型的基類,其自己是引用類型。性能

 

題2.獲取、增長、刪除組建的命令分別是什麼?spa

獲取:   GetComponent()     增長:   AddComponent()     刪除:   RemoveComponent()   插件

 

題3.簡述你使用過哪些第三方插件?code

Skyshop作IBL和PBR,Shatter Toolkit作模型物理破碎,Final IK插件作反向運動學計算。orm

說明:IBL是基於圖像的渲染,PBR是基於物理的渲染。對象

 

題4.簡述一下對象池原理。什麼狀況下使用?blog

對象池能夠將對象存儲在一塊預先劃出的內存區域中,當須要時能夠取出使用,而不須要每次都要實例化新的對象。通常在須要循環獲取一個對象可是不關心對象的創造時機時的狀況下可使用。

說明:對象池在不少語言中都有實現。因此回答沒必要拘泥於某種具體的語言,說出它的思想便可。

 

題5.使用mipmap有什麼好處和壞處?什麼狀況下使用?

答:使用mipmap能夠下降現存帶寬佔用,提高渲染性能,還能減小遠處由於分辨率較大的紋理因過度縮小而產生的失真。壞處是會使內存佔用變大,某些狀況下會致使遠處貼圖模糊。

說明:mipmap是一種紋理技術, 在三維世界中,顯示一張圖的大小與攝象機的位置有關,近的地方,圖片實際象素就大一些,遠的地方圖片實際象素就會小一些,就要進行一些壓縮,例如一張64*64的圖,在近處,顯示出來多是50*50,在遠處可能顯示出來是20*20.若是隻限於簡單的去除某些像素,將會使縮小後的圖片損失不少細節,圖片變得很粗糙,所以,圖形學有不少複雜的方法來處理縮小圖片的問題,使得縮小後的圖片依然清晰.

       Mipmap紋理技術是目前解決紋理分辨率與視點距離關係的最有效途徑,它會先將圖片壓縮成不少逐漸縮小的圖片,例如一張64*64的圖片,會產生64*64,32*32,16*16,8*8,4*4,2*2,1*1的7張圖片,當屏幕上須要繪製像素點爲20*20 時,程序只是利用 32*32 和 16*16 這兩張圖片來計算出即將顯示爲 20*20 大小的一個圖片,這比單獨利用 32*32 的那張原始片計算出來的圖片效果要好得多,速度也更快.

固然你不須要回答這些原理,簡單描述一下便可。

 

題6.敘述一下unity3D中的drawcall合併。

答:Unity中使用兩種方法進行drawcall合併:靜態和動態。勾選static選項的物體系統強制進行靜態合併;對於非static的物體,在材質相同的狀況下系統會自動進行動態合併。

說明:就如同D3D的Render()同樣,Unity每次在準備數據並通知GPU渲染的過程稱爲一次Draw Call。注意本題不是要你解釋"Drawcall"而是解釋"Drawcall合併"。

 

題7.簡述蘭徹斯特方程在遊戲開發中的用途α[M^2- m(t)^2]=β[N^2- n(t)^2]和α[M-m(t)]=β[N-n(t)]

答:式中α、β分別爲交戰雙方在單位時間內毀傷對方戰鬥單位數,m(t)、n(t)表示在戰鬥開始後t時刻雙方在戰鬥中尚存的做

戰單位數,假設交戰開始時刻雙方的初始戰鬥單位數爲m(0)=M,n(0)=N,在交戰過程當中雙方戰鬥單位數符合下列狀態方程:

α[M^2- m(t)^2]=β[N^2- n(t)^2]

或者

α[M - m(t)]=β[N - n(t)]。

說明:基本上答到意思就行 。

 

題8.

int[] a = new int[128]; foreach (int aa in a) { foreach(int bb in a) { foreach(int cc in a) { cc = 0; } } }

上述C#編寫的代碼片斷有什麼問題?

答:首先,在foreach中對臨時變量cc賦值自己語法就是錯誤的,編譯器通不過編譯。其次,這種嵌套屢次使用foreach循環的方式是不妥的,由於foreach語句會產生少許的內存損耗,在性能上也不佳。

說明:(1)要說出語法錯誤; (2)說出foreach內存和性能損耗,或者不如for語句等缺點。 

 

題9.

public class Dialog{} { public static GameObject m_NPC; public static void ShowDialog() { m_NPC=Object.Instanciate(Resource.Load("npc") as GameObject); SaySomething(m_NPC); } } void static SaySomething(GameObject npc) { ... }

假定以上使用C#編寫的類沒有語法錯誤,且能在Unity3D引擎中正常使用。問該類存在哪些問題或隱患?

答:以上Dialog類在實際中會屢次調用,而每次調用都要從新載入一樣的資源和實例化,這是一種損耗性能的作法。

說明:這道題根據題目描述能夠推測是取自實際項目中的,那麼確定是存在必定的不妥纔拿出來出題的。各位若是還有什麼好的建議能夠留言。

 

題10.

 1 public struct FallCacheInfo  2 {  3     public Transform parent;  4 }  5 
 6 public class LevelManager  7 {  8  Transform transform;  9     Dictionary<int,FallCacheInfo> m_FallInfo = new Dictionary<int,FallCacheInfo>(); 10     
11     void Fall(int id) 12  { 13  FallCacheInfo fci; 14         fci.parent = null; 15         m_FallInfo[id] = fci; 16 
17         fci.parent = GameObject.findChild("POS"); 18  } 19 } 20 
21 void OnWaitFallActorLoaded(int id) 22 { 23  FallCacheInfo fci; 24     if(m_FallInfo.TryGetValue(id,out fci)) 25  { 26         transform.parent = fci.parent; 27  } 28 }

上述代碼,假定場景中存在名爲"POS"的對象,transform也爲存在的對象,Fall和OnWaitFallActorLoaded函數依次被執行,請問transform最終被掛到哪一個物體(或節點)下?

答:最終被掛在根節點下。

說明:請讀者思考。

相關文章
相關標籤/搜索