Unity 性能優(yōu)化

常見的性能問(wèn)題

image.png

VSS:

Virtual Set Size屉来,虛擬耗用內(nèi)存焕阿。它是一個(gè)進(jìn)程能訪問(wèn)的所有內(nèi)存空間地址的大小茂卦。這個(gè)大小包含了 一些沒(méi)有駐留在RAM中的內(nèi)存,就像mallocs已經(jīng)被分配譬巫,但還沒(méi)有寫入咖楣。VSS很少用來(lái)測(cè)量程序的實(shí)際使 用內(nèi)存。

RSS
Resident Set Size芦昔,實(shí)際使用物理內(nèi)存诱贿。RSS是一個(gè)進(jìn)程在RAM中實(shí)際持有的內(nèi)存大小。RSS可能會(huì) 產(chǎn)生誤導(dǎo)咕缎,因?yàn)樗怂性撨M(jìn)程使用的共享庫(kù)所占用的內(nèi)存珠十,一個(gè)被加載到內(nèi)存中的共享庫(kù)可能有很 多進(jìn)程會(huì)使用它。RSS不是單個(gè)進(jìn)程使用內(nèi)存量的精確表示凭豪。

PSS:
Proportional Set Size焙蹭,實(shí)際使用的物理內(nèi)存,它與RSS不同嫂伞,它會(huì)按比例分配共享庫(kù)所占用的內(nèi)存孔厉。 例如,如果有三個(gè)進(jìn)程共享一個(gè)占30頁(yè)內(nèi)存控件的共享庫(kù)帖努,每個(gè)進(jìn)程在計(jì)算PSS的時(shí)候撰豺,只會(huì)計(jì)算10頁(yè)。 PSS是一個(gè)非常有用的數(shù)值拼余,如果系統(tǒng)中所有的進(jìn)程的PSS相加污桦,所得和即為系統(tǒng)占用內(nèi)存的總和。當(dāng)一個(gè) 進(jìn)程被殺死后匙监,它所占用的共享庫(kù)內(nèi)存將會(huì)被其他仍然使用該共享庫(kù)的進(jìn)程所分擔(dān)凡橱。在這種方式下,PSS 也會(huì)帶來(lái)誤導(dǎo)亭姥,因?yàn)楫?dāng)一個(gè)進(jìn)程被殺后稼钩,PSS并不代表系統(tǒng)回收的內(nèi)存大小。

USS:
Unique Set Size致份,進(jìn)程獨(dú)自占用的物理內(nèi)存变抽。這部分內(nèi)存完全是該進(jìn)程獨(dú)享的。USS是一個(gè)非常有用 的數(shù)值氮块,因?yàn)樗砻髁诉\(yùn)行一個(gè)特定進(jìn)程所需的真正內(nèi)存成本绍载。當(dāng)一個(gè)進(jìn)程被殺死,USS就是所有系統(tǒng)回 收的內(nèi)存滔蝉。USS是用來(lái)檢查進(jìn)程中是否有內(nèi)存泄露的最好選擇厌殉。

DrawCall
是CPU調(diào)用底層圖形接口的操作挤渐。比如有上千個(gè)物體脱惰,每一個(gè)的渲染都需要去調(diào)用一次底層接口,而每一次的調(diào)用CPU都需要做很多工作蛀柴,那么CPU必然不堪重負(fù)。

GC
是用來(lái)處理內(nèi)存回收的矫夯,但是卻增加了CPU的開銷(GC一次開銷可長(zhǎng)可短鸽疾,有時(shí)長(zhǎng)達(dá)100ms)。因此對(duì)于GC的優(yōu)化目標(biāo)就是盡量少的觸發(fā)GC训貌。

Unity運(yùn)行時(shí)的內(nèi)存占用情況

image.png

內(nèi)存標(biāo)準(zhǔn)

1.限定內(nèi)存占用不超過(guò)200M(iPhone4接近容易Crash,低端機(jī)型)制肮,目前iPhone6上建議不要超過(guò)500M
2.項(xiàng)目中Reserved Total(總體分配)內(nèi)存盡量控制在150M以內(nèi),如下 Texture 50M Mesh 20M AnimationClip 15M AudioClip 15M Mono堆內(nèi)存 40M 字體等 10M递沪。iPhone 6在此基礎(chǔ)上可以乘以2.5
3.項(xiàng)目中盡量嚴(yán)格控制豺鼻,即使在中高端機(jī)型可較大內(nèi)存運(yùn)行。

Mono內(nèi)存管理策略

1.字符串連接處理款慨,建議StringBuilder
2.盡量不使用foreach儒飒,Unity5.4以上解決了GC
3.問(wèn)題不要頻繁實(shí)例化和銷毀對(duì)象,建議對(duì)象池管理
4.場(chǎng)景切換時(shí)檩奠,主動(dòng)調(diào)用System.GC.Collect(),及時(shí)清理內(nèi)存


image.png

Mono通過(guò)垃圾回收機(jī)制(Garbage Collect桩了,簡(jiǎn)稱GC)對(duì)內(nèi)存進(jìn)行管理。Mono內(nèi)存分為兩部分笆凌,已用內(nèi)存(used)和堆內(nèi)存(heap)圣猎,已用內(nèi)存指的是mono實(shí)際需要使用的內(nèi)存,堆內(nèi)存指的是mono向操作系統(tǒng)申請(qǐng)的內(nèi)存乞而,兩者的差值就是mono的空閑內(nèi)存。當(dāng)mono需要分配內(nèi)存時(shí)慢显,會(huì)先查看空閑內(nèi)存是否足夠爪模,如果足夠的話,直接在空閑內(nèi)存中分配荚藻,否則mono會(huì)進(jìn)行一次GC以釋放更多的空閑內(nèi)存屋灌,如果GC之后仍然沒(méi)有足夠的空閑內(nèi)存,則mono會(huì)向操作系統(tǒng)申請(qǐng)內(nèi)存应狱。

Mono內(nèi)存泄漏分析
1.Mono通過(guò)引用關(guān)系共郭,判斷哪些內(nèi)存不再使用
2.【Mono內(nèi)存泄漏】對(duì)象已經(jīng)不再使用,卻未被GC回收Mono內(nèi)存泄漏使空閑內(nèi)存減少疾呻,GC頻繁除嘹,mono堆不斷擴(kuò)大,最終導(dǎo)致游戲內(nèi)存占用的增大
3.大部分mono內(nèi)存泄漏的情況都是由于靜態(tài)對(duì)象的引用引起
4.不再需要的對(duì)象將其引用設(shè)置為null岸蜗,使其可以被GC及時(shí)回收

資源優(yōu)化

Texture:分辨率大小尉咕、格式、Mipmap璃岳、Read/Write

1.Android 透明使用兩張ETC1壓縮(更高級(jí)一張ETC1上下Alpha分離)年缎,ETC2只支持OpenGL ES3.0設(shè)備悔捶,在不支持的設(shè)備上會(huì)自動(dòng)轉(zhuǎn)成RGBA32/ARGB32格式,對(duì)于RGBA Compressed ETC2 8bits紋理內(nèi)存占用就增大4倍
2.iOS 透明使用一張RGBA PVRTC 4bits或RGBA16或兩張RGB PVRTC Alpha分離单芜,盡量不要使用RGBA32位
3.單張圖最大不超過(guò)1024*1024
4.Mesh:SubMesh數(shù)量蜕该、頂點(diǎn)數(shù)量、壓縮洲鸠、Read/Write Mesh合并堂淡、不勾選Read/Write、大型場(chǎng)景使用LOD
5.AnimationClip:動(dòng)畫曲線數(shù)量坛怪、Constant曲線數(shù)量淤齐、Dense曲線數(shù)量、Stream曲線數(shù)量袜匿、以及動(dòng)畫事件數(shù)量
6.動(dòng)畫壓縮:無(wú)用的曲線刪除更啄,調(diào)整float精度
7.AudioClp:格式、加載方式居灯、時(shí)長(zhǎng)以及頻率 BGM背景音:ogg SFX聲音特效:wav (有些項(xiàng)目BGM\SFX都用mp3)
8.Material:關(guān)聯(lián)的Shader和Texture
9.Shader盡量使用mobile速配的

10.ETC2 的格式理論上只在OpenGL ES 3.0 的設(shè)備上被支持祭务,而在不被支持的設(shè)備上則會(huì)內(nèi)部自動(dòng)轉(zhuǎn)成 RGBA32/ARGB32的格式,這對(duì)于 RGBA Compressed ETC2 8bits 的紋理就是放大了 4 倍怪嫌。因此义锥,如果希望在 OpenGL ES 2.0 的設(shè)備上對(duì)透明材質(zhì)進(jìn)行壓縮,那么可以嘗試使用分離 Alpha 通道的方式岩灭,用兩個(gè) ETC1 來(lái)進(jìn)行壓縮(目前市場(chǎng)上大部分機(jī)型都支持ETC2)

DrawCall優(yōu)化

1.先了解下DrawCall相關(guān)概念拌倍,便于優(yōu)化
DrawCall是CPU調(diào)用底層圖形接口的操作
DrawCall_Num = 25K * CPU_Frame * CPU_Percentage / FPS
DrawCall_Num : DrawCall數(shù)量(最大支持)
CPU_Frame : CPU 工作頻率(GHz單位)
CPU_Percentage:CPU 分配在DrawCall這件事情上的時(shí)間率 (百分比)
FPS:希望的游戲幀率

2.DrawCall Batching(DC批處理)
Dynamic Batching(動(dòng)態(tài)批處理)
Static Batching(靜態(tài)批處理)

3.Bus總線帶寬
CPU完成一次DrawCall,除了需要調(diào)用一次DrawCall的命令之外噪径,還需要把內(nèi)存中頂點(diǎn)數(shù)據(jù)柱恤、紋理貼圖、shader參數(shù)通過(guò)bus總線拷貝到內(nèi)存分配給GPU的顯存之中找爱,注意這是拷貝梗顺,不是指針傳遞,速度不快车摄。項(xiàng)目中不會(huì)同時(shí)出現(xiàn)的資源不要打包到一起寺谤,保證單張合并紋理不大于1024*1024一般就不會(huì)有問(wèn)題了。

CPU優(yōu)化最直接的方法
1.VSync(垂直同步)是CPU優(yōu)化最直接的方式(發(fā)熱吮播、耗電原因之一)
2.打開Edit-Project Settings-Quality找到V Sync Count

image.png

Don’t Sync 不同步
Every V Blank 每一個(gè)垂直同步
Every Second V Blank 每一秒垂直同步

通常我們選擇Don’t Sync,同時(shí)Application.targetFrameRate設(shè)置目標(biāo)FPS变屁,讓性能保持一個(gè)好的狀態(tài)。注意選擇其他項(xiàng),Application.targetFrameRate設(shè)置不生效薄料。

科普:VSync垂直同步又稱場(chǎng)同步(Vertical Hold)敞贡,垂直同步信號(hào)決定了CRT從屏幕頂部畫到底部,再返回原始位置的時(shí)間摄职。從CRT顯示器的顯示原理來(lái)看誊役,單個(gè)像素組成了水平掃描線获列,水平掃描線在垂直方向的堆積形成了完整的畫面。顯示器的刷新率受顯卡DAC控制蛔垢,顯卡DAC完成一幀的掃描后就會(huì)產(chǎn)生一個(gè)垂直同步信號(hào)(決定于屏幕的刷新率)击孩。我們平時(shí)所說(shuō)的打開垂直同步指的是將該信號(hào)送入顯卡3D圖形處理部分,從而讓顯卡在生成3D圖形時(shí)受垂直同步信號(hào)的制約(注意是制約)鹏漆。如果我們選擇等待垂直同步信號(hào)(也就是我們平時(shí)所說(shuō)的垂直同步打開)巩梢,那么在游戲中或許強(qiáng)勁的顯卡迅速的繪制完一屏的圖像,但是沒(méi)有垂直同步信號(hào)的到達(dá)艺玲,顯卡無(wú)法繪制下一屏括蝠,只有等垂直同步的信號(hào)到達(dá),才可以繪制饭聚。這樣FPS自然要受到操作系統(tǒng)刷新率運(yùn)行值的制約忌警。而如果我們選擇不等待垂直同步信號(hào)(也就是我們平時(shí)所說(shuō)的關(guān)閉垂直同步),那么游戲中作完一屏畫面秒梳,顯卡和顯示器無(wú)需等待垂直同步信號(hào)就可以開始下一屏圖像的繪制法绵,自然可以完全發(fā)揮顯卡的實(shí)力。但是不要忘記酪碘,正是因?yàn)榇怪蓖降拇嬖谂笃拍苁沟糜螒蜻M(jìn)程和顯示器刷新率同步,使得畫面更加平滑和穩(wěn)定兴垦。取消了垂直同步信號(hào)徙赢,固然可以換來(lái)更快的幀率,但是在圖像的連續(xù)性上勢(shì)必打折扣探越。

GPU優(yōu)化

image.png

GPU接收頂點(diǎn)數(shù)據(jù)作為輸入傳遞給頂點(diǎn)著色器犀忱。頂點(diǎn)著色器的處理單元是頂點(diǎn),輸入進(jìn)來(lái)的每個(gè)頂點(diǎn)都會(huì)調(diào)用一次頂點(diǎn)著色器。(頂點(diǎn)著色器本身不可以創(chuàng)建或銷毀任何頂點(diǎn)扶关,并無(wú)法得到頂點(diǎn)與頂點(diǎn)之間的關(guān)系)。頂點(diǎn)著色器是完全可編程的数冬,它主要完成的工作有:坐標(biāo)變換和逐頂點(diǎn)光照节槐。 坐標(biāo)變換:就是對(duì)頂點(diǎn)的坐標(biāo)進(jìn)行某種變換—把頂點(diǎn)坐標(biāo)從模型空間轉(zhuǎn)換到齊次裁剪空間。頂點(diǎn)的多少直接決定了三角形面的多少拐纱,也直接決定了GPU的渲染流水線的工作量铜异,所以減少頂點(diǎn)數(shù)是一個(gè)比較重要的優(yōu)化點(diǎn)。那么減少頂點(diǎn)怎么操作呢秸架,又有哪些途徑揍庄?

1.頂點(diǎn)著色器 優(yōu)化基本幾何體(模型減面減頂點(diǎn)) 使用LOD(Level of detail)技術(shù) 使用遮擋剔除(Occlusion culling)技術(shù)
2.中間操作 曲面細(xì)分著色器:是一個(gè)可選的著色器,主要用于細(xì)分圖元 幾何著色器:是一個(gè)可選的著色器东抹,可用于執(zhí)行逐圖元的著色操作蚂子,或者被用于產(chǎn)生更多的圖元沃测。 裁剪:這一階段是可配置的。目的是把那些不在視野內(nèi)的頂點(diǎn)裁剪掉食茎,并剔除某些三角形圖元的面片蒂破。部分在視野內(nèi)的圖元需要做裁剪處理,在裁剪邊緣產(chǎn)生新的頂點(diǎn)和三角形進(jìn)行處理别渔。 屏幕映射:這一階段是可配置和編程的附迷,負(fù)責(zé)把每個(gè)圖元的坐標(biāo)(三維坐標(biāo)系)轉(zhuǎn)換成屏幕坐標(biāo)(二維坐標(biāo)系)。

3.三角形設(shè)置:開始進(jìn)入光柵化階段哎媚,不再是數(shù)學(xué)上點(diǎn)了喇伯,而會(huì)把所有的點(diǎn)都映射到屏幕的具體像素坐標(biāo)上,計(jì)算每條邊上的像素坐標(biāo)而得到三角形邊界的表示方式即為三角形設(shè)置拨与。 三角形遍歷:這一階段會(huì)檢查每個(gè)像素是否被一個(gè)三角風(fēng)格所覆蓋稻据。如果覆蓋的話,就會(huì)生成一個(gè)片元(一個(gè)片元并不是真正意義上的像素截珍,而是包含了很多狀態(tài)的集合攀甚,這些狀態(tài)用于計(jì)算每個(gè)像素的最終顏色。這些狀態(tài)包括了屏幕坐標(biāo)岗喉、深度信息秋度,及從幾何階段輸出的頂點(diǎn)信息,如法線和紋理坐標(biāo)等钱床。)荚斯,這樣一個(gè)查找哪些像素被三角形覆蓋的過(guò)程就是三角形遍歷。

4.片元著色器 盡量減少overdraw 減少實(shí)時(shí)光照 不要使用動(dòng)態(tài)陰影 盡量使用簡(jiǎn)單的shader

片元著色器的輸入就是上一階段對(duì)頂點(diǎn)信息插值得到的結(jié)果查牌,更具體點(diǎn)說(shuō)事期,是根據(jù)從頂點(diǎn)著色器中輸出的數(shù)據(jù)插值得到的。而這一階段的輸出是一個(gè)或者多個(gè)顏色值纸颜。這一階段可以完成很多重要的渲染技術(shù)兽泣,如紋理采樣,但是它的局限在于胁孙,它僅可以影響單個(gè)片元唠倦。片元著色器是比較花時(shí)間的,因?yàn)樗亲罱K顏色的計(jì)算者涮较,在某些情況下稠鼻,例如復(fù)雜燈光環(huán)境下,片元著色器會(huì)出現(xiàn)GPU流水線主要的拖后腿的存在狂票。為了讓片元著色器的計(jì)算更加快候齿,我們需要從很多方面進(jìn)行提前的優(yōu)化:片元著色器最容易拖后腿的情況就是,overdraw!和Android app的開發(fā)一樣慌盯,就是同一個(gè)像素點(diǎn)繪制了多次周霉,某些情況會(huì)造成計(jì)算力的浪費(fèi),增加耗電量润匙。前面提到的遮擋剔除有減少overdraw非常有用诗眨。在PC上,資源無(wú)限孕讳,為了得到最準(zhǔn)確的渲染結(jié)果匠楚,繪制順序可能是從后往前繪制不透明物體,然后再繪制透明物體進(jìn)行混合厂财。但是在移動(dòng)平臺(tái)上芋簿,對(duì)于不透明物體,我們可以設(shè)置從前往后繪制璃饱,對(duì)于有透明通道的物體(很多UI紋理就是含有透明通道的)与斤,再設(shè)置從后往前繪制。unity中shader設(shè)置為“Geometry” 隊(duì)列的對(duì)象總是從前往后繪制的荚恶,而其他固定隊(duì)列(如“Transparent”“Overla”等)的物體撩穿,則都是從后往前繪制的。這意味這谒撼,我們可以盡量把物體的隊(duì)列設(shè)置為“Geometry” 食寡。對(duì)于GUI,尤其要注意和設(shè)計(jì)師商量廓潜,能用不透明的設(shè)計(jì)就用不透明的抵皱,對(duì)于粒子效果,也要注意不要引入透明值辩蛋,多半情況下呻畸,移動(dòng)平臺(tái)的粒子效果透明值沒(méi)有作用。

移動(dòng)平臺(tái)的最大敵人悼院。一個(gè)場(chǎng)景里如果包含了三個(gè)逐像素的點(diǎn)光源伤为,而且使用了逐像素的shader,那么很有可能將Draw Calls提高了三倍据途,同時(shí)也會(huì)增加overdraws钮呀。這是因?yàn)椋瑢?duì)于逐像素的光源來(lái)說(shuō)昨凡,被這些光源照亮的物體要被再渲染一次。更糟糕的是蚁署,無(wú)論是動(dòng)態(tài)批處理還是動(dòng)態(tài)批處理(其實(shí)文檔中只提到了對(duì)動(dòng)態(tài)批處理的影響便脊,但不知道為什么實(shí)驗(yàn)結(jié)果對(duì)靜態(tài)批處理也沒(méi)有用),對(duì)于這種逐像素的pass都無(wú)法進(jìn)行批處理光戈,也就是說(shuō)哪痰,它們會(huì)中斷批處理遂赠。所以當(dāng)你需要光照效果時(shí),可以使用Lightmaps晌杰,提前烘焙好跷睦,提前把場(chǎng)景中的光照信息存儲(chǔ)在一張光照紋理中,然后在運(yùn)行時(shí)刻只需要根據(jù)紋理采樣得到光照信息即可肋演。當(dāng)你需要金屬性強(qiáng)(鏡面)的效果抑诸,可以使用Light Probes。當(dāng)你需要一束光的時(shí)候爹殊,可以使用體積光去模擬這個(gè)效果蜕乡。

動(dòng)態(tài)陰影很酷,但是對(duì)于片元著色器來(lái)說(shuō)是災(zāi)難梗夸,陰影計(jì)算是三角投影計(jì)算层玲,非常耗性能。如果想要陰影反症,可以使用
1.簡(jiǎn)單的使用一個(gè)帶陰影的貼圖
2.烘焙場(chǎng)景辛块,拿到lightmaps
3.創(chuàng)建投影生成器的方法
4.使用ShadowMap的方法

1.建議盡量使用Unity自帶mobile版本的(built-in)Shader,這些大大提高了頂點(diǎn)處理的性能铅碍。當(dāng)然也會(huì)有一些限制润绵。
2.自己寫的shader請(qǐng)注意復(fù)雜操作符計(jì)算,類似pow,exp,log,cos,sin,tan等都是很耗時(shí)的計(jì)算该酗,最多只用一次在每個(gè)像素點(diǎn)的計(jì)算授药,還有有些除法運(yùn)算盡量該能乘法運(yùn)算等。3.避免透明度測(cè)試著色器呜魄,因?yàn)檫@個(gè)非常耗時(shí)悔叽,使用透明度混合的版本來(lái)代替。
4.浮點(diǎn)類型運(yùn)算:精度越低的浮點(diǎn)計(jì)算越快爵嗅。
5.不要在Shader中添加不必要的Pass.

Unity優(yōu)化工具

1.MAT(Memory Analyzer Tool) 需要導(dǎo)入HPROF文件再分析 只能查看java層的內(nèi)存情況娇澎,看不到native堆的詳情
2.Xcode Instrument工具 只能用于Mac,iOS 只能查看C++ 或 object C 的情況,看不到mono堆的詳情
3.Unity自帶Profiler 需要單獨(dú)編譯develop版本 在PC上執(zhí)行睹晒,沒(méi)法捕獲真機(jī)數(shù)據(jù) 內(nèi)存數(shù)據(jù)跟實(shí)際真機(jī)的數(shù)據(jù)差異很大趟庄、多的時(shí)候有幾十M差距 只能看到最近一段時(shí)間的數(shù)據(jù),看不到總體的詳情

官方開源Memory Profiler

1.Unity5.3及其以上
2.使用IL2CPP伪很,比如iOS平臺(tái)
3.構(gòu)建時(shí)開啟Development Build

UWA騰訊WeTest性能分析工具

一戚啥、程序方面   
1、務(wù)必刪除腳本中為空或不需要的默認(rèn)方法锉试;   
2猫十、只在一個(gè)腳本中使用OnGUI方法;   
3、避免在OnGUI中對(duì)變量拖云、方法進(jìn)行更新贷笛、賦值,輸出變量建議在Update內(nèi)宙项;   
4乏苦、同一腳本中頻繁使用的變量建議聲明其為全局變量,腳本之間頻繁調(diào)用的變量或方法建議聲明為全局靜態(tài)變量或方法尤筐;   
5汇荐、不要去頻繁獲取組件,將其聲明為全局變量叔磷;   
6拢驾、數(shù)組、集合類元素優(yōu)先使用Array改基,其次是List繁疤;   
7、腳本在不使用時(shí)腳本禁用之秕狰,需要時(shí)再啟用稠腊;   
8、可以使用Ray來(lái)代替OnMouseXXX類方法鸣哀;   
9架忌、需要隱藏/顯示或?qū)嵗瘉?lái)回切換的對(duì)象,盡量不要使用SetActiveRecursively或active我衬,而使用將對(duì)象遠(yuǎn)遠(yuǎn)移出相機(jī)范圍和移回原位的做法叹放;   
10、盡量少用模運(yùn)算和除法運(yùn)算挠羔,比如a/5f井仰,一定要寫成a乘以0.2f。   
11破加、對(duì)于不經(jīng)常調(diào)用或更改的變量或方法建議使用Coroutines & Yield俱恶;   
12、盡量直接聲明腳本變量范舀,而不使用GetComponent來(lái)獲取腳本合是; iPhone   
13、盡量使用整數(shù)數(shù)字锭环,因?yàn)閕Phone的浮點(diǎn)數(shù)計(jì)算能力很差聪全;   
14、不要使用原生的GUI方法辅辩;   
15荔烧、不要實(shí)例化(Instantiate)對(duì)象吱七,事先建好對(duì)象池,并使用Translate“生成”對(duì)象鹤竭;  
二、模型方面   
1景醇、合并使用同貼圖的材質(zhì)球臀稚,合并使用相同材質(zhì)球的Mesh;   
2三痰、角色的貼圖和材質(zhì)球只要一個(gè)吧寺,若必須多個(gè)則將模型離分離為多個(gè)部分;骨骼系統(tǒng)不要使用太多散劫;   
3稚机、當(dāng)使用多角色時(shí),將動(dòng)畫單獨(dú)分離出來(lái)获搏;   
4赖条、使用層距離來(lái)控制模型的顯示距離;   
5常熙、陰影其實(shí)包含兩方面陰暗和影子纬乍,建議使用實(shí)時(shí)影子時(shí)把陰暗效果烘焙出來(lái),不要使用燈光來(lái)調(diào)節(jié)光線陰暗裸卫。   
6仿贬、少用像素?zé)艉褪褂孟袼責(zé)舻腟hader;   
7墓贿、如果硬陰影可以解決問(wèn)題就不要用軟陰影茧泪,并且使用不影響效果的低分辨率陰影;   
8聋袋、實(shí)時(shí)陰影很耗性能队伟,盡量減小產(chǎn)生陰影的距離;   
9舱馅、允許的話在大場(chǎng)景中使用線性霧缰泡,這樣可以使遠(yuǎn)距離對(duì)象或陰影不易察覺(jué),因此可以通過(guò)減小相機(jī)和陰影距離來(lái)提高性能代嗤;   
10棘钞、使用圓滑組來(lái)盡量減少模型的面數(shù);   
11干毅、項(xiàng)目中如果沒(méi)有燈光或?qū)ο笤谝苿?dòng)那么就不要使用實(shí)時(shí)燈光宜猜;   
12硝逢、水面绅喉、鏡子等實(shí)時(shí)反射/折射的效果單獨(dú)放在Water圖層中叫乌,并且根據(jù)其實(shí)時(shí)反射/折射的范圍來(lái)調(diào)整柴罐; 13、碰撞對(duì)效率的影響很小憨奸,但碰撞還是建議使用Box、Sphere碰撞體似芝;   
14、建材質(zhì)球時(shí)盡量考慮使用Substance板甘;   
15党瓮、盡量將所有的實(shí)時(shí)反射/折射(如水面、鏡子寞奸、地板等等)都集合成一個(gè)面傲醉;   
16、假反射/折射沒(méi)有必要使用過(guò)大分辨率呻引,一般6464就可以吐咳,不建議超過(guò)256256逻悠;   
17童谒、需要更改的材質(zhì)球沪羔,建議實(shí)例化一個(gè),而不是使用公共的材質(zhì)球蔫饰;   
18篓吁、將不須射線或碰撞事件的對(duì)象置于IgnoreRaycast圖層;   
19杖剪、將水面或類似效果置于Water圖層   
20、將透明通道的對(duì)象置于TransparentFX圖層洛巢;   
21、養(yǎng)成良好的標(biāo)簽(Tags)箱熬、層次(Hieratchy)和圖層(Layer)的條理化習(xí)慣狈邑,將不同的對(duì)象置于不同的標(biāo)簽或圖層蚤认,三者有效的結(jié)合將很方便的按名稱、類別和屬性來(lái)查找蘸嘶;   
22陪汽、通過(guò)Stats和Profile查看對(duì)效率影響最大的方面或?qū)ο螅蛘呤褂媒貌糠帜P偷姆绞讲榭磫?wèn)題到底在哪兒况增;   
23训挡、使用遮擋剔除(Occlusion Culling)處理大場(chǎng)景,一種較原生的類LOD技術(shù)澜薄,并且能夠“分割”作為整體的一個(gè)模型肤京。
三、其它   
場(chǎng)景中如果沒(méi)有使用燈光和像素?zé)敉郑筒灰褂梅ň€貼圖,因?yàn)榉ň€效果只有在有光源(Direct Light/Point Light/Angle Light/Pixel Light)的情況下才有效果戒悠。2.1渲染
1.不使用或少使用動(dòng)態(tài)光照舟山,使用light mapping和light probes(光照探頭)
2.不使用法線貼圖(或者只在主角身上使用)卤恳,靜態(tài)物體盡量將法線渲染到貼圖
3.不適用稠密的粒子突琳,盡量使用UV動(dòng)畫
4.不使用fog符相,使用漸變的面片(參考shadow gun)
5.不要使用alpha –test(如那些cutout shader),使用alpha-blend代替
6.使用盡量少的material啊终,使用盡量少的pass和render次數(shù)蓝牲,如反射、陰影這些操作
7.如有必要例衍,使用Per-Layer Cull Distances佛玄,Camera.layerCullDistances
8.只使用mobile組里面的那些預(yù)置shader
9.使用occlusion culling
10.遠(yuǎn)處的物體繪制在skybox上
11.使用drawcall batching: 對(duì)于相鄰動(dòng)態(tài)物體:如果使用相同的shader,將texture合并 對(duì)于靜態(tài)物體梦抢,batching要求很高惑申,詳見Unity Manual>Advanced>Optimizing Graphics Performance>Draw Call Batching 規(guī)格上限

  1. 每個(gè)模型只使用一個(gè)skinned mesh renderer
  2. 每個(gè)mesh不要超過(guò)3個(gè)material
  3. 骨骼數(shù)量不要超過(guò)30
  4. 面數(shù)在1500以內(nèi)將得到好的效率
    2.2物理
    1.真實(shí)的物理(剛體)很消耗,不要輕易使用人芽,盡量使用自己的代碼模仿假的物理
    2.對(duì)于投射物不要使用真實(shí)物理的碰撞和剛體绩脆,用自己的代碼處理
    3.不要使用mesh collider
    4.在edit->project setting->time中調(diào)大FixedTimestep(真實(shí)物理的幀率)來(lái)減少cpu損耗
    2.3腳本編寫
    1.盡量不要?jiǎng)討B(tài)的instantiate和destroy object,使用object pool
    2.盡量不要再update函數(shù)中做復(fù)雜計(jì)算惕味,如有需要玉锌,可以隔N幀計(jì)算一次
    3.不要?jiǎng)討B(tài)的產(chǎn)生字符串,如Debug.Log("boo" + "hoo")禀倔,盡量預(yù)先創(chuàng)建好這些字符串資源
    4.cache一些東西,在update里面盡量避免search愧杯,如GameObject.FindWithTag("")鞋既、GetComponent這樣的調(diào)用,可以在start中預(yù)先存起來(lái)
    5.盡量減少函數(shù)調(diào)用棧跌前,用x = (x > 0 ? x : -x);代替x = Mathf.Abs(x)
    6.String的相加操作陡舅,會(huì)頻繁申請(qǐng)內(nèi)存并釋放,導(dǎo)致gc頻繁,使用System.Text.StringBuilder代替
    2.4 shader編寫
    1.數(shù)據(jù)類型 fixed / lowp - for colors, lighting information and normals, half / mediump - for texture UV coordinates, float / highp - avoid in pixel shaders, fine to use in vertex shader for position calculations.
    2.少使用的函數(shù):pow,sin,cos等
    2.5 GUI
    1.不要使用內(nèi)置的onGUii函數(shù)處理gui摊灭,使用其他方案败徊,如NGUI
    2.貼圖壓縮格式:ios上盡量使用ASTC,Android上使用ETC
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末煤杀,一起剝皮案震驚了整個(gè)濱河市沪哺,隨后出現(xiàn)的幾起案子辜妓,更是在濱河造成了極大的恐慌,老刑警劉巖籍滴,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孽惰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡坦报,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門璃弄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)构回,“玉大人,你說(shuō)我怎么就攤上這事脐供〗韫颍” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵歇由,是天一觀的道長(zhǎng)沦泌。 經(jīng)常有香客問(wèn)我辛掠,道長(zhǎng),這世上最難降的妖魔是什么回挽? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任猩谊,我火速辦了婚禮,結(jié)果婚禮上队塘,老公的妹妹穿的比我還像新娘宜鸯。我一直安慰自己,他們只是感情好鸿市,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布焰情。 她就那樣靜靜地躺著,像睡著了一般合敦。 火紅的嫁衣襯著肌膚如雪验游。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天崔梗,我揣著相機(jī)與錄音垒在,去河邊找鬼。 笑死谈为,一個(gè)胖子當(dāng)著我的面吹牛踢关,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼瘪菌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嘹朗!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起默穴,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤褪秀,失蹤者是張志新(化名)和其女友劉穎媒吗,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡介袜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年遇伞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捶牢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡跳芳,死狀恐怖飞盆,靈堂內(nèi)的尸體忽然破棺而出次乓,到底是詐尸還是另有隱情,我是刑警寧澤票腰,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站测柠,受9級(jí)特大地震影響缘滥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赃阀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一擎颖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驮俗,春花似錦允跑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)倚喂。三九已至瓣戚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舱权,已是汗流浹背仑嗅。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工仓技, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脖捻。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓地沮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親危融。 傳聞我的和親對(duì)象是個(gè)殘疾皇子未荒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容