unity3d優(yōu)化:不過早做優(yōu)化,用戶不容易察覺,消耗的時(shí)間是做出來的時(shí)間的幾倍乃至幾十倍也不一定出效果.
CPU優(yōu)化
GPU優(yōu)化
Memory優(yōu)化
場(chǎng)景優(yōu)化
移動(dòng)平臺(tái)(手機(jī)Android/iOS)優(yōu)化
1:2D游戲 圖片設(shè)置為Sprite(2D and UI)時(shí) Generate Mip Maps? 選項(xiàng)不選擇(去掉勾選),Mit Maps多級(jí)紋理,是逐步縮小圖像版本的一個(gè)列表,遠(yuǎn)離相機(jī)的物體使用較小的紋理版本仇箱,這個(gè)對(duì)于UGUI來說沒什么用處棘捣,還會(huì)造成圖片模糊和多使用33%以上的內(nèi)存锄贷。Defult里面的Max Size不要超過2048,否則讓美術(shù)重新切圖.
2:碰撞盒將 Is Trigger 勾選上,CPU計(jì)算量減少.如果有空方法,盡量屏蔽之后再打包.update系列方法能少用,盡量少用.
3:GetComponent<>方法消耗CPU,盡量在腳本剛加載時(shí)緩存物體,不要在系統(tǒng)調(diào)用次數(shù)過多的方法中(例如update/fixedupdate/lateupdate等)調(diào)用此方法.GameObject go = null;go.transform 等價(jià)于 go.GetComponent(),所以再使用時(shí),最好對(duì)這個(gè)transform 聲明一個(gè)變量(一般這個(gè)地方是繼承自一個(gè)基類,在基類里面進(jìn)行聲明);GameObject.FindWithTag("cube");//這一系列方法消耗比較小, //GameObject.Find("cube");//消耗比較大;
4:if小技巧,當(dāng)在每單位時(shí)間內(nèi)重復(fù)執(zhí)行的函數(shù)中,寫不要多次寫if() if() if()需要改成if()else if()else if() 這樣聚少成多,會(huì)節(jié)省CPU資源.
5:UGUI小技巧,Text不需要使用富文本的時(shí)候不要勾選RichText選項(xiàng).刪除空的Update方法揽惹。當(dāng)通過Assets目錄創(chuàng)建新的腳本時(shí)秋忙,腳本里會(huì)包括一個(gè)Update方法盔沫,當(dāng)你不使用時(shí)刪除它锌雀。調(diào)用大量的System.IO中的方法時(shí),放在Coroutine(協(xié)程)中調(diào)用.
6:Draw call 就是SetPass calls,SetPass calls就是Draw call?:
Draw call batching DC渲染頂點(diǎn)數(shù)據(jù),unity3d采用2種情況解決,1:Dynamic batching,(動(dòng)態(tài)批處理)對(duì)于比較小的網(wǎng)格頂點(diǎn),將其相似的分成一組,進(jìn)行一次性渲染,會(huì)耗費(fèi)CPU資源,一次性可以處理少于包含900個(gè)頂點(diǎn)(vertex)的網(wǎng)格(Meshes?),系統(tǒng)自動(dòng)做.2:Static batching (靜態(tài)批處理):將靜態(tài)(不移動(dòng))GameObject組合成大型Meshes,并以更快的方式渲染它們,需要手動(dòng)選擇處理.缺點(diǎn)是:動(dòng)態(tài)批處理消耗CPU資源,靜態(tài)批處理內(nèi)存開銷大.
Dynamic batching和 graphics jobs (see?Player Settings),不兼容.條件:只有相同的Material 材質(zhì)才可以批處理.例子:材質(zhì)相同,紋理不同的2個(gè)物體,可以將紋理合并成為一個(gè)大紋理,這樣可以進(jìn)行批處理.使用Renderer.sharedMaterial?保持材質(zhì)共享.例子:Material?材質(zhì)不同,在渲染時(shí)Shadow?陰影可以一起批處理,與紋理不相關(guān).
動(dòng)態(tài)批處理:使用同一個(gè)材質(zhì),同一個(gè)shader,shader數(shù)值還要相同,所有統(tǒng)一縮放(scale)的物體但是尺度(x/y/z)不一樣的不會(huì)進(jìn)行批處理,反之則會(huì).使用不同材質(zhì)的實(shí)例化物體(instance)將會(huì)導(dǎo)致批處理失敗迅诬。擁有l(wèi)ightmap的物體將不會(huì)進(jìn)行批處理(當(dāng)然,如果物體在環(huán)境中都相同,則會(huì)進(jìn)行批處理),預(yù)設(shè)體的實(shí)例會(huì)自動(dòng)地使用相同的網(wǎng)格模型和材質(zhì).
Static batching:當(dāng)有相同的material材質(zhì),并且物體不移動(dòng)/縮放/旋轉(zhuǎn)等,可以使用靜態(tài)批處理.不要講樹木標(biāo)記為靜態(tài),會(huì)占用大量?jī)?nèi)存開銷.以及在燈光效果比較強(qiáng)烈的情況下,不建議使用靜態(tài)批處理,除非此物體不會(huì)受燈光影響.
使用Mesh Renderers,Trail Renderers,Line Renderers,Particle Systems,Sprite Renderers可以被批處理,skinned Meshes, Cloth, 其他類型的rendering不會(huì)被批處理.
7:使用層次而不是標(biāo)簽腋逆。我們可以輕松為對(duì)象分配層次和標(biāo)簽,并查詢特定對(duì)象侈贷,但是涉及碰撞邏輯時(shí)惩歉,層次至少在運(yùn)行表現(xiàn)上會(huì)更有明顯優(yōu)勢(shì)。更快的物理計(jì)算和更少的無用分配內(nèi)存是使用層次的基本原因俏蛮。
8:將?Fixed Timestep (默認(rèn)0.02,可以修改)設(shè)置一個(gè)比較適合的時(shí)間,fixedupdate方法刷新過快影響性能,刷新過慢用戶體驗(yàn)不好.需要一個(gè)適度值.
9:減少角色控制器(Character Controller)移動(dòng)命令的調(diào)用撑蚌。移動(dòng)角色控制器會(huì)同步發(fā)生,每次調(diào)用都會(huì)耗損極大的性能搏屑。我們的做法是緩存每幀的移動(dòng)請(qǐng)求争涌,并且僅運(yùn)用一次。http://www.ceeger.com/Components/class-CharacterController.html? 避免多次回調(diào)ControllerColliderHit函數(shù).
10:面對(duì)性能更弱的設(shè)備辣恋,要用skinned mesh代替physics cloth亮垫。cloth參數(shù)在運(yùn)行表現(xiàn)中發(fā)揮重要作用,如果你肯花些時(shí)間找到美學(xué)與運(yùn)行表現(xiàn)之間的平衡點(diǎn)伟骨,就可以獲得理想的結(jié)果饮潦。在物理模擬過程中不要使用Ragdolls,只有在必要時(shí)才讓它生效盡量少使用Ragdolls(布娃娃系統(tǒng))携狭,只有在必要時(shí)才讓它生效继蜡。
11:對(duì)于性能較差的硬件,盡量避免使用碰撞器與物理效果,使用代碼進(jìn)行模擬.
12:盡量減少函數(shù)調(diào)用棧,能用自己寫的一句話一個(gè)運(yùn)算就能完成的,不要調(diào)用系統(tǒng)函數(shù),不要使用SendMessage之類的方法,他比直接調(diào)用方法慢了100倍逛腿,你可以直接調(diào)用或通過C#的委托來實(shí)現(xiàn)稀并。
13:優(yōu)化數(shù)學(xué)運(yùn)算,盡量避免使用float单默,而使用int碘举,特別是在手機(jī)游戲中,盡量少用復(fù)雜的數(shù)學(xué)函數(shù)雕凹,比如sin,cos等函數(shù)殴俱。改除法/為乘法,例如:使用x*0.5f而不是 x/2.0f 政冻。
14:壓縮一切可以壓縮的,如mesh texture material等
15:OnGUI方法少用,盡量不用,盡量避免數(shù)據(jù)拷貝.
16:盡量少使用粒子,看得過去即可.lightmap靜態(tài)時(shí),使用烘焙過后的靜態(tài)圖片進(jìn)行替換,如果是動(dòng)態(tài)烘焙,盡量減少烘焙的點(diǎn).不要將一個(gè)場(chǎng)景做成一個(gè)完整的物體,要做成分塊,為了優(yōu)化效率.關(guān)閉陰影渲染,使用面片(圖片),將物體貼上去.
18:使用圖集,不使用很多圖片,圖集控制在1024x1024之下.對(duì)每一張圖片進(jìn)行壓縮iOS使用PVRTC,Android使用ETC,讓美術(shù)減少動(dòng)畫幀數(shù),減少渲染頂點(diǎn)數(shù).
19:性能優(yōu)化:減小資源占用的內(nèi)存,減少占用GPU的資源并保障游戲體驗(yàn).優(yōu)化的目標(biāo):游戲流暢的運(yùn)行60幀/30幀/24幀,避免卡頓(圖片解析,文件存儲(chǔ),大量敵人,網(wǎng)絡(luò)連接等),30幀是手游端常用幀數(shù).硬件兼容(CPU,GPU等),安裝包減負(fù).? ? 常見的性能黑點(diǎn)指的是將正確的代碼放在了錯(cuò)誤的地方(系統(tǒng)也會(huì)產(chǎn)生性能黑點(diǎn)).
20:①安裝包的優(yōu)化;②資源包的優(yōu)化;③流程結(jié)構(gòu)優(yōu)化:即用戶操作較少,達(dá)到較多的功能.
21:體驗(yàn)優(yōu)化:對(duì)動(dòng)畫,畫面協(xié)調(diào)度,FPS的優(yōu)化等.
22:評(píng)估性能工具unity3d Profiler? ?:需要知道以下知識(shí),1000毫秒=1秒 ;? F P S 是 偵/秒 30FPS= 30/(1000ms),如果是每幀多少時(shí)間:1000/30=33.33ms 就是每幀33.33ms這是手游開發(fā)的正常頻率 即在Profiler中看到毫秒數(shù)越小,后面幀率越大,則性能越好.在同一個(gè)方法中:total數(shù)值和self數(shù)值相對(duì),total表示這個(gè)方法總共占用了多少資源(百分比形式),self表示這個(gè)方法自己占用了多少資源(百分比形式),其他資源占用是由此方法中的其他代碼所占用表示為total-self.然后在看這個(gè)方法所占用的Time ms數(shù),在手游里面如果超過了33.33ms就表示需要進(jìn)行優(yōu)化.
23:數(shù)學(xué)計(jì)算優(yōu)化:盡可能用簡(jiǎn)單的計(jì)算獲取開發(fā)的效率,減小數(shù)學(xué)計(jì)算的精度.
①計(jì)算距離:Vector3.Magnitude 消耗大,多了一步開平方????以及????Vector3.SqrMagnitude 消耗小,沒有開平方,比如:大量計(jì)算敵人距離主角的距離是否比其他物體距離主角較近,只需要使用?Vector3.SqrMagnitude 消耗小的函數(shù)即可實(shí)現(xiàn).② 計(jì)算敵人和主角的方位:Vector3.Angle計(jì)算夾角 ,但這個(gè)函數(shù)使用了較多的數(shù)學(xué)運(yùn)算,有時(shí)候我們就直接使用Vector3.Dot(dot當(dāng)其值大于0表示兩個(gè)向量同向,當(dāng)其值等于0表示2個(gè)向量互相垂直,當(dāng)其小于0表示2個(gè)值相反,同向?yàn)?,反向?yàn)?1)點(diǎn)積這個(gè)函數(shù)即可;③Vector3.Cross(叉積(向量,其值又可以稱之為垂直于2條向量的法線));
24:對(duì)象池:使用對(duì)象池管理子彈/炮彈,音頻,敵人等大量重復(fù)使用的對(duì)象.1:首先生成一定數(shù)量的對(duì)象,使其處于懶惰狀態(tài); 2:使用對(duì)象時(shí),先找到懶惰的對(duì)象,激活,變成活躍對(duì)象,如果數(shù)量不夠,就需要重新創(chuàng)建對(duì)象; 3:銷毀對(duì)象,意思是將活躍對(duì)象變成懶惰對(duì)象,并不是真正的銷毀; 4:優(yōu)化pool,加入時(shí)間概念,間隔一段時(shí)間,將對(duì)象設(shè)置成為懶惰狀態(tài); 5:使用第三方插件;
25:Mesh(網(wǎng)格):在Game視窗中點(diǎn)擊Stats按鈕檢測(cè)Tris(三角形)手游端不要超過60K或者80K,PC端是200K/300K ,具體數(shù)值需要查看官網(wǎng)文檔;可能模型本身并沒有那么高的Tris和Verts(頂點(diǎn)),但是經(jīng)過光照,產(chǎn)生的陰影,就會(huì)產(chǎn)生很多Tris和Verts;在一個(gè)燈光組件上面選中ShadowType把選項(xiàng)選成No Shadows則會(huì)大量減少Tris和Verts;
如何減少Tris和Verts呢?? 當(dāng)攝像機(jī)拉遠(yuǎn)時(shí),物體身上某些頂點(diǎn)和面是可以被忽略的,也就是人眼看不到特別精細(xì)的物件,就可以將其忽略,不讓GPU進(jìn)行渲染,一是需要美術(shù)將其模糊化之后的模型新建一個(gè)出來,逐級(jí)遞減Tris和Verts(美術(shù)會(huì)覺得累,不想做),二是游戲開發(fā)人員做優(yōu)化,利用插件(不太精細(xì),出現(xiàn)各種問題等),比如Simple LOD插件,https://blog.csdn.net/csdn_cjt/article/details/51498059 插件生成了3個(gè)Mesh,配上最原始的Mesh之后需要我們?nèi)绾稳懩_本呢?(可以同屏更多的敵人),例子是非常簡(jiǎn)單的原理,具體的插件里面自帶腳本即可實(shí)現(xiàn)
26 material(材質(zhì)):SetPass calls 當(dāng)手游端這個(gè)超過60/80 ,PC端超過300 一般需要進(jìn)行優(yōu)化.模型和光照,陰影,2d圖片等都會(huì)產(chǎn)生SetPass calls;
2d圖片在場(chǎng)景里面使用的一個(gè)material就是一個(gè)SetPass calls,系統(tǒng)會(huì)對(duì)圖片進(jìn)行打包成圖集,在設(shè)置圖片的時(shí)候Max Size最大不要超過2048,但是一個(gè)需要展示特別精細(xì)的圖最好不要打進(jìn)圖集,如何進(jìn)行打包呢?將圖片設(shè)置成為Sprite(2D and UI) 在下面的Packing Tag 填入數(shù)值,之后在Edit->Project Settings->Editor里面 將Sprite Packer中的mode 選成 Always Enabled(legacy Sprite Packer),然后在選擇window->Sprite Packer?
當(dāng)我們?cè)谶@個(gè)地方打進(jìn)去多張圖時(shí),再次使用這張圖集里面的2d圖片的時(shí)候,這張圖片里面的各種圖組合在一起只會(huì)出現(xiàn)一次SetPass calls.
3D 物體在使用同一個(gè)材質(zhì)的時(shí)候多次復(fù)制此物體SetPass calls不會(huì)增加,增加的是Batches ,使用不同的材質(zhì)會(huì)增加一次SetPass calls;這就需要合并材質(zhì)如:https://blog.csdn.net/dardgen2015/article/details/51517860
27? ?剔除 Camera設(shè)置Occlusion Culling為true表示支持遮擋剔除,此時(shí)沒有效果,需要先打開window->Occlusion Culling 然后進(jìn)行選擇bake才有效果,首先需要這個(gè)物體設(shè)置成為Occluder static ,設(shè)置這個(gè)物體時(shí),會(huì)讀條,此時(shí)再計(jì)算光照和陰影.在Occlusion面板中,Smallest Occluder屬性表示任何長(zhǎng)和寬大于此值才會(huì)擋住后面的物體.bake之后隨著鏡頭的移動(dòng),物體如果不在攝像機(jī)照射范圍之內(nèi),則會(huì)被剔除;系統(tǒng)的這個(gè)剔除會(huì)產(chǎn)生某些不完美,當(dāng)用戶不察覺時(shí),不必在意;
28 光照 在游戲場(chǎng)景中,當(dāng)物體叫多時(shí),是亟待并且急需優(yōu)化的,是最重要的.Light組件里面有一個(gè)mode選項(xiàng),將其選成baked選擇.移動(dòng)端現(xiàn)在不能支持Linear Space 但是支持Gamma Space;原理是將實(shí)時(shí)的場(chǎng)景bake成為幾張圖片,然后將圖貼在場(chǎng)景中,極大的降低了SetPass calls ;此時(shí)再將一個(gè)物體放置進(jìn)場(chǎng)景中,將不會(huì)產(chǎn)生光照和陰影效果,我們需要另一個(gè)東西Light Probe Group 光照探針,作用是讓動(dòng)態(tài)的物體可以受到靜態(tài)光源的效果;
29 碰撞 Collider盡可能簡(jiǎn)單,即盡可能少使用Mesh Collider,盡可能組合使用簡(jiǎn)單的Collider; ????rigidbody在被激活情況下,盡可能少用,碰撞體的檢測(cè)方式Collision Detection 是否持續(xù)/動(dòng)態(tài)檢測(cè)等方式,先選擇消耗最小的,如果不能滿足條件,則選擇消耗較大的.
30 打包優(yōu)化:在File->Build Settings -> Switch Platform /Player Settings->other Settings->Configuration下面有個(gè)Api Compatibility Level 有2個(gè)選項(xiàng),一個(gè)是完整的.net 2.0版本,一個(gè)是.net 2.0 subset 子集(簡(jiǎn)化版,這個(gè)選項(xiàng)可以節(jié)省打包的資源);下面有一個(gè)Stripping Level,后面的選項(xiàng)是逐級(jí)遞減資源,也就是當(dāng)你選擇use micro mscorlib 表示在發(fā)布的時(shí)候使用最小的代碼量,大約會(huì)有幾M的差別;圖片psd/png/jpg ,最好使用psd導(dǎo)入unity3d里面,在里面做優(yōu)化,在這張圖片的inspector里面的Max Size參數(shù)選擇較小的size,將其透明通道關(guān)閉(如果有屬性alpha source 選擇none,減少圖片的大小),音頻文件opus(未來主流)/ogg/mp3/wav,逐級(jí)質(zhì)量變大.模型文件共用AnimationClip;在控制臺(tái)右上角有個(gè)open editor log 打開文本文件,查找問題;
31:插件介紹:utomate 節(jié)點(diǎn)編程,針對(duì)iOS和安卓打包,當(dāng)你設(shè)置成功之后,自動(dòng)打包,你可以去做其他事情,不必緊盯屏幕.debug 插件 SRDebugger,在真機(jī)上面右上角連點(diǎn)3次,就會(huì)出現(xiàn)一些系統(tǒng)記錄的debug.log信息.
32:http://forum.china.unity3d.com/thread-32492-1-1.html