一:什麼是協同程序?
答:在主線程運行時同時開啓另外一段邏輯處理,來協助當前程序的執行。換句話說,開啓協程就是開啓一個能夠與程序並行的邏輯。能夠用來控制運動、序列以及對象的行爲。javascript
二:Unity3d中的碰撞器和觸發器的區別?
答:碰撞器是觸發器的載體,而觸發器只是碰撞器身上的一個屬性。
當Is Trigger=false
時,碰撞器根據物理引擎引起碰撞,產生碰撞的效果,能夠調用OnCollisionEnter/Stay/Exit
函數;
當Is Trigger=true
時,碰撞器被物理引擎所忽略,沒有碰撞效果,能夠調用OnTriggerEnter/Stay/Exit
函數。
若是既要檢測到物體的接觸又不想讓碰撞檢測影響物體移動或要檢測一個物件是否通過空間中的某個區域這時就能夠用到觸發器php
三:物體發生碰撞的必要條件
答:兩個物體都必須帶有碰撞器Collider
,其中一個物體還必須帶有Rigidbody
剛體。java
四:請簡述ArrayList
和List<Int>
的主要區別
答:ArrayList
存在不安全類型linux
List
是接口,ArrayList
是一個實現了該接口的類,能夠被實例化c++
五:請簡述GC(垃圾回收)產生的緣由,並描述如何避免?
答:GC回收堆上的內存
避免:
1)減小new產生對象的次數
2)使用公用的對象(靜態成員)
3)將String
換爲StringBuilder
git
六:反射的實現原理?
答:審查元數據並收集關於它的類型信息的能力。
實現步驟:程序員
using System.Reflection
;Assembly.Load("程序集");
//加載程序集,返回類型是一個Assemblyforeach (Type type in assembly.GetTypes()) { string t = type.Name; }
Type type = assembly.GetType("程序集.類名");//獲取當前類的類型
Activator.CreateInstance(type); //建立此類型實例
MethodInfo mInfo = type.GetMethod("方法名");//獲取當前方法
mInfo.Invoke(null,方法參數);
七:簡述四元數Quaternion
的做用,四元數對歐拉角的優勢?
答:四元數用於表示旋轉
相對歐拉角的優勢:github
八:如何安全的在不一樣工程間安全地遷移asset數據?三種方法
答:
1.將Assets
和Library
一塊兒遷移
2.導出包package
3.用unity自帶的assets Server功能web
九:OnEnable
、Awake
、Start
運行時的發生順序?哪些可能在同一個對象週期中反覆的發生?
答:Awake
–>OnEnable
->Start
OnEnable
在同一週期中能夠反覆地發生!面試
十:MeshRender
中material
和sharedmaterial
的區別?
答:
修改sharedMaterial
將改變全部物體使用這個材質的外觀,而且也改變儲存在工程裏的材質設置。
不推薦修改由sharedMaterial返回的材質。若是你想修改渲染器的材質,使用material替代。
十一:請簡述ArrayList和List之間的主要區別。
十二:TCP/IP協議棧各個層次及分別的功能
答:網絡接口層:這是協議棧的最低層,對應OSI的物理層和數據鏈路層,主要完成數據幀的實際發送和接收。
網絡層:處理分組在網絡中的活動,例如路由選擇和轉發等,這一層主要包括IP協議、ARP、ICMP協議等。
傳輸層:主要功能是提供應用程序之間的通訊,這一層主要是TCP/UDP協議。
應用層:用來處理特定的應用,針對不一樣的應用提供了不一樣的協議,例如進行文件傳輸時用到的FTP協議,發送email用到的SMTP等。
十三題:Unity提供了幾種光源,分別是什麼
答:
四種。
平行光:Directional Light
點光源:Point Light
聚光燈:Spot Light
區域光源:Area Light
十四:簡述一下對象池,你以爲在FPS裏哪些東西適合使用對象池?
對象池就存放須要被反覆調用資源的一個空間,好比遊戲中要常被大量複製的對象,子彈,敵人,以及任何重複出現的對象。
十五:CharacterController
和Rigidbody
的區別?Rigidbody
具備徹底真實物理的特性,而CharacterController
能夠說是受限的的Rigidbody
,具備必定的物理效果但不是徹底真實的。
十六:移動相機動做在哪一個函數裏,爲何在這個函數裏?LateUpdate
,是在全部的Update
結束後才調用,比較適合用於命令腳本的執行。官網上例子是攝像機的跟隨,都是全部的Update
操做完才進行攝像機的跟進,否則就有可能出現攝像機已經推動了,可是視角里還未有角色的空幀出現。
十七:簡述prefab
的用處
在遊戲運行時實例化,prefab
至關於一個模板,對你已經有的素材、腳本、參數作一個默認的配置,以便於之後的修改,同事prefab
打包的內容簡化了導出的操做,便於團隊的交流。
十八:請簡述sealed
關鍵字用在類聲明時與函數聲明時的做用。
答:類聲明時可防止其餘類繼承此類,在方法中聲明則可防止派生類重寫此方法。
十九:請簡述private
,public
,protected
,internal
的區別。public
:對任何類和成員都公開,無限制訪問private
:僅對該類公開protected
:對該類和其派生類公開internal
:只能在包含該類的程序集中訪問該類protected internal
:protected + internal
二十:簡述SkinnedMesh的實現原理
二十一:GPU的工做原理
簡而言之,GPU的圖形(處理)流水線完成以下的工做:(並不必定是按照以下順序)
頂點處理:這階段GPU讀取描述3D圖形外觀的頂點數據並根據頂點數據肯定3D圖形的形狀及位置關係,創建起3D圖形的骨架。在支持DX8和DX9規格的GPU中,這些工做由硬件實現的Vertex Shader(定點着色器)完成。
光柵化計算:顯示器實際顯示的圖像是由像素組成的,咱們須要將上面生成的圖形上的點和線經過必定的算法轉換到相應的像素點。把一個矢量圖形轉換爲一系列像素點的過程就稱爲光柵化。例如,一條數學表示的斜線段,最終被轉化成階梯狀的連續像素點。
紋理帖圖:頂點單元生成的多邊形只構成了3D物體的輪廓,而紋理映射(texture mapping)工做完成對多變形表面的帖圖,通俗的說,就是將多邊形的表面貼上相應的圖片,從而生成「真實」的圖形。TMU(Texture mapping unit)便是用來完成此項工做。
像素處理:這階段(在對每一個像素進行光柵化處理期間)GPU完成對像素的計算和處理,從而肯定每一個像素的最終屬性。在支持DX8和DX9規格的GPU中,這些工做由硬件實現的Pixel Shader(像素着色器)完成。
最終輸出:由ROP(光柵化引擎)最終完成像素的輸出,1幀渲染完畢後,被送到顯存幀緩衝區。
總結:GPU的工做通俗的來講就是完成3D圖形的生成,將圖形映射到相應的像素點上,對每一個像素進行計算肯定最終顏色並完成輸出。
二十二:什麼是渲染管道?
答:是指在顯示器上爲了顯示出圖像而通過的一系列必要操做。 渲染管道中的不少步驟,都要將幾何物體從一個座標系中變換到另外一個座標系中去。
主要步驟有:
本地座標->視圖座標->背面裁剪->光照->裁剪->投影->視圖變換->光柵化。
二十三:如何優化內存?
答:有不少種方式,例如
1.壓縮自帶類庫;
2.將暫時不用的之後還須要使用的物體隱藏起來而不是直接Destroy掉;
3.釋放AssetBundle佔用的資源;
4.下降模型的片面數,下降模型的骨骼數量,下降貼圖的大小;
5.使用光照貼圖,使用多層次細節(LOD),使用着色器(Shader),使用預設(Prefab)。
二十四:動態加載資源的方式?
1.Resources.Load();
2.AssetBundle
Unity5.1
版本後能夠選擇使用Git: https://github.com/applexiaohao/LOAssetFramework.git
二十五:你用過哪些插件?
二十六: 使用Unity3d實現2d遊戲,有幾種方式?
答:
1.使用自己的GUI
、UGUI
2.把攝像機的Projection(投影)
值調爲Orthographic(正交投影)
,不考慮z軸;
3.使用2d插件,如:2DToolKit
、NGUI
二十七:在物體發生碰撞的整個過程當中,有幾個階段,分別列出對應的函數 三個階段
答:
OnCollisionEnter
OnCollisionStay
OnCollisionExit
二十八:Unity3d的物理引擎中,有幾種施加力的方式,分別描述出來
答:
rigidbody.AddForce
rigidbody.AddForceAtPosition
二十九:什麼叫作鏈條關節?
答:Hinge Joint
,能夠模擬兩個物體間用一根鏈條鏈接在一塊兒的狀況,能保持兩個物體在一個固定距離內部相互移動而不產生做用力,可是達到固定距離後就會產生拉力。
三十:物體自身旋轉使用的函數?
答: Transform.Rotate()
三十一:Unity3d提供了一個用於保存和讀取數據的類(PlayerPrefs),請列出保存和讀取整形數據的函數
答:
PlayerPrefs.SetInt()
PlayerPrefs.GetInt()
三十二:Unity3d腳本從喚醒到銷燬有着一套比較完整的生命週期,請列出系統自帶的幾個重要的方法。
答:Awake——>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>Reset——>OnDisable——>OnDestroy
三十三:物理更新通常放在哪一個系統函數裏?
答:FixedUpdate
,每固定幀繪製時執行一次,和Update不一樣的是FixedUpdate是渲染幀執行,若是你的渲染效率低下的時候FixedUpdate調用次數就會跟着降低。
三十四:在場景中放置多個Camera
並同時處於活動狀態會發生什麼?
答:遊戲界面能夠看到不少攝像機的混合。
三十五:如何銷燬一個UnityEngine.Object及其子類?
答: 使用Destroy()
方法;
三十六:請描述遊戲動畫有哪幾種,以及其原理?
答:主要有關節動畫、骨骼動畫、單一網格模型動畫(關鍵幀動畫)。 關節動畫:把角色分紅若干獨立部分,一個部分對應一個網格模型,部分的動畫鏈接成一個總體的動畫,角色比較靈活,Quake2中使用這種動畫;
骨骼動畫,普遍應用的動畫方式,集成了以上兩個方式的優勢,骨骼按角色特色組成必定的層次結構,有關節相連,可作相對運動,皮膚做爲單一網格蒙在骨骼以外,決定角色的外觀;
單一網格模型動畫由一個完整的網格模型構成,在動畫序列的關鍵幀裏記錄各個頂點的原位置及其改變量,而後插值運算實現動畫效果,角色動畫較真實。
三十七:請描述爲何Unity3d中會發生在組件上出現數據丟失的狀況
答: 通常是組件上綁定的物體對象被刪除了
三十八:alpha blend
工做原理
答:Alpha Blend
實現透明效果,不過只能針對某塊區域進行alpha操做,透明度可設。
三十九:寫出光照計算中的diffuse的計算公式
答:diffuse = Kd x colorLight x max(N*L,0);Kd 漫反射係數、colorLight 光的顏色、N 單位法線向量、L 由點指向光源的單位向量、其中N與L點乘,若是結果小於等於0,則漫反射爲0。
四十:LOD是什麼,優缺點是什麼?
答:LOD(Level of detail)
多層次細節,是最經常使用的遊戲優化技術。它按照模型的位置和重要程度決定物體渲染的資源分配,下降非重要物體的面數和細節度,從而得到高效率的渲染運算。
四十一:兩種陰影判斷的方法、工做原理。
本影和半影:
本影:景物表面上那些沒有被光源直接照射的區域(全黑的輪廓分明的區域)。
半影:景物表面上那些被某些特定光源直接照射但並不是被全部特定光源直接照射的區域(半明半暗區域)
工做原理:從光源處向物體的全部可見面投射光線,將這些面投影到場景中獲得投影面,再將這些投影面與場景中的其餘平面求交得出陰影多邊形,保存這些陰影多邊形信息,而後再按視點位置對場景進行相應處理獲得所要求的視圖(利用空間換時間,每次只需依據視點位置進行一次陰影計算便可,省去了一次消隱過程)
四十二:Vertex Shader是什麼,怎麼計算?
答:頂點着色器是一段執行在GPU上的程序,用來取代fixed pipeline中的transformation和lighting,Vertex Shader主要操做頂點。
Vertex Shader對輸入頂點完成了從local space到homogeneous space(齊次空間)的變換過程,homogeneous space即projection space的下一個space。在這其間共有world transformation, view transformation和projection transformation及lighting幾個過程。
四十三:MipMap是什麼,做用?
答:MipMapping:在三維計算機圖形的貼圖渲染中有經常使用的技術,爲加快渲染進度和減小圖像鋸齒,貼圖被處理成由一系列被預先計算和優化過的圖片組成的文件,這樣的貼圖被稱爲MipMap。
四十四:請描述Interface與抽象類之間的不一樣
答:抽象類表示該類中可能已經有一些方法的具體定義,但接口就是公公只能定義各個方法的界面 ,不能具體的實現代碼在成員方法中。
類是子類用來繼承的,當父類已經有實際功能的方法時該方法在子類中能夠沒必要實現,直接引用父類的方法,子類也能夠重寫該父類的方法。
實現接口的時候必需要實現接口中全部的方法,不能遺漏任何一個。
四十五:下列代碼在運行中會產生幾個臨時對象?
string a = new string("abc");
a = (a.ToUpper() + "123").Substring(0, 2);
答:其實在C#中第一行是會出錯的(Java中卻是可行)。應該這樣初始化:string b = new string(new char[]{'a','b','c'});
四十六:下列代碼在運行中會發生什麼問題?如何避免?
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); }
答:會產生運行時錯誤,由於foreach是隻讀的。不能一邊遍歷一邊修改。
四十七:.Net與Mono的關係?
答:mono是.net的一個開源跨平臺工具,就相似java虛擬機,java自己不是跨平臺語言,但運行在虛擬機上就可以實現了跨平臺。.net只能在windows下運行,mono能夠實現跨平臺編譯運行,能夠運行於linux,Unix,Mac OS等。
四十八:簡述Unity3D支持的做爲腳本的語言的名稱
答:Unity的腳本語言基於Mono的.Net平臺上運行,可使用.NET庫,這也爲XML、數據庫、正則表達式等問題提供了很好的解決方案。
Unity裏的腳本都會通過編譯,他們的運行速度也很快。這三種語言實際上的功能和運行速度是同樣的,區別主要體如今語言特性上。
JavaScript、 C#、Boo
四十九:Unity3D是否支持寫成多線程程序?若是支持的話須要注意什麼?
答:僅能從主線程中訪問Unity3D的組件,對象和Unity3D系統調用
支持:若是同時你要處理不少事情或者與Unity的對象互動小能夠用thread,不然使用coroutine。
注意:C#中有lock這個關鍵字,以確保只有一個線程能夠在特定時間內訪問特定的對象
五十:Unity3D的協程和C#線程之間的區別是什麼?
答:多線程程序同時運行多個線程 ,而在任一指定時刻只有一個協程在運行,而且這個正在運行的協同程序只在必要時才被掛起。
除主線程以外的線程沒法訪問Unity3D的對象、組件、方法。
Unity3d沒有多線程的概念,不過unity也給咱們提供了StartCoroutine
(協同程序)和LoadLevelAsync
(異步加載關卡)後臺加載場景的方法。 StartCoroutine
爲何叫協同程序呢,所謂協同,就是當你在StartCoroutine
的函數體裏處理一段代碼時,利用yield
語句等待執行結果,這期間不影響主程序的繼續執行,能夠協同工做。
五十一:U3D中用於記錄節點空間幾何信息的組件名稱,及其父類名稱
答:Transform
父類是 Component
五十二:向量的點乘、叉乘以及歸一化的意義?
答:
1)點乘描述了兩個向量的類似程度,結果越大兩向量越類似,還可表示投影
2)叉乘獲得的向量垂直於原來的兩個向量
3)標準化向量:用在只關係方向,不關心大小的時候
五十三:矩陣相乘的意義及注意點
答:用於表示線性變換:旋轉、縮放、投影、平移、仿射
注意矩陣的蠕變:偏差的積累
五十四:爲什麼你們都在移動設備上尋求U3D原生GUI的替代方案
答:不美觀,OnGUI很耗費時間,使用不方便
五十五:請簡述如何在不一樣分辨率下保持UI的一致性
答:NGUI很好的解決了這一點,屏幕分辨率的自適應性,原理就是計算出屏幕的寬高比跟原來的預設的屏幕分辨率求出一個對比值,而後修改攝像機的size。
五十六:爲何dynamic font在unicode環境下優於static font
答:Unicode是國際組織制定的能夠容納世界上全部文字和符號的字符編碼方案。
使用動態字體時,Unity將不會預先生成一個與全部字體的字符紋理。當須要支持亞洲語言或者較大的字體的時候,若使用正常紋理,則字體的紋理將很是大。
五十七:當一個細小的高速物體撞向另外一個較大的物體時,會出現什麼狀況?如何避免?
答:穿透(碰撞檢測失敗)
五十八:請簡述OnBecameVisible及OnBecameInvisible的發生時機,以及這一對回調函數的意義?
答:當物體是否可見切換之時。能夠用於只須要在物體可見時才進行的計算。
五十九:什麼叫動態合批?跟靜態合批有什麼區別?
答:若是動態物體共用着相同的材質,那麼Unity會自動對這些物體進行批處理。動態批處理操做是自動完成的,並不須要你進行額外的操做。
區別:動態批處理一切都是自動的,不須要作任何操做,並且物體是能夠移動的,可是限制不少。靜態批處理:自由度很高,限制不多,缺點可能會佔用更多的內存,並且通過靜態批處理後的全部物體都不能夠再移動了。
六十:簡述StringBuilder
和String
的區別?
答:String
是字符串常量。StringBuffer
是字符串變量 ,線程安全。StringBuilder
是字符串變量,線程不安全。String
類型是個不可變的對象,當每次對String進行改變時都須要生成一個新的String對象,而後將指針指向一個新的對象,若是在一個循環裏面,不斷的改變一個對象,就要不斷的生成新的對象,因此效率很低,建議在不斷更改String
對象的地方不要使用String
類型。StringBuilder
對象在作字符串鏈接操做時是在原來的字符串上進行修改,改善了性能。這一點咱們平時使用中也許都知道,鏈接操做頻繁的時候,使用StringBuilder
對象。
六十一:什麼是LightMap?
答:LightMap:就是指在三維軟件裏實現打好光,而後渲染把場景各表面的光照輸出到貼圖上,最後又經過引擎貼到場景上,這樣就使物體有了光照的感受。
六十二:Unity和cocos2d的區別
答:
六十三:C#和C++的區別?
答:
簡單的說:C# 與C++ 比較的話,最重要的特性就是C# 是一種徹底面向對象的語言,而C++ 不是,另外C# 是基於IL 中間語言和.NET Framework CLR 的,在可移植性,可維護性和強壯性都比C++ 有很大的改進。C# 的設計目標是用來開發快速穩定可擴展的應用程序,固然也能夠經過Interop
和Pinvoke 完成一些底層操做
六十四:Unity3D Shader分哪幾種,有什麼區別?
答:表面着色器的抽象層次比較高,它能夠輕鬆地以簡潔方式實現複雜着色。表面着色器可同時在前向渲染及延遲渲染模式下正常工做。
頂點片斷着色器能夠很是靈活地實現須要的效果,可是須要編寫更多的代碼,而且很難與Unity的渲染管線完美集成。
固定功能管線着色器能夠做爲前兩種着色器的備用選擇,當硬件沒法運行那些酷炫Shader的時,還能夠經過固定功能管線着色器來繪製出一些基本的內容。
六十五:
已知strcpy函數的原型是:char * strcpy(char * strDest,const char * strSrc);
1.不調用庫函數,實現strcpy函數。
2.解釋爲何要返回char *
char * strcpy(char * strDest,const char * strSrc) { if ((strDest==NULL)||(strSrc==NULL)) //[1] throw "Invalid argument(s)"; //[2] char * strDestCopy=strDest; //[3] while ((*strDest++=*strSrc++)!='\0'); //[4] return strDestCopy; }
錯誤的作法:
//不檢查指針的有效性,說明答題者不注重代碼的健壯性。
//檢查指針的有效性時使用((!strDest)||(!strSrc))或(!(strDest&&strSrc)),說明答題者對C語言中類型的隱式轉換沒有深入認識。在本例中char *轉換爲bool便是類型隱式轉換,這種功能雖然靈活,但更多的是致使出錯機率增大和維護成本升高。因此C++專門增長了bool、true、false三個關鍵字以提供更安全的條件表達式。 //檢查指針的有效性時使用((strDest==0)||(strSrc==0)),說明答題者不知道使用常量的好處。直接使用字面常量(如本例中的0)會減小程序的可維護性。0雖然簡單,但程序中可能出現不少處對指針的檢查,萬一出現筆誤,編譯器不能發現,生成的程序內含邏輯錯誤,很難排除。而使用NULL代替0,若是出現拼寫錯誤,編譯器就會檢查出來。
//return new string("Invalid argument(s)");,說明答題者根本不知道返回值的用途,而且他對內存泄漏也沒有警戒心。從函數中返回函數體內分配的內存是十分危險的作法,他把釋放內存的義務拋給不知情的調用者,絕大多數狀況下,調用者不會釋放內存,這致使內存泄漏。 //return 0;,說明答題者沒有掌握異常機制。調用者有可能忘記檢查返回值,調用者還可能沒法檢查返回值(見後面的鏈式表達式)。妄想讓返回值肩負返回正確值和異常值的雙重功能,其結果每每是兩種功能都失效。應該以拋出異常來代替返回值,這樣能夠減輕調用者的負擔、使錯誤不會被忽略、加強程序的可維護性。
//忘記保存原始的strDest值,說明答題者邏輯思惟不嚴密。
//循環寫成while (*strDest++=*strSrc++);,同[1](B)。 //循環寫成while (*strSrc!='\0') *strDest++=*strSrc++;,說明答題者對邊界條件的檢查不力。循環體結束後,strDest字符串的末尾沒有正確地加上'\0'。
/**
*返回strDest的原始值使函數可以支持鏈式表達式,增長了函數的「附加值」。一樣功能的函數,若是能合理地提升的可用性,天然就更加理想。
鏈式表達式的形式如:
`nt iLength=strlen(strcpy(strA,strB));
又如:
char * strA=strcpy(new char[10],strB); 返回strSrc的原始值是錯誤的。其一,源字符串確定是已知的,返回它沒有意義。其二,不能支持形如第二例的表達式。其三,爲了保護源字符串,形參用const限定strSrc所指的內容,把const char *做爲char *返回,類型不符,編譯報錯。 */
六十六:C#中四種訪問修飾符是哪些?各有什麼區別?
答:1.屬性修飾符 2.存取修飾符 3.類修飾符 4.成員修飾符。
屬性修飾符:Serializable
:按值將對象封送到遠程服務器。STATread
:是單線程套間的意思,是一種線程模型。MATAThread
:是多線程套間的意思,也是一種線程模型。
存取修飾符:public
:存取不受限制。private
:只有包含該成員的類能夠存取。internal
:只有當前命名空間能夠存取。protected
:只有包含該成員的類以及派生類能夠存取。
類修飾符:abstract
:抽象類。指示一個類只能做爲其它類的基類。sealed
:密封類。指示一個類不能被繼承。理所固然,密封類不能同時又是抽象類,由於抽象老是但願被繼承的。
成員修飾符:abstract
:指示該方法或屬性沒有實現。sealed
:密封方法。能夠防止在派生類中對該方法的override
(重載)。不是類的每一個成員方法均可以做爲密封方法密封方法,必須對基類的虛方法進行重載,提供具體的實現方法。因此,在方法的聲明中,sealed
修飾符老是和override
修飾符同時使用。delegate
:委託。用來定義一個函數指針。C#中的事件驅動是基於delegate + event的。const
:指定該成員的值只讀不容許修改。event
:聲明一個事件。extern
:指示方法在外部實現。override
:重寫。對由基類繼承成員的新實現。readonly
:指示一個域只能在聲明時以及相同類的內部被賦值。static
:指示一個成員屬於類型自己,而不是屬於特定的對象。即在定義後可不經實例化,就可以使用。virtual
:指示一個方法或存取器的實現能夠在繼承類中被覆蓋。new
:在派生類中隱藏指定的基類成員,從而實現重寫的功能。 若要隱藏繼承類的成員,請使用相同名稱在派生類中聲明該成員,並用 new 修飾符修飾它。
六十七:Heap與Stack有何區別?
答:1.heap是堆,stack是棧。2.stack的空間由操做系統自動分配和釋放,heap的空間是手動申請和釋放的,heap經常使用new關鍵字來分配。3.stack空間有限,heap的空間是很大的自由區。
六十八:值類型和引用類型有何區別?
答:
1.值類型的數據存儲在內存的棧中;引用類型的數據存儲在內存的堆中,而內存單元中只存放堆中對象的地址。
2.值類型存取速度快,引用類型存取速度慢。
3.值類型表示實際數據,引用類型表示指向存儲在內存堆中的數據的指針或引用
4.值類型繼承自System.ValueType,引用類型繼承自System.Object
5.棧的內存分配是自動釋放;而堆在.NET中會有GC來釋放
6.值類型的變量直接存放實際的數據,而引用類型的變量存放的則是數據的地址,即對象的引用。
7.值類型變量直接把變量的值保存在堆棧中,引用類型的變量把實際數據的地址保存在堆棧中。
六十九:結構體和類有何區別?
答:結構體是一種值類型,而類是引用類型。(值類型、引用類型是根據數據存儲的角度來分的)
就是值類型用於存儲數據的值,引用類型用於存儲對實際數據的引用。那麼結構體就是當成值來使用的,類則經過引用來對實際數據操做。
七十:請寫出求斐波那契數列任意一位的值得算法
static int Fn(int n) { if (n <= 0) { throw new ArgumentOutOfRangeException(); } if (n == 1||n==2) { return 1; } return checked(Fn(n - 1) + Fn(n - 2)); // when n>46 memory will overflow }
七十一:ref
參數和out
參數是什麼?有什麼區別?
答:ref
和out
參數的效果同樣,都是經過關鍵字找到定義在主函數裏面的變量的內存地址,並經過方法體內的語法改變它的大小。
不一樣點就是輸出參數必須對參數進行初始化。ref
參數是引用,out
參數爲輸出參數。
七十二:C#的委託是什麼?有何用處?
答:委託相似於一種安全的指針引用,在使用它時是當作類來看待而不是一個方法,至關於對一組方法的列表的引用。
用處:使用委託使程序員能夠將方法引用封裝在委託對象內。而後能夠將該委託對象傳遞給可調用所引用方法的代碼,而沒必要在編譯時知道將調用哪一個方法。與C或C++中的函數指針不一樣,委託是面向對象,並且是類型安全的。
七十三:協同程序的執行代碼是什麼?有何用處,有何缺點?
function Start() { // - After 0 seconds, prints "Starting 0.0" // - After 0 seconds, prints "Before WaitAndPrint Finishes 0.0" // - After 2 seconds, prints "WaitAndPrint 2.0" // 先打印"Starting 0.0"和"Before WaitAndPrint Finishes 0.0"兩句,2秒後打印"WaitAndPrint 2.0" print ("Starting " + Time.time ); // Start function WaitAndPrint as a coroutine. And continue execution while it is running // this is the same as WaintAndPrint(2.0) as the compiler does it for you automatically // 協同程序WaitAndPrint在Start函數內執行,能夠視同於它與Start函數同步執行. StartCoroutine(WaitAndPrint(2.0)); print ("Before WaitAndPrint Finishes " + Time.time ); } function WaitAndPrint (waitTime : float) { // suspend execution for waitTime seconds // 暫停執行waitTime秒 yield WaitForSeconds (waitTime); print ("WaitAndPrint "+ Time.time ); }
做用:一個協同程序在執行過程當中,能夠在任意位置使用yield語句。yield的返回值控制什麼時候恢復協同程序向下執行。協同程序在對象自有幀執行過程當中堪稱優秀。協同程序在性能上沒有更多的開銷。
缺點:協同程序並不是真線程,可能會發生堵塞。
七十四:什麼是里氏代換元則?
答:里氏替換原則(Liskov Substitution Principle LSP)面向對象設計的基本原則之一。 里氏替換原則中說,任何基類能夠出現的地方,子類必定能夠出現,做用方便擴展功能能
七十五:Mock和Stub有何區別?
Mock與Stub的區別:Mock:關注行爲驗證。細粒度的測試,即代碼的邏輯,多數狀況下用於單元測試。Stub:關注狀態驗證。粗粒度的測試,在某個依賴系統不存在或者還沒實現或者難以測試的狀況下使用,例如訪問文件系統,數據庫鏈接,遠程協議等。
七十六:概述序列化:
答:序列化簡單理解成把對象轉換爲容易傳輸的格式的過程。好比,能夠序列化一個對象,而後使用HTTP經過Internet在客戶端和服務器端之間傳輸該對象
七十七:堆和棧的區別?
答:棧一般保存着咱們代碼執行的步驟,如在代碼段1中 AddFive()方法,int pValue變量,int result變量等等。而堆上存放的則可能是對象,數據等。(譯者注:忽略編譯器優化)咱們能夠把棧想象成一個接着一個疊放在一塊兒的盒子。當咱們使用的時候,每次從最頂部取走一個盒子。棧也是如此,當一個方法(或類型)被調用完成的時候,就從棧頂取走(called a Frame,譯註:調用幀),接着下一個。堆則否則,像是一個倉庫,儲存着咱們使用的各類對象等信息,跟棧不一樣的是他們被調用完畢不會當即被清理掉。
七十八:概述c#中代理和事件?
答:代理就是用來定義指向方法的引用。
C#事件本質就是對消息的封裝,用做對象之間的通訊;發送方叫事件發送器,接收方叫事件接收器;
七十九:C#中的排序方式有哪些?
答:選擇排序,冒泡排序,快速排序,插入排序,希爾排序,歸併排序
八十:射線檢測碰撞物的原理是?
答:射線是3D世界中一個點向一個方向發射的一條無終點的線,在發射軌跡中與其餘物體發生碰撞時,它將中止發射 。
八十一:客戶端與服務器交互方式有幾種?
答: socket一般也稱做"套接字",實現服務器和客戶端之間的物理鏈接,並進行數據傳輸,主要有UDP和TCP兩個協議。Socket處於網絡協議的傳輸層。
http協議傳輸的主要有http協議 和基於http協議的Soap協議(web service),常見的方式是 http 的post 和get 請求,web 服務。
八十二:Unity和Android與iOS如何交互?
八十三:Unity中,照相機的Clipping Planes
的做用是什麼?調整Near
、Fare
兩個值時,應該注意什麼?
答:剪裁平面 。從相機到開始渲染和中止渲染之間的距離。
八十四:如何在Unity3D中查看場景的面試,頂點數和Draw Call
數?如何下降Draw Call
數?
答:在Game視圖右上角點擊Stats。下降Draw Call 的技術是Draw Call Batching
八十五:請問alpha test
在什麼時候使用?能達到什麼效果?Alpha Test
,中文就是透明度測試。簡而言之就是V&F shader
中最後fragment
函數輸出的該點顏色值(即上一講frag的輸出half4)的alpha值與固定值進行比較。Alpha Test
語句一般於Pass{}
中的起始位置。Alpha Test
產生的效果也很極端,要麼徹底透明,即看不到,要麼徹底不透明。
八十六:UNITY3d在移動設備上的一些優化資源的方法
答:
1.使用assetbundle,實現資源分離和共享,將內存控制到200m以內,同時也能夠實現資源的在線更新
2.頂點數對渲染不管是cpu仍是gpu都是壓力最大的貢獻者,下降頂點數到8萬如下,fps穩定到了30幀左右
3.只使用一盞動態光,不是用陰影,不使用光照探頭
粒子系統是cpu上的大頭
4.剪裁粒子系統
5.合併同時出現的粒子系統
6.本身實現輕量級的粒子系統
animator也是一個效率奇差的地方
7.把不須要跟骨骼動畫和動做過渡的地方所有使用animation,控制骨骼數量在30根如下
8.animator出視野不更新
9.刪除無心義的animator
10.animator的初始化很耗時(粒子上能不能儘可能不用animator)
11.除主角外都不要跟骨骼運動apply root motion
12.絕對禁止掉那些不帶剛體帶包圍盒的物體(static collider )運動
NUGI的代碼效率不好,基本上runtime的時候對cpu的貢獻和render不相上下
13每幀遞歸的計算finalalpha改成只有初始化和變更時計算
14去掉法線計算
15不要每幀計算viewsize 和windowsize
16filldrawcall時構建頂點緩存使用array.copy
17.代碼剪裁:使用strip level ,使用.net2.0 subset
18.儘可能減小smooth group
19.給美術定一個嚴格的通過科學驗證的美術標準,並在U3D裏面配以相應的檢查工具
八十七:四元數有什麼做用?
答:對旋轉角度進行計算時用到四元數
八十八:將Camera組件的ClearFlags選項選成Depth only是什麼意思?有何用處?
答:僅深度,該模式用於對象不被裁剪。
八十九:如何讓已經存在的GameObject在LoadLevel後不被卸載掉?
void Awake() { DontDestroyOnLoad(transform.gameObject); }
九十:在編輯場景時將GameObject設置爲Static有何做用?
答:設置遊戲對象爲Static將會剔除(或禁用)網格對象當這些部分被靜態物體擋住而不可見時。所以,在你的場景中的全部不會動的物體都應該標記爲Static。
九十一:有A和B兩組物體,有什麼辦法可以保證A組物體永遠比B組物體先渲染?
答:把A組物體的渲染對列大於B物體的渲染隊列
九十二:將圖片的TextureType
選項分別選爲Texture
和Sprite
有什麼區別
答:Sprite
做爲UI精靈使用,Texture
做用模型貼圖使用。
九十三:問一個Terrain
,分別貼3張,4張,5張地表貼圖,渲染速度有什麼區別?爲何?
答:沒有區別,由於無論幾張貼圖只渲染一次。
九十四:什麼是DrawCall?DrawCall高了又什麼影響?如何下降DrawCall?
答:Unity中,每次引擎準備數據並通知GPU的過程稱爲一次Draw Call。DrawCall越高對顯卡的消耗就越大。下降DrawCall的方法:
九十五:實時點光源的優缺點是什麼?
答:能夠有cookies – 帶有 alpha通道的立方圖(Cubemap )紋理。點光源是最耗費資源的。
九十六:Unity的Shader中,Blend SrcAlpha OneMinusSrcAlpha這句話是什麼意思?
答:做用就是Alpha混合。公式:最終顏色 = 源顏色 源透明值 + 目標顏色(1 - 源透明值)
九十七:簡述水面倒影的渲染原理
答: 原理就是對水面的貼圖紋理進行擾動,以產生波光玲玲的效果。用shader能夠經過GPU在像素級別做擾動,效果細膩,須要的頂點少,速度快
九十八:簡述NGUI中Grid和Table的做用?
答:對Grid和Table下的子物體進行排序和定位
九十九:請簡述NGUI中Panel和Anchor的做用
答:
一百:能用foreach遍歷訪問的對象須要實現__接口或聲明_方法的類型答:IEnumerable;GetEnumerator