[Unity3D]藍港面試題
阿新 • • 發佈:2019-02-19
1. 請簡述值型別與引用型別的區別
答:區別:
1.值型別儲存在記憶體棧中,引用型別資料儲存在記憶體堆中,而記憶體單元中存放的是堆中存放的地址。
2.值型別存取快,引用型別存取慢。
3.值型別表示實際資料,引用型別表示指向儲存在記憶體堆中的資料的指標和引用。
4.棧的記憶體是自動釋放的,堆記憶體是.NET中會由GC來自動釋放。
5.值型別繼承自System.ValueType,引用型別繼承自System.Object。
可參考http://www.cnblogs.com/JimmyZhang/archive/2008/01/31/1059383.html
2.C#中所有引用型別的基類是什麼
答:引用型別的基類是System.Object 值型別的基類是System.ValueType
同時,值型別也隱式繼承自System.Object
3.請簡述ArrayList和List<Int>的主要區別
答:ArrayList存在不安全型別‘(ArrayList會把所有插入其中的資料都當做Object來處理)
裝箱拆箱的操作(費時)
List是介面,ArrayList是一個實現了該介面的類,可以被例項化。
4.請簡述GC(垃圾回收)產生的原因,並描述如何避免?
答:GC回收堆上的記憶體
避免:1)減少new產生物件的次數
2)使用公用的物件(靜態成員)
3)將String換為StringBuilder
5.請描述Interface與抽象類之間的不同
答:抽象類表示該類中可能已經有一些方法的具體定義,但介面就是公公只能定義各個方法的介面 ,不能具體的實現程式碼在成員方法中。
類是子類用來繼承的,當父類已經有實際功能的方法時該方法在子類中可以不必實現,直接引用父類的方法,子類也可以重寫該父類的方法。
實現介面的時候必須要實現介面中所有的方法,不能遺漏任何一個。
參考http://www.cnblogs.com/seapub/archive/2012/08/08/2628433.html
6.下列程式碼在執行中會產生幾個臨時物件?
7.下列程式碼在執行中會發生什麼問題?如何避免?
8.請簡述關鍵字Sealed用在類宣告和函式宣告時的作用
答:類宣告時可防止其他類繼承此類,在方法中宣告則可防止派生類重寫此方法。
9.請簡述private,public,protected,internal的區別
答:
public:對任何類和成員都公開,無限制訪問
private:僅對該類公開
protected:對該類和其派生類公開
internal:只能在包含該類的程式集中訪問該類
protected internal:protected + internal
10.反射的實現原理?
答:審查元資料並收集關於它的型別資訊的能力。
參考http://blog.163.com/xuanmingzhiyou@yeah/blog/static/1424776762011612115124188/
反射個人認為,就是得到程式集中的屬性和方法。
實現步驟:
1,匯入using System.Reflection;
2,Assembly.Load("程式集")載入程式集,返回型別是一個Assembly
3, foreach (Type type in assembly.GetTypes())
{
string t = type.Name;
}
得到程式集中所有類的名稱
4,Type type = assembly.GetType("程式集.類名");獲取當前類的型別
5,Activator.CreateInstance(type); 建立此型別例項
6,MethodInfo mInfo = type.GetMethod("方法名");獲取當前方法
7,mInfo.Invoke(null,方法引數);
11. .Net與Mono的關係?
答:Mono官網主頁
Mono is a software platform designed to allow developers to easily create
cross platform applications. Sponsored by Xamarin, Mono is an open source
implementation of Microsoft's .NET Framework based on the ECMA standards for C# and the Common Language Runtime.
mono是.net的一個開源跨平臺工具,就類似java虛擬機器,java本身不是跨平臺語言,但執行在虛擬機器上就能夠實現了跨平臺。.net只能在windows下執行,mono可以實現跨平臺跑,
可以運行於linux,Unix,Mac OS等。
12.簡述Unity3D支援的作為指令碼的語言的名稱
答:Unity的指令碼語言基於Mono的.Net平臺上執行,可以使用.NET庫,這也為XML、資料庫、正則表示式等問題提供了很好的解決方案。
Unity裡的指令碼都會經過編譯,他們的執行速度也很快。這三種語言實際上的功能和執行速度是一樣的,區別主要體現在語言特性上。
JavaScript:和網頁中常用的JavaScript不一樣,它編譯後的執行速度很快,語法方面也會有不少區別。
C#
Boo:可以看做是Python語言的變種,又糅合了Ruby和C#的特性,它是靜態型別語言
13.Unity3D是否支援寫成多執行緒程式?如果支援的話需要注意什麼?
答:參考http://www.unitymanual.com/3821.html
僅能從主執行緒中訪問Unity3D的元件,物件和Unity3D系統呼叫
支援:如果同時你要處理很多事情或者與Unity的物件互動小可以用thread,否則使用coroutine。
注意:C#中有lock這個關鍵字,以確保只有一個執行緒可以在特定時間內訪問特定的物件
14.Unity3D的協程和C#執行緒之間的區別是什麼?
答:http://blog.csdn.net/kongbu0622/article/details/8775037
多執行緒程式同時執行多個執行緒 ,而在任一指定時刻只有一個協程在執行,並且這個正在執行的協同程式只在必要時才被掛起。
除主執行緒之外的執行緒無法訪問Unity3D的物件、元件、方法。
Unity3d沒有多執行緒的概念,不過unity也給我們提供了StartCoroutine(協同程式)和LoadLevelAsync(非同步載入關卡)後臺載入場景的方法。 StartCoroutine為什麼叫協同程式呢,所謂協同,就是當你在StartCoroutine的函式體裡處理一段程式碼時,利用yield語句等待執行結果,這期間不影響主程式的繼續執行,可以協同工作。而LoadLevelAsync則允許你在後臺載入新資源和場景,所以再利用協同,你就可以前臺用loading條或動畫提示玩家遊戲未卡死,同時後臺協同處理載入的事宜asynchronous[e ɪˈ s ɪŋ kr ə n ə s] .synchronous同步。
15.U3D中用於記錄節點空間幾何資訊的元件名稱,及其父類名稱
答:Transform 父類是 Component
16.簡述四元數的作用,四元數對尤拉角的優點?
答:四元數用於表示旋轉
相對尤拉角的優點:
1)能進行增量旋轉
2)避免萬向鎖
3)給定方位的表達方式有兩種,互為負(尤拉角有無數種表達方式)
17.向量的點乘、叉乘以及歸一化的意義?
1)點乘描述了兩個向量的相似程度,結果越大兩向量越相似,還可表示投影
2)叉乘得到的向量垂直於原來的兩個向量
3)標準化向量:用在只關係方向,不關心大小的時候
18.矩陣相乘的意義及注意點
用於表示線性變換:旋轉、縮放、投影、平移、仿射
注意矩陣的蠕變:誤差的積累
19.為何大家都在移動裝置上尋求U3D原生GUI的替代方案
不美觀,OnGUI很耗費時間,使用不方便
20.請簡述如何在不同解析度下保持UI的一致性
NGUI很好的解決了這一點,螢幕解析度的自適應性,原理就是計算出螢幕的寬高比跟原來的預設的螢幕解析度求出一個對比值,然後修改攝像機的size。
原生GUI http://unity3d.9ria.com/?p=2587
NGUI http://blog.csdn.net/mfc11/article/details/17681429
21.為什麼dynamic font在unicode環境下優於static font
Unicode是國際組織制定的可以容納世界上所有文字和符號的字元編碼方案。
使用動態字型時,Unity將不會預先生成一個與所有字型的字元紋理。當需要支援亞洲語言或者較大的字型的時候,若使用正常紋理,則字型的紋理將非常大。
22.Render的作用?描述MeshRender和SkinnedMeshRender的關係與不同
A renderer is what makes an object appear on the screen。
23.簡述SkinnedMesh的實現原理
http://blog.csdn.net/n5/article/details/3105872
24.在場景中放置多個Camera並同時處於活動狀態會發生什麼?
答:遊戲介面可以看到很多攝像機的混合
25.Prefab的作用?如何在移動環境的裝置下恰當地使用它?
答:Prefab在例項化的時候用到,主要用於經常會用到的物體,屬性方便修改
http://www.cnblogs.com/88999660/archive/2013/03/15/2961663.html
26.如何銷燬一個UnityEngine.Object及其子類
答:Destory
27.為什麼Unity3D中會發生在元件上出現數據丟失的情況?
答:元件上繫結的物件被刪除了
28.如何安全的在不同工程間安全地遷移asset資料?三種方法
答:
29.MeshCollider和其他Collider的一個主要不同點?
答:Convex?
30.當一個細小的高速物體撞向另一個較大的物體時,會出現什麼情況?如何避免?
穿透(碰撞檢測失敗)
http://forum.unity3d.com/threads/3353-collision-detection-at-high-speed
31.OnEnable、Awake、Start執行時的發生順序?哪些可能在同一個物件週期中反覆的發生?
答:Awake -》OnEnable-》Start
OnEnable在同一週期中可以反覆地發生
http://answers.unity3d.com/questions/217941/onenable-awake-start-order.html
32.請簡述OnBecameVisible及OnBecameInvisible的發生時機,以及這一對回撥函式的意義?
答:當物體是否可見切換之時。可以用於只需要在物體可見時才進行的計算。
33.Unity3D如何獲知場景中需要載入的資料?
題目是獲取的意思?
Resource.Load
AssetBundle
34.MeshRender中material和sharedmaterial的區別?
修改sharedMaterial將改變所有物體使用這個材質的外觀,並且也改變儲存在工程裡的材質設定。
不推薦修改由sharedMaterial返回的材質。如果你想修改渲染器的材質,使用material替代。
答:區別:
1.值型別儲存在記憶體棧中,引用型別資料儲存在記憶體堆中,而記憶體單元中存放的是堆中存放的地址。
2.值型別存取快,引用型別存取慢。
3.值型別表示實際資料,引用型別表示指向儲存在記憶體堆中的資料的指標和引用。
4.棧的記憶體是自動釋放的,堆記憶體是.NET中會由GC來自動釋放。
5.值型別繼承自System.ValueType,引用型別繼承自System.Object。
可參考http://www.cnblogs.com/JimmyZhang/archive/2008/01/31/1059383.html
2.C#中所有引用型別的基類是什麼
答:引用型別的基類是System.Object 值型別的基類是System.ValueType
同時,值型別也隱式繼承自System.Object
3.請簡述ArrayList和List<Int>的主要區別
答:ArrayList存在不安全型別‘(ArrayList會把所有插入其中的資料都當做Object來處理)
裝箱拆箱的操作(費時)
List是介面,ArrayList是一個實現了該介面的類,可以被例項化。
4.請簡述GC(垃圾回收)產生的原因,並描述如何避免?
答:GC回收堆上的記憶體
避免:1)減少new產生物件的次數
2)使用公用的物件(靜態成員)
3)將String換為StringBuilder
5.請描述Interface與抽象類之間的不同
答:抽象類表示該類中可能已經有一些方法的具體定義,但介面就是公公只能定義各個方法的介面 ,不能具體的實現程式碼在成員方法中。
類是子類用來繼承的,當父類已經有實際功能的方法時該方法在子類中可以不必實現,直接引用父類的方法,子類也可以重寫該父類的方法。
實現介面的時候必須要實現介面中所有的方法,不能遺漏任何一個。
參考http://www.cnblogs.com/seapub/archive/2012/08/08/2628433.html
6.下列程式碼在執行中會產生幾個臨時物件?
- string a = new string("abc");
- a = (a.ToUpper() + "123").Substring(0, 2);
- string b = new string(new char[]{'a','b','c'});
7.下列程式碼在執行中會發生什麼問題?如何避免?
- List<int> ls = new List<int>(new int[] { 1, 2, 3, 4, 5 });
- foreach (int item in ls)
- {
- Console.WriteLine(item * item);
- ls.Remove(item);
- }
8.請簡述關鍵字Sealed用在類宣告和函式宣告時的作用
答:類宣告時可防止其他類繼承此類,在方法中宣告則可防止派生類重寫此方法。
9.請簡述private,public,protected,internal的區別
答:
public:對任何類和成員都公開,無限制訪問
private:僅對該類公開
protected:對該類和其派生類公開
internal:只能在包含該類的程式集中訪問該類
protected internal:protected + internal
10.反射的實現原理?
答:審查元資料並收集關於它的型別資訊的能力。
參考http://blog.163.com/xuanmingzhiyou@yeah/blog/static/1424776762011612115124188/
反射個人認為,就是得到程式集中的屬性和方法。
實現步驟:
1,匯入using System.Reflection;
2,Assembly.Load("程式集")載入程式集,返回型別是一個Assembly
3, foreach (Type type in assembly.GetTypes())
{
string t = type.Name;
}
得到程式集中所有類的名稱
4,Type type = assembly.GetType("程式集.類名");獲取當前類的型別
5,Activator.CreateInstance(type); 建立此型別例項
6,MethodInfo mInfo = type.GetMethod("方法名");獲取當前方法
7,mInfo.Invoke(null,方法引數);
11. .Net與Mono的關係?
答:Mono官網主頁
Mono is a software platform designed to allow developers to easily create
cross platform applications. Sponsored by Xamarin, Mono is an open source
implementation of Microsoft's .NET Framework based on the ECMA standards for C# and the Common Language Runtime.
mono是.net的一個開源跨平臺工具,就類似java虛擬機器,java本身不是跨平臺語言,但執行在虛擬機器上就能夠實現了跨平臺。.net只能在windows下執行,mono可以實現跨平臺跑,
可以運行於linux,Unix,Mac OS等。
12.簡述Unity3D支援的作為指令碼的語言的名稱
答:Unity的指令碼語言基於Mono的.Net平臺上執行,可以使用.NET庫,這也為XML、資料庫、正則表示式等問題提供了很好的解決方案。
Unity裡的指令碼都會經過編譯,他們的執行速度也很快。這三種語言實際上的功能和執行速度是一樣的,區別主要體現在語言特性上。
JavaScript:和網頁中常用的JavaScript不一樣,它編譯後的執行速度很快,語法方面也會有不少區別。
C#
Boo:可以看做是Python語言的變種,又糅合了Ruby和C#的特性,它是靜態型別語言
13.Unity3D是否支援寫成多執行緒程式?如果支援的話需要注意什麼?
答:參考http://www.unitymanual.com/3821.html
僅能從主執行緒中訪問Unity3D的元件,物件和Unity3D系統呼叫
支援:如果同時你要處理很多事情或者與Unity的物件互動小可以用thread,否則使用coroutine。
注意:C#中有lock這個關鍵字,以確保只有一個執行緒可以在特定時間內訪問特定的物件
14.Unity3D的協程和C#執行緒之間的區別是什麼?
答:http://blog.csdn.net/kongbu0622/article/details/8775037
多執行緒程式同時執行多個執行緒 ,而在任一指定時刻只有一個協程在執行,並且這個正在執行的協同程式只在必要時才被掛起。
除主執行緒之外的執行緒無法訪問Unity3D的物件、元件、方法。
Unity3d沒有多執行緒的概念,不過unity也給我們提供了StartCoroutine(協同程式)和LoadLevelAsync(非同步載入關卡)後臺載入場景的方法。 StartCoroutine為什麼叫協同程式呢,所謂協同,就是當你在StartCoroutine的函式體裡處理一段程式碼時,利用yield語句等待執行結果,這期間不影響主程式的繼續執行,可以協同工作。而LoadLevelAsync則允許你在後臺載入新資源和場景,所以再利用協同,你就可以前臺用loading條或動畫提示玩家遊戲未卡死,同時後臺協同處理載入的事宜asynchronous[e ɪˈ s ɪŋ kr ə n ə s] .synchronous同步。
15.U3D中用於記錄節點空間幾何資訊的元件名稱,及其父類名稱
答:Transform 父類是 Component
16.簡述四元數的作用,四元數對尤拉角的優點?
答:四元數用於表示旋轉
相對尤拉角的優點:
1)能進行增量旋轉
2)避免萬向鎖
3)給定方位的表達方式有兩種,互為負(尤拉角有無數種表達方式)
17.向量的點乘、叉乘以及歸一化的意義?
1)點乘描述了兩個向量的相似程度,結果越大兩向量越相似,還可表示投影
2)叉乘得到的向量垂直於原來的兩個向量
3)標準化向量:用在只關係方向,不關心大小的時候
18.矩陣相乘的意義及注意點
用於表示線性變換:旋轉、縮放、投影、平移、仿射
注意矩陣的蠕變:誤差的積累
19.為何大家都在移動裝置上尋求U3D原生GUI的替代方案
不美觀,OnGUI很耗費時間,使用不方便
20.請簡述如何在不同解析度下保持UI的一致性
NGUI很好的解決了這一點,螢幕解析度的自適應性,原理就是計算出螢幕的寬高比跟原來的預設的螢幕解析度求出一個對比值,然後修改攝像機的size。
原生GUI http://unity3d.9ria.com/?p=2587
NGUI http://blog.csdn.net/mfc11/article/details/17681429
21.為什麼dynamic font在unicode環境下優於static font
Unicode是國際組織制定的可以容納世界上所有文字和符號的字元編碼方案。
使用動態字型時,Unity將不會預先生成一個與所有字型的字元紋理。當需要支援亞洲語言或者較大的字型的時候,若使用正常紋理,則字型的紋理將非常大。
22.Render的作用?描述MeshRender和SkinnedMeshRender的關係與不同
A renderer is what makes an object appear on the screen。
23.簡述SkinnedMesh的實現原理
http://blog.csdn.net/n5/article/details/3105872
24.在場景中放置多個Camera並同時處於活動狀態會發生什麼?
答:遊戲介面可以看到很多攝像機的混合
25.Prefab的作用?如何在移動環境的裝置下恰當地使用它?
答:Prefab在例項化的時候用到,主要用於經常會用到的物體,屬性方便修改
http://www.cnblogs.com/88999660/archive/2013/03/15/2961663.html
26.如何銷燬一個UnityEngine.Object及其子類
答:Destory
27.為什麼Unity3D中會發生在元件上出現數據丟失的情況?
答:元件上繫結的物件被刪除了
28.如何安全的在不同工程間安全地遷移asset資料?三種方法
答:
- 將Assets目錄和Library目錄一起遷移
- 匯出包
- 用unity自帶的assets Server功能
29.MeshCollider和其他Collider的一個主要不同點?
答:Convex?
30.當一個細小的高速物體撞向另一個較大的物體時,會出現什麼情況?如何避免?
穿透(碰撞檢測失敗)
http://forum.unity3d.com/threads/3353-collision-detection-at-high-speed
31.OnEnable、Awake、Start執行時的發生順序?哪些可能在同一個物件週期中反覆的發生?
答:Awake -》OnEnable-》Start
OnEnable在同一週期中可以反覆地發生
http://answers.unity3d.com/questions/217941/onenable-awake-start-order.html
32.請簡述OnBecameVisible及OnBecameInvisible的發生時機,以及這一對回撥函式的意義?
答:當物體是否可見切換之時。可以用於只需要在物體可見時才進行的計算。
33.Unity3D如何獲知場景中需要載入的資料?
題目是獲取的意思?
Resource.Load
AssetBundle
34.MeshRender中material和sharedmaterial的區別?
修改sharedMaterial將改變所有物體使用這個材質的外觀,並且也改變儲存在工程裡的材質設定。
不推薦修改由sharedMaterial返回的材質。如果你想修改渲染器的材質,使用material替代。