Unity筆試題【20180913】
寫業務程式碼之餘,做做面試題。有錯漏的地方,歡迎指正。
1.下面的C#編寫的程式碼片段有什麼問題?
int[] a = new int[128];
foreach(int aa in a)
{
foreach(int bb in a)
{
foreach(int cc in a)
{
cc = 0;
}
}
}
答:1、外面的兩層foreach迴圈多餘;2、最裡層的foreach迴圈,不能再迴圈裡面更改變數的值。
2.物體發生碰撞的必要條件?
答:兩個物體都必須帶有collider,且其中一個必須有RigidBody。
3.Unity3D是否支援寫成多執行緒程式?如果支援的話需要注意什麼?
答:支援。如果處理事情多或者物件互動小,用Thread;否則用Coroutine。
lock關鍵字保證只有一個執行緒可以在特定時間訪問特定物件。
4.請簡述如何在不同解析度下保持UI的一致性?
答:計算出裝置的寬高比和預設的螢幕解析度的比值,修改攝像機的match size。
5.使用mipmap有什麼好處和壞處,什麼情況下使用?
答:好處:降低現存頻寬佔用,提升渲染效能,減少遠處因為解析度較大的紋理過分縮小而產生的失真。壞處:記憶體佔用變大,某些情況下導致遠處貼圖模糊。解決紋理解析度與視點距離關係的最有效途徑。
6.敘述一下Unity3D中的drawcall合併?
答:有兩種合併方法:靜態和動態。勾選static選項的物體系統強制靜態合併;非static物體在材質相同的情況下系統自動動態合併。
7.如何優化記憶體?
答:1、壓縮自帶類庫;2、暫時不用的物體先隱藏而不是直接銷燬;3、釋放AssetBundle佔用的資源;4、降低模型片數、面數、骨骼數、貼圖大小;5、使用光照貼圖、LOD、shader、Prefab。
8.物件池的原理?你覺得在遊戲裡哪些東西適合使用物件池?
答:將物件儲存在一塊預先劃出的記憶體區域,需要時取出使用。在獲取大量同類物件時可以使用物件池:子彈。
9.請簡述GC(垃圾回收)產生的原因,並描述如何避免?
答:當可分配記憶體不足時,GC就會去回收未使用的物件。避免:1、減少new的次數;2、使用公用物件,但不能亂用;3、拼接大量字串用StringBuilder(建立StringBuilder物件要設定初始大小);4、使用物件池
10.Vertex Shader是什麼,怎麼計算?
答:頂點著色器。對輸入頂點完成從本地空間到齊次空間的變換過程。
11.在塔防遊戲中,如何讓塔指向進入攻擊範圍的敵人並射擊?請簡述程式流程?
答:敵人進入塔的攻擊範圍後:1、讓發射口指向從發射口到敵人的方向;2、獲取當前塔發射的炮彈型別;3、發射炮彈