[Unity]技術(shù)學(xué)習(xí)路線圖(長(zhǎng)期更新)
Unity技術(shù)面試題
一:什么是協(xié)同程序矾瑰?
答:在主線程運(yùn)行時(shí)同時(shí)開啟另一段邏輯處理练对,來(lái)協(xié)助當(dāng)前程序的執(zhí)行受扳。換句話說(shuō)琐簇,開啟協(xié)程就是開啟一個(gè)可以與程序并行的邏輯械念⊥分欤可以用來(lái)控制運(yùn)動(dòng)、序列以及對(duì)象的行為龄减。
二:Unity3d中的碰撞器和觸發(fā)器的區(qū)別项钮?
答:碰撞器是觸發(fā)器的載體,而觸發(fā)器只是碰撞器身上的一個(gè)屬性希停。
當(dāng)Is Trigger=false
時(shí)烁巫,碰撞器根據(jù)物理引擎引發(fā)碰撞,產(chǎn)生碰撞的效果脖苏,可以調(diào)用OnCollisionEnter/Stay/Exit
函數(shù)程拭;
當(dāng)Is Trigger=true
時(shí),碰撞器被物理引擎所忽略棍潘,沒有碰撞效果恃鞋,可以調(diào)用OnTriggerEnter/Stay/Exit
函數(shù)。
如果既要檢測(cè)到物體的接觸又不想讓碰撞檢測(cè)影響物體移動(dòng)或要檢測(cè)一個(gè)物件是否經(jīng)過(guò)空間中的某個(gè)區(qū)域這時(shí)就可以用到觸發(fā)器
三:物體發(fā)生碰撞的必要條件
答:兩個(gè)物體都必須帶有碰撞器Collider
亦歉,其中一個(gè)物體還必須帶有Rigidbody
剛體恤浪。
四:請(qǐng)簡(jiǎn)述ArrayList
和List<Int>
的主要區(qū)別
答:
ArrayList
存在不安全類型
- ArrayList會(huì)把所有插入其中的數(shù)據(jù)都當(dāng)做Object來(lái)處理
- 裝箱拆箱的操作
List
是接口,ArrayList
是一個(gè)實(shí)現(xiàn)了該接口的類肴楷,可以被實(shí)例化
五:請(qǐng)簡(jiǎn)述GC(垃圾回收)產(chǎn)生的原因水由,并描述如何避免?
答:GC回收堆上的內(nèi)存
避免:
1)減少new產(chǎn)生對(duì)象的次數(shù)
2)使用公用的對(duì)象(靜態(tài)成員)
3)將String
換為StringBuilder
六:反射的實(shí)現(xiàn)原理赛蔫?
答:審查元數(shù)據(jù)并收集關(guān)于它的類型信息的能力砂客。
實(shí)現(xiàn)步驟:
- 導(dǎo)入
using System.Reflection
; -
Assembly.Load("程序集");
//加載程序集,返回類型是一個(gè)Assembly - 得到程序集中所有類的名稱
foreach (Type type in assembly.GetTypes())
{
string t = type.Name;
}
Type type = assembly.GetType("程序集.類名");//獲取當(dāng)前類的類型
Activator.CreateInstance(type); //創(chuàng)建此類型實(shí)例
MethodInfo mInfo = type.GetMethod("方法名");//獲取當(dāng)前方法
mInfo.Invoke(null,方法參數(shù));
七:簡(jiǎn)述四元數(shù)Quaternion
的作用,四元數(shù)對(duì)歐拉角的優(yōu)點(diǎn)呵恢?
答:四元數(shù)用于表示旋轉(zhuǎn)
相對(duì)歐拉角的優(yōu)點(diǎn):
- 能進(jìn)行增量旋轉(zhuǎn)
- 避免萬(wàn)向鎖
- 給定方位的表達(dá)方式有兩種鞠值,互為負(fù)(歐拉角有無(wú)數(shù)種表達(dá)方式)
八:如何安全的在不同工程間安全地遷移asset數(shù)據(jù)?三種方法
答:
1.將Assets
和Library
一起遷移
2.導(dǎo)出包package
3.用unity自帶的assets Server功能
九:OnEnable
渗钉、Awake
彤恶、Start
運(yùn)行時(shí)的發(fā)生順序?哪些可能在同一個(gè)對(duì)象周期中反復(fù)的發(fā)生?
答:Awake
–>OnEnable
->Start
OnEnable
在同一周期中可以反復(fù)地發(fā)生!
十:MeshRender
中material
和sharedmaterial
的區(qū)別声离?
答:
修改sharedMaterial
將改變所有物體使用這個(gè)材質(zhì)的外觀芒炼,并且也改變儲(chǔ)存在工程里的材質(zhì)設(shè)置。
不推薦修改由sharedMaterial返回的材質(zhì)术徊。如果你想修改渲染器的材質(zhì)本刽,使用material替代。
十一:請(qǐng)簡(jiǎn)述ArrayList和List之間的主要區(qū)別弧关。
十二:TCP/IP協(xié)議棧各個(gè)層次及分別的功能
答:網(wǎng)絡(luò)接口層:這是協(xié)議棧的最低層盅安,對(duì)應(yīng)OSI的物理層和數(shù)據(jù)鏈路層唤锉,主要完成數(shù)據(jù)幀的實(shí)際發(fā)送和接收世囊。
網(wǎng)絡(luò)層:處理分組在網(wǎng)絡(luò)中的活動(dòng),例如路由選擇和轉(zhuǎn)發(fā)等窿祥,這一層主要包括IP協(xié)議株憾、ARP、ICMP協(xié)議等晒衩。
傳輸層:主要功能是提供應(yīng)用程序之間的通信,這一層主要是TCP/UDP協(xié)議。
應(yīng)用層:用來(lái)處理特定的應(yīng)用倔韭,針對(duì)不同的應(yīng)用提供了不同的協(xié)議航棱,例如進(jìn)行文件傳輸時(shí)用到的FTP協(xié)議,發(fā)送email用到的SMTP等靠胜。
十三題:Unity提供了幾種光源掉瞳,分別是什么
答:
四種。
平行光:Directional Light
點(diǎn)光源:Point Light
聚光燈:Spot Light
區(qū)域光源:Area Light
十四:簡(jiǎn)述一下對(duì)象池浪漠,你覺得在FPS里哪些東西適合使用對(duì)象池陕习?
對(duì)象池就存放需要被反復(fù)調(diào)用資源的一個(gè)空間,比如游戲中要常被大量復(fù)制的對(duì)象址愿,子彈该镣,敵人,以及任何重復(fù)出現(xiàn)的對(duì)象响谓。
十五:CharacterController
和Rigidbody
的區(qū)別损合?
Rigidbody
具有完全真實(shí)物理的特性,而CharacterController
可以說(shuō)是受限的的Rigidbody
娘纷,具有一定的物理效果但不是完全真實(shí)的嫁审。
十六:移動(dòng)相機(jī)動(dòng)作在哪個(gè)函數(shù)里,為什么在這個(gè)函數(shù)里失驶?
LateUpdate
土居,是在所有的Update
結(jié)束后才調(diào)用,比較適合用于命令腳本的執(zhí)行。官網(wǎng)上例子是攝像機(jī)的跟隨擦耀,都是所有的Update
操作完才進(jìn)行攝像機(jī)的跟進(jìn)棉圈,不然就有可能出現(xiàn)攝像機(jī)已經(jīng)推進(jìn)了,但是視角里還未有角色的空幀出現(xiàn)眷蜓。
十七:簡(jiǎn)述prefab
的用處
在游戲運(yùn)行時(shí)實(shí)例化分瘾,prefab
相當(dāng)于一個(gè)模板,對(duì)你已經(jīng)有的素材吁系、腳本德召、參數(shù)做一個(gè)默認(rèn)的配置,以便于以后的修改汽纤,同事prefab
打包的內(nèi)容簡(jiǎn)化了導(dǎo)出的操作上岗,便于團(tuán)隊(duì)的交流。
十八:請(qǐng)簡(jiǎn)述sealed
關(guān)鍵字用在類聲明時(shí)與函數(shù)聲明時(shí)的作用蕴坪。
答:類聲明時(shí)可防止其他類繼承此類肴掷,在方法中聲明則可防止派生類重寫此方法。
十九:請(qǐng)簡(jiǎn)述private
背传,public
呆瞻,protected
,internal
的區(qū)別径玖。
public
:對(duì)任何類和成員都公開痴脾,無(wú)限制訪問(wèn)
private
:僅對(duì)該類公開
protected
:對(duì)該類和其派生類公開
internal
:只能在包含該類的程序集中訪問(wèn)該類
protected internal
:protected + internal
二十:簡(jiǎn)述SkinnedMesh的實(shí)現(xiàn)原理
二十一:GPU的工作原理
簡(jiǎn)而言之,GPU的圖形(處理)流水線完成如下的工作:(并不一定是按照如下順序)
頂點(diǎn)處理:這階段GPU讀取描述3D圖形外觀的頂點(diǎn)數(shù)據(jù)并根據(jù)頂點(diǎn)數(shù)據(jù)確定3D圖形的形狀及位置關(guān)系梳星,建立起3D圖形的骨架赞赖。在支持DX8和DX9規(guī)格的GPU中,這些工作由硬件實(shí)現(xiàn)的Vertex Shader(定點(diǎn)著色器)完成丰泊。
光柵化計(jì)算:顯示器實(shí)際顯示的圖像是由像素組成的薯定,我們需要將上面生成的圖形上的點(diǎn)和線通過(guò)一定的算法轉(zhuǎn)換到相應(yīng)的像素點(diǎn)。把一個(gè)矢量圖形轉(zhuǎn)換為一系列像素點(diǎn)的過(guò)程就稱為光柵化瞳购。例如话侄,一條數(shù)學(xué)表示的斜線段,最終被轉(zhuǎn)化成階梯狀的連續(xù)像素點(diǎn)学赛。
紋理帖圖:頂點(diǎn)單元生成的多邊形只構(gòu)成了3D物體的輪廓年堆,而紋理映射(texture mapping)工作完成對(duì)多變形表面的帖圖,通俗的說(shuō)盏浇,就是將多邊形的表面貼上相應(yīng)的圖片变丧,從而生成“真實(shí)”的圖形。TMU(Texture mapping unit)即是用來(lái)完成此項(xiàng)工作绢掰。
像素處理:這階段(在對(duì)每個(gè)像素進(jìn)行光柵化處理期間)GPU完成對(duì)像素的計(jì)算和處理痒蓬,從而確定每個(gè)像素的最終屬性童擎。在支持DX8和DX9規(guī)格的GPU中,這些工作由硬件實(shí)現(xiàn)的Pixel Shader(像素著色器)完成攻晒。
最終輸出:由ROP(光柵化引擎)最終完成像素的輸出顾复,1幀渲染完畢后,被送到顯存幀緩沖區(qū)鲁捏。
總結(jié):GPU的工作通俗的來(lái)說(shuō)就是完成3D圖形的生成芯砸,將圖形映射到相應(yīng)的像素點(diǎn)上,對(duì)每個(gè)像素進(jìn)行計(jì)算確定最終顏色并完成輸出给梅。
二十二:什么是渲染管道假丧?
答:是指在顯示器上為了顯示出圖像而經(jīng)過(guò)的一系列必要操作。 渲染管道中的很多步驟动羽,都要將幾何物體從一個(gè)坐標(biāo)系中變換到另一個(gè)坐標(biāo)系中去包帚。
主要步驟有:
本地坐標(biāo)->視圖坐標(biāo)->背面裁剪->光照->裁剪->投影->視圖變換->光柵化。
二十三:如何優(yōu)化內(nèi)存曹质?
答:有很多種方式婴噩,例如
1.壓縮自帶類庫(kù);
2.將暫時(shí)不用的以后還需要使用的物體隱藏起來(lái)而不是直接Destroy掉羽德;
3.釋放AssetBundle占用的資源;
4.降低模型的片面數(shù)迅办,降低模型的骨骼數(shù)量宅静,降低貼圖的大小站欺;
5.使用光照貼圖姨夹,使用多層次細(xì)節(jié)(LOD),使用著色器(Shader)矾策,使用預(yù)設(shè)(Prefab)磷账。
二十四:動(dòng)態(tài)加載資源的方式?
1.Resources.Load();
2.AssetBundle
Unity5.1
版本后可以選擇使用Git: https://github.com/applexiaohao/LOAssetFramework.git
二十五:你用過(guò)哪些插件?
二十六: 使用Unity3d實(shí)現(xiàn)2d游戲贾虽,有幾種方式逃糟?
答:
1.使用本身的GUI
、UGUI
2.把攝像機(jī)的Projection(投影)
值調(diào)為Orthographic(正交投影)
蓬豁,不考慮z軸绰咽;
3.使用2d插件,如:2DToolKit
地粪、NGUI
二十七:在物體發(fā)生碰撞的整個(gè)過(guò)程中取募,有幾個(gè)階段,分別列出對(duì)應(yīng)的函數(shù) 三個(gè)階段
答:
OnCollisionEnter
OnCollisionStay
OnCollisionExit
二十八:Unity3d的物理引擎中蟆技,有幾種施加力的方式玩敏,分別描述出來(lái)
答:
rigidbody.AddForce
rigidbody.AddForceAtPosition
二十九:什么叫做鏈條關(guān)節(jié)斗忌?
答:Hinge Joint
,可以模擬兩個(gè)物體間用一根鏈條連接在一起的情況旺聚,能保持兩個(gè)物體在一個(gè)固定距離內(nèi)部相互移動(dòng)而不產(chǎn)生作用力飞蹂,但是達(dá)到固定距離后就會(huì)產(chǎn)生拉力。
三十:物體自身旋轉(zhuǎn)使用的函數(shù)翻屈?
答: Transform.Rotate()
三十一:Unity3d提供了一個(gè)用于保存和讀取數(shù)據(jù)的類(PlayerPrefs)陈哑,請(qǐng)列出保存和讀取整形數(shù)據(jù)的函數(shù)
答:
PlayerPrefs.SetInt()
PlayerPrefs.GetInt()
三十二:Unity3d腳本從喚醒到銷毀有著一套比較完整的生命周期,請(qǐng)列出系統(tǒng)自帶的幾個(gè)重要的方法伸眶。
答:Awake——>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>Reset——>OnDisable——>OnDestroy
三十三:物理更新一般放在哪個(gè)系統(tǒng)函數(shù)里惊窖?
答:
FixedUpdate
,每固定幀繪制時(shí)執(zhí)行一次厘贼,和Update不同的是FixedUpdate是渲染幀執(zhí)行界酒,如果你的渲染效率低下的時(shí)候FixedUpdate調(diào)用次數(shù)就會(huì)跟著下降。
- FixedUpdate比較適用于物理引擎的計(jì)算嘴秸,因?yàn)槭歉繋秩居嘘P(guān)毁欣。
- Update就比較適合做控制。
三十四:在場(chǎng)景中放置多個(gè)Camera
并同時(shí)處于活動(dòng)狀態(tài)會(huì)發(fā)生什么岳掐?
答:游戲界面可以看到很多攝像機(jī)的混合凭疮。
三十五:如何銷毀一個(gè)UnityEngine.Object及其子類?
答: 使用Destroy()
方法;
三十六:請(qǐng)描述游戲動(dòng)畫有哪幾種串述,以及其原理执解?
答:主要有關(guān)節(jié)動(dòng)畫、骨骼動(dòng)畫纲酗、單一網(wǎng)格模型動(dòng)畫(關(guān)鍵幀動(dòng)畫)衰腌。 關(guān)節(jié)動(dòng)畫:把角色分成若干獨(dú)立部分,一個(gè)部分對(duì)應(yīng)一個(gè)網(wǎng)格模型觅赊,部分的動(dòng)畫連接成一個(gè)整體的動(dòng)畫右蕊,角色比較靈活,Quake2中使用這種動(dòng)畫吮螺;
骨骼動(dòng)畫饶囚,廣泛應(yīng)用的動(dòng)畫方式,集成了以上兩個(gè)方式的優(yōu)點(diǎn)规脸,骨骼按角色特點(diǎn)組成一定的層次結(jié)構(gòu)坯约,有關(guān)節(jié)相連,可做相對(duì)運(yùn)動(dòng)莫鸭,皮膚作為單一網(wǎng)格蒙在骨骼之外闹丐,決定角色的外觀;
單一網(wǎng)格模型動(dòng)畫由一個(gè)完整的網(wǎng)格模型構(gòu)成被因,在動(dòng)畫序列的關(guān)鍵幀里記錄各個(gè)頂點(diǎn)的原位置及其改變量卿拴,然后插值運(yùn)算實(shí)現(xiàn)動(dòng)畫效果衫仑,角色動(dòng)畫較真實(shí)。
三十七:請(qǐng)描述為什么Unity3d中會(huì)發(fā)生在組件上出現(xiàn)數(shù)據(jù)丟失的情況
答: 一般是組件上綁定的物體對(duì)象被刪除了
三十八:alpha blend
工作原理
答:Alpha Blend
實(shí)現(xiàn)透明效果堕花,不過(guò)只能針對(duì)某塊區(qū)域進(jìn)行alpha操作文狱,透明度可設(shè)。
三十九:寫出光照計(jì)算中的diffuse的計(jì)算公式
答:diffuse = Kd x colorLight x max(N*L,0)缘挽;Kd 漫反射系數(shù)瞄崇、colorLight 光的顏色、N 單位法線向量壕曼、L 由點(diǎn)指向光源的單位向量苏研、其中N與L點(diǎn)乘,如果結(jié)果小于等于0腮郊,則漫反射為0摹蘑。
四十:LOD是什么,優(yōu)缺點(diǎn)是什么轧飞?
答:LOD(Level of detail)
多層次細(xì)節(jié)衅鹿,是最常用的游戲優(yōu)化技術(shù)。它按照模型的位置和重要程度決定物體渲染的資源分配过咬,降低非重要物體的面數(shù)和細(xì)節(jié)度大渤,從而獲得高效率的渲染運(yùn)算。
四十一:兩種陰影判斷的方法援奢、工作原理兼犯。
本影和半影:
本影:景物表面上那些沒有被光源直接照射的區(qū)域(全黑的輪廓分明的區(qū)域)。
半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的區(qū)域(半明半暗區(qū)域)
工作原理:從光源處向物體的所有可見面投射光線集漾,將這些面投影到場(chǎng)景中得到投影面,再將這些投影面與場(chǎng)景中的其他平面求交得出陰影多邊形砸脊,保存這些陰影多邊形信息具篇,然后再按視點(diǎn)位置對(duì)場(chǎng)景進(jìn)行相應(yīng)處理得到所要求的視圖(利用空間換時(shí)間,每次只需依據(jù)視點(diǎn)位置進(jìn)行一次陰影計(jì)算即可凌埂,省去了一次消隱過(guò)程)
四十二:Vertex Shader是什么驱显,怎么計(jì)算?
答:頂點(diǎn)著色器是一段執(zhí)行在GPU上的程序瞳抓,用來(lái)取代fixed pipeline中的transformation和lighting埃疫,Vertex Shader主要操作頂點(diǎn)。
Vertex Shader對(duì)輸入頂點(diǎn)完成了從local space到homogeneous space(齊次空間)的變換過(guò)程孩哑,homogeneous space即projection space的下一個(gè)space栓霜。在這其間共有world transformation, view transformation和projection transformation及l(fā)ighting幾個(gè)過(guò)程。
四十三:MipMap是什么横蜒,作用胳蛮?
答:MipMapping:在三維計(jì)算機(jī)圖形的貼圖渲染中有常用的技術(shù)销凑,為加快渲染進(jìn)度和減少圖像鋸齒,貼圖被處理成由一系列被預(yù)先計(jì)算和優(yōu)化過(guò)的圖片組成的文件仅炊,這樣的貼圖被稱為MipMap斗幼。
四十四:請(qǐng)描述Interface與抽象類之間的不同
答:抽象類表示該類中可能已經(jīng)有一些方法的具體定義,但接口就是公公只能定義各個(gè)方法的界面 抚垄,不能具體的實(shí)現(xiàn)代碼在成員方法中蜕窿。
類是子類用來(lái)繼承的,當(dāng)父類已經(jīng)有實(shí)際功能的方法時(shí)該方法在子類中可以不必實(shí)現(xiàn)呆馁,直接引用父類的方法桐经,子類也可以重寫該父類的方法。
實(shí)現(xiàn)接口的時(shí)候必須要實(shí)現(xiàn)接口中所有的方法智哀,不能遺漏任何一個(gè)次询。
四十五:下列代碼在運(yùn)行中會(huì)產(chǎn)生幾個(gè)臨時(shí)對(duì)象?
string a = new string("abc");
a = (a.ToUpper() + "123").Substring(0, 2);
答:其實(shí)在C#中第一行是會(huì)出錯(cuò)的(Java中倒是可行)瓷叫。應(yīng)該這樣初始化:string b = new string(new char[]{'a','b','c'});
四十六:下列代碼在運(yùn)行中會(huì)發(fā)生什么問(wèn)題屯吊?如何避免?
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);
}
答:會(huì)產(chǎn)生運(yùn)行時(shí)錯(cuò)誤摹菠,因?yàn)閒oreach是只讀的盒卸。不能一邊遍歷一邊修改。
四十七:.Net與Mono的關(guān)系次氨?
答:mono是.net的一個(gè)開源跨平臺(tái)工具蔽介,就類似java虛擬機(jī),java本身不是跨平臺(tái)語(yǔ)言煮寡,但運(yùn)行在虛擬機(jī)上就能夠?qū)崿F(xiàn)了跨平臺(tái)虹蓄。.net只能在windows下運(yùn)行,mono可以實(shí)現(xiàn)跨平臺(tái)編譯運(yùn)行幸撕,可以運(yùn)行于linux薇组,Unix,Mac OS等坐儿。
四十八:簡(jiǎn)述Unity3D支持的作為腳本的語(yǔ)言的名稱
答:Unity的腳本語(yǔ)言基于Mono的.Net平臺(tái)上運(yùn)行律胀,可以使用.NET庫(kù),這也為XML貌矿、數(shù)據(jù)庫(kù)炭菌、正則表達(dá)式等問(wèn)題提供了很好的解決方案。
Unity里的腳本都會(huì)經(jīng)過(guò)編譯逛漫,他們的運(yùn)行速度也很快黑低。這三種語(yǔ)言實(shí)際上的功能和運(yùn)行速度是一樣的,區(qū)別主要體現(xiàn)在語(yǔ)言特性上尽楔。
JavaScript投储、 C#第练、Boo
四十九:Unity3D是否支持寫成多線程程序?如果支持的話需要注意什么玛荞?
答:僅能從主線程中訪問(wèn)Unity3D的組件娇掏,對(duì)象和Unity3D系統(tǒng)調(diào)用
支持:如果同時(shí)你要處理很多事情或者與Unity的對(duì)象互動(dòng)小可以用thread,否則使用coroutine。
注意:C#中有l(wèi)ock這個(gè)關(guān)鍵字,以確保只有一個(gè)線程可以在特定時(shí)間內(nèi)訪問(wèn)特定的對(duì)象
五十:Unity3D的協(xié)程和C#線程之間的區(qū)別是什么勋眯?
答:多線程程序同時(shí)運(yùn)行多個(gè)線程 婴梧,而在任一指定時(shí)刻只有一個(gè)協(xié)程在運(yùn)行,并且這個(gè)正在運(yùn)行的協(xié)同程序只在必要時(shí)才被掛起客蹋。
除主線程之外的線程無(wú)法訪問(wèn)Unity3D的對(duì)象塞蹭、組件、方法讶坯。
Unity3d沒有多線程的概念番电,不過(guò)unity也給我們提供了StartCoroutine
(協(xié)同程序)和LoadLevelAsync
(異步加載關(guān)卡)后臺(tái)加載場(chǎng)景的方法。 StartCoroutine
為什么叫協(xié)同程序呢辆琅,所謂協(xié)同漱办,就是當(dāng)你在StartCoroutine
的函數(shù)體里處理一段代碼時(shí),利用yield
語(yǔ)句等待執(zhí)行結(jié)果婉烟,這期間不影響主程序的繼續(xù)執(zhí)行娩井,可以協(xié)同工作。
五十一:U3D中用于記錄節(jié)點(diǎn)空間幾何信息的組件名稱似袁,及其父類名稱
答:Transform
父類是 Component
五十二:向量的點(diǎn)乘洞辣、叉乘以及歸一化的意義?
答:
1)點(diǎn)乘描述了兩個(gè)向量的相似程度昙衅,結(jié)果越大兩向量越相似扬霜,還可表示投影
2)叉乘得到的向量垂直于原來(lái)的兩個(gè)向量
3)標(biāo)準(zhǔn)化向量:用在只關(guān)系方向,不關(guān)心大小的時(shí)候
五十三:矩陣相乘的意義及注意點(diǎn)
答:用于表示線性變換:旋轉(zhuǎn)而涉、縮放畜挥、投影、平移婴谱、仿射
注意矩陣的蠕變:誤差的積累
五十四:為何大家都在移動(dòng)設(shè)備上尋求U3D原生GUI的替代方案
答:不美觀,OnGUI很耗費(fèi)時(shí)間躯泰,使用不方便
五十五:請(qǐng)簡(jiǎn)述如何在不同分辨率下保持UI的一致性
答:NGUI很好的解決了這一點(diǎn)谭羔,屏幕分辨率的自適應(yīng)性,原理就是計(jì)算出屏幕的寬高比跟原來(lái)的預(yù)設(shè)的屏幕分辨率求出一個(gè)對(duì)比值麦向,然后修改攝像機(jī)的size瘟裸。
五十六:為什么dynamic font在unicode環(huán)境下優(yōu)于static font
答:Unicode是國(guó)際組織制定的可以容納世界上所有文字和符號(hào)的字符編碼方案。
使用動(dòng)態(tài)字體時(shí)诵竭,Unity將不會(huì)預(yù)先生成一個(gè)與所有字體的字符紋理话告。當(dāng)需要支持亞洲語(yǔ)言或者較大的字體的時(shí)候兼搏,若使用正常紋理,則字體的紋理將非常大沙郭。
五十七:當(dāng)一個(gè)細(xì)小的高速物體撞向另一個(gè)較大的物體時(shí)佛呻,會(huì)出現(xiàn)什么情況?如何避免病线?
答:穿透(碰撞檢測(cè)失斚胖)
五十八:請(qǐng)簡(jiǎn)述OnBecameVisible及OnBecameInvisible的發(fā)生時(shí)機(jī),以及這一對(duì)回調(diào)函數(shù)的意義送挑?
答:當(dāng)物體是否可見切換之時(shí)绑莺。可以用于只需要在物體可見時(shí)才進(jìn)行的計(jì)算惕耕。
五十九:什么叫動(dòng)態(tài)合批纺裁?跟靜態(tài)合批有什么區(qū)別?
答:如果動(dòng)態(tài)物體共用著相同的材質(zhì)司澎,那么Unity會(huì)自動(dòng)對(duì)這些物體進(jìn)行批處理欺缘。動(dòng)態(tài)批處理操作是自動(dòng)完成的,并不需要你進(jìn)行額外的操作惭缰。
區(qū)別:動(dòng)態(tài)批處理一切都是自動(dòng)的浪南,不需要做任何操作,而且物體是可以移動(dòng)的漱受,但是限制很多络凿。靜態(tài)批處理:自由度很高,限制很少昂羡,缺點(diǎn)可能會(huì)占用更多的內(nèi)存絮记,而且經(jīng)過(guò)靜態(tài)批處理后的所有物體都不可以再移動(dòng)了。
六十:簡(jiǎn)述StringBuilder
和String
的區(qū)別虐先?
答:
String
是字符串常量怨愤。
StringBuffer
是字符串變量 ,線程安全蛹批。
StringBuilder
是字符串變量撰洗,線程不安全。
String
類型是個(gè)不可變的對(duì)象腐芍,當(dāng)每次對(duì)String進(jìn)行改變時(shí)都需要生成一個(gè)新的String對(duì)象差导,然后將指針指向一個(gè)新的對(duì)象,如果在一個(gè)循環(huán)里面猪勇,不斷的改變一個(gè)對(duì)象设褐,就要不斷的生成新的對(duì)象,所以效率很低,建議在不斷更改String
對(duì)象的地方不要使用String
類型助析。
StringBuilder
對(duì)象在做字符串連接操作時(shí)是在原來(lái)的字符串上進(jìn)行修改犀被,改善了性能。這一點(diǎn)我們平時(shí)使用中也許都知道外冀,連接操作頻繁的時(shí)候寡键,使用StringBuilder
對(duì)象。
六十一:什么是LightMap锥惋?
答:LightMap:就是指在三維軟件里實(shí)現(xiàn)打好光昌腰,然后渲染把場(chǎng)景各表面的光照輸出到貼圖上,最后又通過(guò)引擎貼到場(chǎng)景上膀跌,這樣就使物體有了光照的感覺遭商。
六十二:Unity和cocos2d的區(qū)別
答:
- Unity3D支持C#、javascript等捅伤,cocos2d-x 支持c++劫流、Html5、Lua等丛忆。
- cocos2d 開源 并且免費(fèi)
- Unity3D支持iOS祠汇、Android、Flash熄诡、Windows可很、Mac、Wii等平臺(tái)的游戲開發(fā)凰浮,cocos2d-x支持iOS我抠、Android、WP等袜茧。
六十三:C#和C++的區(qū)別菜拓?
答:
簡(jiǎn)單的說(shuō):C# 與C++ 比較的話,最重要的特性就是C# 是一種完全面向?qū)ο蟮恼Z(yǔ)言笛厦,而C++ 不是纳鼎,另外C# 是基于IL 中間語(yǔ)言和.NET Framework CLR 的,在可移植性裳凸,可維護(hù)性和強(qiáng)壯性都比C++ 有很大的改進(jìn)贱鄙。C# 的設(shè)計(jì)目標(biāo)是用來(lái)開發(fā)快速穩(wěn)定可擴(kuò)展的應(yīng)用程序,當(dāng)然也可以通過(guò)Interop
和Pinvoke 完成一些底層操作
六十四:Unity3D Shader分哪幾種姨谷,有什么區(qū)別贰逾?
答:表面著色器的抽象層次比較高,它可以輕松地以簡(jiǎn)潔方式實(shí)現(xiàn)復(fù)雜著色菠秒。表面著色器可同時(shí)在前向渲染及延遲渲染模式下正常工作。
頂點(diǎn)片段著色器可以非常靈活地實(shí)現(xiàn)需要的效果,但是需要編寫更多的代碼践叠,并且很難與Unity的渲染管線完美集成言缤。
固定功能管線著色器可以作為前兩種著色器的備用選擇,當(dāng)硬件無(wú)法運(yùn)行那些酷炫Shader的時(shí)禁灼,還可以通過(guò)固定功能管線著色器來(lái)繪制出一些基本的內(nèi)容管挟。
六十五:
已知strcpy函數(shù)的原型是:
char * strcpy(char * strDest,const char * strSrc);
1.不調(diào)用庫(kù)函數(shù),實(shí)現(xiàn)strcpy函數(shù)弄捕。
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;
}
錯(cuò)誤的做法:
//不檢查指針的有效性僻孝,說(shuō)明答題者不注重代碼的健壯性。
//檢查指針的有效性時(shí)使用((!strDest)||(!strSrc))或(!(strDest&&strSrc))守谓,說(shuō)明答題者對(duì)C語(yǔ)言中類型的隱式轉(zhuǎn)換沒有深刻認(rèn)識(shí)穿铆。在本例中char *轉(zhuǎn)換為bool即是類型隱式轉(zhuǎn)換,這種功能雖然靈活斋荞,但更多的是導(dǎo)致出錯(cuò)概率增大和維護(hù)成本升高荞雏。所以C++專門增加了bool、true平酿、false三個(gè)關(guān)鍵字以提供更安全的條件表達(dá)式凤优。
//檢查指針的有效性時(shí)使用((strDest==0)||(strSrc==0)),說(shuō)明答題者不知道使用常量的好處蜈彼。直接使用字面常量(如本例中的0)會(huì)減少程序的可維護(hù)性筑辨。0雖然簡(jiǎn)單,但程序中可能出現(xiàn)很多處對(duì)指針的檢查幸逆,萬(wàn)一出現(xiàn)筆誤棍辕,編譯器不能發(fā)現(xiàn),生成的程序內(nèi)含邏輯錯(cuò)誤秉颗,很難排除痢毒。而使用NULL代替0,如果出現(xiàn)拼寫錯(cuò)誤蚕甥,編譯器就會(huì)檢查出來(lái)哪替。
//return new string("Invalid argument(s)");,說(shuō)明答題者根本不知道返回值的用途菇怀,并且他對(duì)內(nèi)存泄漏也沒有警惕心凭舶。從函數(shù)中返回函數(shù)體內(nèi)分配的內(nèi)存是十分危險(xiǎn)的做法,他把釋放內(nèi)存的義務(wù)拋給不知情的調(diào)用者爱沟,絕大多數(shù)情況下帅霜,調(diào)用者不會(huì)釋放內(nèi)存,這導(dǎo)致內(nèi)存泄漏呼伸。
//return 0;身冀,說(shuō)明答題者沒有掌握異常機(jī)制钝尸。調(diào)用者有可能忘記檢查返回值,調(diào)用者還可能無(wú)法檢查返回值(見后面的鏈?zhǔn)奖磉_(dá)式)搂根。妄想讓返回值肩負(fù)返回正確值和異常值的雙重功能珍促,其結(jié)果往往是兩種功能都失效。應(yīng)該以拋出異常來(lái)代替返回值剩愧,這樣可以減輕調(diào)用者的負(fù)擔(dān)猪叙、使錯(cuò)誤不會(huì)被忽略、增強(qiáng)程序的可維護(hù)性仁卷。
//忘記保存原始的strDest值穴翩,說(shuō)明答題者邏輯思維不嚴(yán)密。
//循環(huán)寫成while (*strDest++=*strSrc++);锦积,同[1](B)芒帕。
//循環(huán)寫成while (*strSrc!='\0') *strDest++=*strSrc++;,說(shuō)明答題者對(duì)邊界條件的檢查不力充包。循環(huán)體結(jié)束后副签,strDest字符串的末尾沒有正確地加上'\0'。
/**
*返回strDest的原始值使函數(shù)能夠支持鏈?zhǔn)奖磉_(dá)式基矮,增加了函數(shù)的“附加值”淆储。同樣功能的函數(shù),如果能合理地提高的可用性家浇,自然就更加理想本砰。
鏈?zhǔn)奖磉_(dá)式的形式如:
`nt iLength=strlen(strcpy(strA,strB));
又如:
char * strA=strcpy(new char[10],strB);
返回strSrc的原始值是錯(cuò)誤的。其一钢悲,源字符串肯定是已知的点额,返回它沒有意義。其二莺琳,不能支持形如第二例的表達(dá)式还棱。其三,為了保護(hù)源字符串惭等,形參用const限定strSrc所指的內(nèi)容珍手,把const char *作為char *返回,類型不符辞做,編譯報(bào)錯(cuò)琳要。
*/
六十六:C#中四種訪問(wèn)修飾符是哪些?各有什么區(qū)別秤茅?
答:1.屬性修飾符 2.存取修飾符 3.類修飾符 4.成員修飾符稚补。
屬性修飾符:
Serializable
:按值將對(duì)象封送到遠(yuǎn)程服務(wù)器。
STATread
:是單線程套間的意思框喳,是一種線程模型课幕。
MATAThread
:是多線程套間的意思厦坛,也是一種線程模型。
存取修飾符:
public
:存取不受限制撰豺。
private
:只有包含該成員的類可以存取粪般。
internal
:只有當(dāng)前命名空間可以存取。
protected
:只有包含該成員的類以及派生類可以存取污桦。
類修飾符:
abstract
:抽象類。指示一個(gè)類只能作為其它類的基類匙监。
sealed
:密封類凡橱。指示一個(gè)類不能被繼承。理所當(dāng)然亭姥,密封類不能同時(shí)又是抽象類稼钩,因?yàn)槌橄罂偸窍M焕^承的。
成員修飾符:
abstract
:指示該方法或?qū)傩詻]有實(shí)現(xiàn)达罗。
sealed
:密封方法坝撑。可以防止在派生類中對(duì)該方法的override
(重載)粮揉。不是類的每個(gè)成員方法都可以作為密封方法密封方法巡李,必須對(duì)基類的虛方法進(jìn)行重載,提供具體的實(shí)現(xiàn)方法扶认。所以侨拦,在方法的聲明中,sealed
修飾符總是和override
修飾符同時(shí)使用辐宾。
delegate
:委托狱从。用來(lái)定義一個(gè)函數(shù)指針。C#中的事件驅(qū)動(dòng)是基于delegate + event的叠纹。
const
:指定該成員的值只讀不允許修改季研。
event
:聲明一個(gè)事件。
extern
:指示方法在外部實(shí)現(xiàn)誉察。
override
:重寫与涡。對(duì)由基類繼承成員的新實(shí)現(xiàn)。
readonly
:指示一個(gè)域只能在聲明時(shí)以及相同類的內(nèi)部被賦值冒窍。
static
:指示一個(gè)成員屬于類型本身递沪,而不是屬于特定的對(duì)象。即在定義后可不經(jīng)實(shí)例化综液,就可使用款慨。
virtual
:指示一個(gè)方法或存取器的實(shí)現(xiàn)可以在繼承類中被覆蓋。
new
:在派生類中隱藏指定的基類成員谬莹,從而實(shí)現(xiàn)重寫的功能檩奠。 若要隱藏繼承類的成員桩了,請(qǐng)使用相同名稱在派生類中聲明該成員稿辙,并用 new 修飾符修飾它斥废。
六十七:Heap與Stack有何區(qū)別?
答:1.heap是堆怨绣,stack是棧整胃。2.stack的空間由操作系統(tǒng)自動(dòng)分配和釋放颗圣,heap的空間是手動(dòng)申請(qǐng)和釋放的,heap常用new關(guān)鍵字來(lái)分配屁使。3.stack空間有限在岂,heap的空間是很大的自由區(qū)。
六十八:值類型和引用類型有何區(qū)別蛮寂?
答:
1.值類型的數(shù)據(jù)存儲(chǔ)在內(nèi)存的棧中蔽午;引用類型的數(shù)據(jù)存儲(chǔ)在內(nèi)存的堆中,而內(nèi)存單元中只存放堆中對(duì)象的地址酬蹋。
2.值類型存取速度快及老,引用類型存取速度慢。
3.值類型表示實(shí)際數(shù)據(jù)范抓,引用類型表示指向存儲(chǔ)在內(nèi)存堆中的數(shù)據(jù)的指針或引用
4.值類型繼承自System.ValueType骄恶,引用類型繼承自System.Object
5.棧的內(nèi)存分配是自動(dòng)釋放;而堆在.NET中會(huì)有GC來(lái)釋放
6.值類型的變量直接存放實(shí)際的數(shù)據(jù)尉咕,而引用類型的變量存放的則是數(shù)據(jù)的地址叠蝇,即對(duì)象的引用。
7.值類型變量直接把變量的值保存在堆棧中年缎,引用類型的變量把實(shí)際數(shù)據(jù)的地址保存在堆棧中悔捶。
六十九:結(jié)構(gòu)體和類有何區(qū)別?
答:結(jié)構(gòu)體是一種值類型单芜,而類是引用類型蜕该。(值類型、引用類型是根據(jù)數(shù)據(jù)存儲(chǔ)的角度來(lái)分的)
就是值類型用于存儲(chǔ)數(shù)據(jù)的值洲鸠,引用類型用于存儲(chǔ)對(duì)實(shí)際數(shù)據(jù)的引用堂淡。那么結(jié)構(gòu)體就是當(dāng)成值來(lái)使用的,類則通過(guò)引用來(lái)對(duì)實(shí)際數(shù)據(jù)操作扒腕。
七十:請(qǐng)寫出求斐波那契數(shù)列任意一位的值得算法
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
參數(shù)和out
參數(shù)是什么绢淀?有什么區(qū)別?
答:ref
和out
參數(shù)的效果一樣瘾腰,都是通過(guò)關(guān)鍵字找到定義在主函數(shù)里面的變量的內(nèi)存地址皆的,并通過(guò)方法體內(nèi)的語(yǔ)法改變它的大小。
不同點(diǎn)就是輸出參數(shù)必須對(duì)參數(shù)進(jìn)行初始化蹋盆。
ref
參數(shù)是引用费薄,out
參數(shù)為輸出參數(shù)硝全。
七十二:C#的委托是什么?有何用處楞抡?
答:委托類似于一種安全的指針引用伟众,在使用它時(shí)是當(dāng)做類來(lái)看待而不是一個(gè)方法,相當(dāng)于對(duì)一組方法的列表的引用召廷。
用處:使用委托使程序員可以將方法引用封裝在委托對(duì)象內(nèi)凳厢。然后可以將該委托對(duì)象傳遞給可調(diào)用所引用方法的代碼,而不必在編譯時(shí)知道將調(diào)用哪個(gè)方法竞慢。與C或C++中的函數(shù)指針不同数初,委托是面向?qū)ο螅沂穷愋桶踩摹?/p>
七十三:協(xié)同程序的執(zhí)行代碼是什么梗顺?有何用處,有何缺點(diǎn)车摄?
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
// 協(xié)同程序WaitAndPrint在Start函數(shù)內(nèi)執(zhí)行,可以視同于它與Start函數(shù)同步執(zhí)行.
StartCoroutine(WaitAndPrint(2.0));
print ("Before WaitAndPrint Finishes " + Time.time );
}
function WaitAndPrint (waitTime : float) {
// suspend execution for waitTime seconds
// 暫停執(zhí)行waitTime秒
yield WaitForSeconds (waitTime);
print ("WaitAndPrint "+ Time.time );
}
作用:一個(gè)協(xié)同程序在執(zhí)行過(guò)程中,可以在任意位置使用yield語(yǔ)句寺谤。yield的返回值控制何時(shí)恢復(fù)協(xié)同程序向下執(zhí)行。協(xié)同程序在對(duì)象自有幀執(zhí)行過(guò)程中堪稱優(yōu)秀吮播。協(xié)同程序在性能上沒有更多的開銷变屁。
缺點(diǎn):協(xié)同程序并非真線程,可能會(huì)發(fā)生堵塞意狠。
七十四:什么是里氏代換元?jiǎng)t粟关?
答:里氏替換原則(Liskov Substitution Principle LSP)面向?qū)ο笤O(shè)計(jì)的基本原則之一。 里氏替換原則中說(shuō)环戈,任何基類可以出現(xiàn)的地方闷板,子類一定可以出現(xiàn),作用方便擴(kuò)展功能能
七十五:Mock和Stub有何區(qū)別院塞?
Mock與Stub的區(qū)別:Mock:關(guān)注行為驗(yàn)證遮晚。細(xì)粒度的測(cè)試,即代碼的邏輯拦止,多數(shù)情況下用于單元測(cè)試县遣。Stub:關(guān)注狀態(tài)驗(yàn)證。粗粒度的測(cè)試汹族,在某個(gè)依賴系統(tǒng)不存在或者還沒實(shí)現(xiàn)或者難以測(cè)試的情況下使用萧求,例如訪問(wèn)文件系統(tǒng),數(shù)據(jù)庫(kù)連接顶瞒,遠(yuǎn)程協(xié)議等夸政。
七十六:概述序列化:
答:序列化簡(jiǎn)單理解成把對(duì)象轉(zhuǎn)換為容易傳輸?shù)母袷降倪^(guò)程。比如搁拙,可以序列化一個(gè)對(duì)象秒梳,然后使用HTTP通過(guò)Internet在客戶端和服務(wù)器端之間傳輸該對(duì)象
七十七:堆和棧的區(qū)別法绵?
答:棧通常保存著我們代碼執(zhí)行的步驟,如在代碼段1中 AddFive()方法酪碘,int pValue變量朋譬,int result變量等等。而堆上存放的則多是對(duì)象兴垦,數(shù)據(jù)等徙赢。(譯者注:忽略編譯器優(yōu)化)我們可以把棧想象成一個(gè)接著一個(gè)疊放在一起的盒子。當(dāng)我們使用的時(shí)候探越,每次從最頂部取走一個(gè)盒子狡赐。棧也是如此,當(dāng)一個(gè)方法(或類型)被調(diào)用完成的時(shí)候钦幔,就從棧頂取走(called a Frame枕屉,譯注:調(diào)用幀),接著下一個(gè)鲤氢。堆則不然搀擂,像是一個(gè)倉(cāng)庫(kù),儲(chǔ)存著我們使用的各種對(duì)象等信息卷玉,跟棧不同的是他們被調(diào)用完畢不會(huì)立即被清理掉哨颂。
七十八:概述c#中代理和事件?
答:代理就是用來(lái)定義指向方法的引用相种。
C#事件本質(zhì)就是對(duì)消息的封裝威恼,用作對(duì)象之間的通信;發(fā)送方叫事件發(fā)送器寝并,接收方叫事件接收器箫措;
七十九:C#中的排序方式有哪些?
答:選擇排序食茎,冒泡排序蒂破,快速排序,插入排序别渔,希爾排序附迷,歸并排序
八十:射線檢測(cè)碰撞物的原理是?
答:射線是3D世界中一個(gè)點(diǎn)向一個(gè)方向發(fā)射的一條無(wú)終點(diǎn)的線哎媚,在發(fā)射軌跡中與其他物體發(fā)生碰撞時(shí)喇伯,它將停止發(fā)射 。
八十一:客戶端與服務(wù)器交互方式有幾種拨与?
答: socket通常也稱作"套接字",實(shí)現(xiàn)服務(wù)器和客戶端之間的物理連接稻据,并進(jìn)行數(shù)據(jù)傳輸,主要有UDP和TCP兩個(gè)協(xié)議。Socket處于網(wǎng)絡(luò)協(xié)議的傳輸層捻悯。
http協(xié)議傳輸?shù)闹饕衕ttp協(xié)議 和基于http協(xié)議的Soap協(xié)議(web service),常見的方式是 http 的post 和get 請(qǐng)求匆赃,web 服務(wù)。
八十二:Unity和Android與iOS如何交互今缚?
八十三:Unity中算柳,照相機(jī)的Clipping Planes
的作用是什么?調(diào)整Near
姓言、Fare
兩個(gè)值時(shí)瞬项,應(yīng)該注意什么?
答:剪裁平面 何荚。從相機(jī)到開始渲染和停止渲染之間的距離囱淋。
八十四:如何在Unity3D中查看場(chǎng)景的面試,頂點(diǎn)數(shù)和Draw Call
數(shù)餐塘?如何降低Draw Call
數(shù)妥衣?
答:在Game視圖右上角點(diǎn)擊Stats。降低Draw Call 的技術(shù)是Draw Call Batching
八十五:請(qǐng)問(wèn)alpha test
在何時(shí)使用戒傻?能達(dá)到什么效果称鳞?
Alpha Test
,中文就是透明度測(cè)試。簡(jiǎn)而言之就是V&F shader
中最后fragment
函數(shù)輸出的該點(diǎn)顏色值(即上一講frag的輸出half4)的alpha值與固定值進(jìn)行比較稠鼻。Alpha Test
語(yǔ)句通常于Pass{}
中的起始位置。Alpha Test
產(chǎn)生的效果也很極端狂票,要么完全透明候齿,即看不到,要么完全不透明闺属。
八十六:UNITY3d在移動(dòng)設(shè)備上的一些優(yōu)化資源的方法
答:
1.使用assetbundle慌盯,實(shí)現(xiàn)資源分離和共享,將內(nèi)存控制到200m之內(nèi)掂器,同時(shí)也可以實(shí)現(xiàn)資源的在線更新
2.頂點(diǎn)數(shù)對(duì)渲染無(wú)論是cpu還是gpu都是壓力最大的貢獻(xiàn)者亚皂,降低頂點(diǎn)數(shù)到8萬(wàn)以下,fps穩(wěn)定到了30幀左右
3.只使用一盞動(dòng)態(tài)光国瓮,不是用陰影灭必,不使用光照探頭
粒子系統(tǒng)是cpu上的大頭
4.剪裁粒子系統(tǒng)
5.合并同時(shí)出現(xiàn)的粒子系統(tǒng)
6.自己實(shí)現(xiàn)輕量級(jí)的粒子系統(tǒng)
animator也是一個(gè)效率奇差的地方
7.把不需要跟骨骼動(dòng)畫和動(dòng)作過(guò)渡的地方全部使用animation,控制骨骼數(shù)量在30根以下
8.animator出視野不更新
9.刪除無(wú)意義的animator
10.animator的初始化很耗時(shí)(粒子上能不能盡量不用animator)
11.除主角外都不要跟骨骼運(yùn)動(dòng)apply root motion
12.絕對(duì)禁止掉那些不帶剛體帶包圍盒的物體(static collider )運(yùn)動(dòng)
NUGI的代碼效率很差乃摹,基本上runtime的時(shí)候?qū)pu的貢獻(xiàn)和render不相上下
13每幀遞歸的計(jì)算finalalpha改為只有初始化和變動(dòng)時(shí)計(jì)算
14去掉法線計(jì)算
15不要每幀計(jì)算viewsize 和windowsize
16filldrawcall時(shí)構(gòu)建頂點(diǎn)緩存使用array.copy
17.代碼剪裁:使用strip level 禁漓,使用.net2.0 subset
18.盡量減少smooth group
19.給美術(shù)定一個(gè)嚴(yán)格的經(jīng)過(guò)科學(xué)驗(yàn)證的美術(shù)標(biāo)準(zhǔn),并在U3D里面配以相應(yīng)的檢查工具
八十七:四元數(shù)有什么作用孵睬?
答:對(duì)旋轉(zhuǎn)角度進(jìn)行計(jì)算時(shí)用到四元數(shù)
八十八:將Camera組件的ClearFlags選項(xiàng)選成Depth only是什么意思播歼?有何用處?
答:僅深度掰读,該模式用于對(duì)象不被裁剪秘狞。
八十九:如何讓已經(jīng)存在的GameObject在LoadLevel后不被卸載掉叭莫?
void Awake()
{
DontDestroyOnLoad(transform.gameObject);
}
九十:在編輯場(chǎng)景時(shí)將GameObject設(shè)置為Static有何作用?
答:設(shè)置游戲?qū)ο鬄镾tatic將會(huì)剔除(或禁用)網(wǎng)格對(duì)象當(dāng)這些部分被靜態(tài)物體擋住而不可見時(shí)烁试。因此雇初,在你的場(chǎng)景中的所有不會(huì)動(dòng)的物體都應(yīng)該標(biāo)記為Static。
九十一:有A和B兩組物體廓潜,有什么辦法能夠保證A組物體永遠(yuǎn)比B組物體先渲染抵皱?
答:把A組物體的渲染對(duì)列大于B物體的渲染隊(duì)列
九十二:將圖片的TextureType
選項(xiàng)分別選為Texture
和Sprite
有什么區(qū)別
答:Sprite
作為UI精靈使用,Texture
作用模型貼圖使用辩蛋。
九十三:?jiǎn)栆粋€(gè)Terrain
呻畸,分別貼3張,4張悼院,5張地表貼圖伤为,渲染速度有什么區(qū)別?為什么据途?
答:沒有區(qū)別绞愚,因?yàn)椴还軒讖堎N圖只渲染一次。
九十四:什么是DrawCall颖医?DrawCall高了又什么影響位衩?如何降低DrawCall?
答:Unity中熔萧,每次引擎準(zhǔn)備數(shù)據(jù)并通知GPU的過(guò)程稱為一次Draw Call糖驴。DrawCall越高對(duì)顯卡的消耗就越大。降低DrawCall的方法:
- Dynamic Batching
- Static Batching
- 高級(jí)特性Shader降級(jí)為統(tǒng)一的低級(jí)特性的Shader佛致。
九十五:實(shí)時(shí)點(diǎn)光源的優(yōu)缺點(diǎn)是什么贮缕?
答:可以有cookies – 帶有 alpha通道的立方圖(Cubemap )紋理。點(diǎn)光源是最耗費(fèi)資源的俺榆。
九十六:Unity的Shader中感昼,Blend SrcAlpha OneMinusSrcAlpha這句話是什么意思?
答:作用就是Alpha混合罐脊。公式:最終顏色 = 源顏色 * 源透明值 + 目標(biāo)顏色*(1 - 源透明值)
九十七:簡(jiǎn)述水面倒影的渲染原理
答: 原理就是對(duì)水面的貼圖紋理進(jìn)行擾動(dòng)定嗓,以產(chǎn)生波光玲玲的效果。用shader可以通過(guò)GPU在像素級(jí)別作擾動(dòng)萍桌,效果細(xì)膩蜕乡,需要的頂點(diǎn)少,速度快
九十八:簡(jiǎn)述NGUI中Grid和Table的作用梗夸?
答:對(duì)Grid和Table下的子物體進(jìn)行排序和定位
九十九:請(qǐng)簡(jiǎn)述NGUI中Panel和Anchor的作用
答:
- 只要提供一個(gè)half-pixel偏移量层玲,它可以讓一個(gè)控件的位置在Windows系統(tǒng)上精確的顯示出來(lái)(只有這個(gè)Anchor的子控件會(huì)受到影響)
- 如果掛載到一個(gè)對(duì)象上,那么他可以將這個(gè)對(duì)象依附到屏幕的角落或者邊緣
3.UIPanel用來(lái)收集和管理它下面所有widget的組件。通過(guò)widget的geometry創(chuàng)建實(shí)際的draw call辛块。沒有panel所有東西都不能夠被渲染出來(lái),你可以把UIPanel當(dāng)做Renderer
一百:能用foreach遍歷訪問(wèn)的對(duì)象需要實(shí)現(xiàn)______接口或聲明_________方法的類型
答:IEnumerable畔派;GetEnumerator
感謝 @王靜怡