以下技巧并不是必須的,但是對(duì)于想要提升游戲性能的人來(lái)說(shuō)應(yīng)該還是很不錯(cuò)的。 優(yōu)化的常規(guī)技巧 剖析你的游戲。 不要花費(fèi)時(shí)間來(lái)優(yōu)化那些晦澀的代碼或者縮減圖形文件的大小,除非這是你游戲的瓶頸。第一次剖析你的游戲?qū)?huì)使你發(fā)現(xiàn)你游戲的瓶頸。Apple's Shark是一個(gè)很好的用來(lái)剖析基于OpenGL的程序的工具。 再次剖析你的游戲。 優(yōu)化之后不要忘記再剖析一次你的游戲,這樣可以檢查你所做的優(yōu)化是否達(dá)到了預(yù)期的效果。當(dāng)然,這樣做也可能會(huì)使你發(fā)現(xiàn)更多的瓶頸。 流程第一、性能第二。 花費(fèi)時(shí)間來(lái)使你游戲的創(chuàng)建盡可能地流暢。盡可能快地修正游戲中的錯(cuò)誤將會(huì)使你后期更容易優(yōu)化你的游戲。 在Scene View中測(cè)試場(chǎng)景。 這樣做將會(huì)使你清楚了解這個(gè)場(chǎng)景中的物體或者附加在物體上的腳本是否降低了游戲性能。如果Scene View反應(yīng)遲鈍,那么有可能是圖形方面的原因,如果Scene View反應(yīng)不遲鈍,那么瓶頸可能出在腳本或者物理系統(tǒng)上。 禁用指定游戲物體。 在play模式下,嘗試禁用并啟用游戲物體來(lái)排查出游戲慢的原因。 網(wǎng)格 如果可能的話,把相鄰的物體(網(wǎng)格)合并為一個(gè)只有一個(gè)材質(zhì)的物體(網(wǎng)格)。 比如,你的游戲中包含一個(gè)桌子,上面有一堆東西,你完全可以在3D程序中將它們合并在一起(這可能也需要你將這些物體的紋理合并為一個(gè)大的紋理集)。減少需要渲染的物體的數(shù)量可以極大地提高游戲性能。 不要有不必要的網(wǎng)格。 如果你的游戲場(chǎng)景中有一個(gè)人物,那么他應(yīng)該是一個(gè)網(wǎng)格。如果你有一個(gè)船,那么它也應(yīng)該只是一個(gè)網(wǎng)格。 每一個(gè)網(wǎng)格只用一種材質(zhì)。 使用極少的面數(shù)的網(wǎng)格(比如500個(gè)多邊形以下)。 最好把你人物的三角面數(shù)量控制在1500-2000個(gè)之間。 這個(gè)數(shù)量可以說(shuō)是游戲質(zhì)量和性能之間一個(gè)均衡值。如果你的模型有四邊形,那么在導(dǎo)入模型的時(shí)候,引擎將會(huì)把每個(gè)四邊形變?yōu)閮蓚€(gè)三角形。 光照 像素光。 像素光可以讓你的游戲看起來(lái)效果很牛逼,但是不要使用過(guò)多的像素光。在你的游戲中可以使用質(zhì)量管理器來(lái)調(diào)節(jié)像素光的數(shù)量來(lái)取得一個(gè)性能和質(zhì)量的均衡點(diǎn)。 性能占用順序:聚光燈>點(diǎn)光源>平行光。 一個(gè)好的點(diǎn)亮場(chǎng)景的方法就是先得到你想要的效果,然后看看哪些光更重要;在保持光效的前提下看看哪些光可以去掉。 點(diǎn)光源和聚光燈只影響它們范圍內(nèi)的網(wǎng)格。 如果一個(gè)網(wǎng)格處于點(diǎn)光源或者聚光燈的照射范圍之外,并且光源的attenuate開(kāi)關(guān)是打開(kāi)的,那么這個(gè)網(wǎng)格將不會(huì)被光源所影響,這樣就可以節(jié)省性能開(kāi)銷(xiāo)。這樣做理論上來(lái)講可以使用很多小的點(diǎn)光源而且依然能有一個(gè)好的性能,因?yàn)檫@些光源只影響一小部分物體。一個(gè)網(wǎng)格在有8個(gè)以上光源影響的時(shí)候,只響應(yīng)前8個(gè)最亮的光源。 貼圖 在外觀不變的前提下,貼圖大小越小越好。 如果你的顯卡的顯存不夠大的話,你游戲中的貼圖將會(huì)被轉(zhuǎn)存到系統(tǒng)內(nèi)存中,在顯卡調(diào)用它們的時(shí)候再傳到顯卡中。對(duì)于比較新的電腦來(lái)說(shuō),內(nèi)存和顯卡之間有足夠的帶寬來(lái)達(dá)到一個(gè)很好的性能;如果你很無(wú)恥地用了巨多的大圖片的話,在低顯存的電腦上運(yùn)行你的游戲的時(shí)候,你的游戲必然會(huì)掛掉。倒是沒(méi)有必要在圖形編輯軟件中調(diào)整貼圖的大小。你可以在unity導(dǎo)入貼圖的時(shí)候進(jìn)行調(diào)整。 不要使用低質(zhì)量的圖片。 在小播放界面的游戲中使用低質(zhì)量的jpeg圖片或者低色彩的png圖片亦或是gif圖片沒(méi)什么問(wèn)題。在發(fā)布游戲的時(shí)候,引擎會(huì)自動(dòng)壓縮這些圖片,多重壓縮和解壓將會(huì)降低圖片的質(zhì)量,所以最好保持貼圖文件的分辨率為原始分辨率。這樣就會(huì)減少多重壓縮和解壓所導(dǎo)致的圖片失真現(xiàn)象。 音頻 使用.ogg格式的壓縮音頻文件。 所有其他的音頻格式文件在發(fā)布時(shí)將會(huì)被轉(zhuǎn)儲(chǔ)為未壓縮音頻文件。 對(duì)于小音效使用未壓縮音頻文件。 Unity在運(yùn)行過(guò)程中會(huì)解壓所有的ogg文件。它會(huì)把經(jīng)常播放的音效轉(zhuǎn)儲(chǔ)為WAV或者aiff格式的文件,這樣就可以不用cpu總是解壓這些文件了。比如快速的槍聲,腳步聲和其他一些連續(xù)播放又很短小的音效。 物理 每一個(gè)剛體都需要大量運(yùn)算,所以剛體越少越好。 當(dāng)角速度和移動(dòng)速度降低到某個(gè)臨界值的時(shí)候,剛體將會(huì)進(jìn)入休眠狀態(tài)。當(dāng)剛體進(jìn)入休眠狀態(tài)時(shí),他們需要的運(yùn)算量將會(huì)大量減少,但是會(huì)保留很少的一部分運(yùn)算來(lái)隨時(shí)應(yīng)對(duì)外部的作用力或者物體的碰撞。 多重碰撞相比一個(gè)接一個(gè)地碰撞將會(huì)花費(fèi)更多的運(yùn)算。 比如一個(gè)球去碰一堆球所需要的計(jì)算量會(huì)遠(yuǎn)遠(yuǎn)大于去一個(gè)一個(gè)地碰這些球所需要的計(jì)算量。 Shaders 多重效果的shader就比看起來(lái)樣式很單一的shader要更耗費(fèi)資源。 同樣在一個(gè)擁有貼圖和光反射的物體上,使用VertexLit Diffuse shader無(wú)疑是最省資源的。 腳本 選擇適當(dāng)?shù)乃惴ā?/span> 選擇一個(gè)正確的算法將會(huì)更容易進(jìn)行優(yōu)化。最好的算法不一定就是算法復(fù)雜度最低的算法。 盡量不要使用FixedUpdate()函數(shù)。 這種函數(shù)在每一個(gè)物體的每一個(gè)腳本中每秒調(diào)用50-100次。如果可以的話盡量把這個(gè)函數(shù)里面的東西放在Update()函數(shù)中執(zhí)行。 如果可能的話,在腳本無(wú)用的時(shí)候禁用它。 比如有一個(gè)敵人在數(shù)千米開(kāi)外的位置,完全可以禁用它的AI腳本,直到需要的時(shí)候再啟用這個(gè)腳本。啟用和禁用物體的最好方法就是使用gameObject.SetActiveRecursively(false)函數(shù),并且把物體的球碰撞和盒碰撞都置為trigger。 如果不需要Update函數(shù)的時(shí)候就刪掉它。 在創(chuàng)建一個(gè)新腳本的時(shí)候,系統(tǒng)會(huì)自動(dòng)加入一個(gè)空的Update函數(shù),如果你不使用它的話就把它刪掉。 適當(dāng)?shù)臅r(shí)候使用物體引用。 如果調(diào)用一個(gè)物體需要走一個(gè)很彎的邏輯,比如someGameObject.transform.gameObject.rigidbody.transform.gameObject.rigidbody.transform,這樣就不如直接在腳本中聲明一個(gè)變量,把要調(diào)用的物體直接賦給這個(gè)變量。 盡量使用協(xié)同函數(shù)。 協(xié)同函數(shù)開(kāi)銷(xiāo)很小,相比于一直在進(jìn)行不必要調(diào)用的Update函數(shù)來(lái)說(shuō)更好用。舉例來(lái)說(shuō),如果你有一個(gè)控制燈光漸明漸暗的腳本,你就完全可以使用協(xié)同函數(shù)來(lái)替代Update函數(shù)。這樣的話,在大多數(shù)時(shí)間燈光不變化的時(shí)候,系統(tǒng)的開(kāi)銷(xiāo)會(huì)很小。如果這一過(guò)程是在Update函數(shù)中執(zhí)行的話,Update函數(shù)會(huì)一直檢測(cè)是否需要執(zhí)行漸變。 盡量不要使用搜索物體的函數(shù)。 比如GameObject.FindByTag()和 GameObject.GetComponent(),搜索組件的函數(shù)也一樣盡量少用。搜索就等于遍歷,搜索一次物體就要把所有物體都遍歷一遍,這個(gè)開(kāi)銷(xiāo)我不說(shuō)大家也應(yīng)該都明白。尤其要注意,不要在Update()和FixedUpdate()中使用搜索函數(shù),如果需要的話,最好在Start函數(shù)中使用變量來(lái)獲取一次,之后調(diào)用就直接用這個(gè)變量。 盡量不要使用SendMessage()函數(shù)或者類(lèi)似的函數(shù)。 SendMessage()函數(shù)的執(zhí)行速度至少比直接調(diào)用一個(gè)function慢100倍,隨著腳本和函數(shù)的增多,這個(gè)速度會(huì)更慢,所以如果能直接調(diào)用函數(shù)的話就直接調(diào)用。 關(guān)于JavaScript(Boo)中的動(dòng)態(tài)類(lèi)型。 在使用JavaScript時(shí),聲明變量的盡量明確指定它的類(lèi)型。 所有文章歡迎轉(zhuǎn)載,轉(zhuǎn)載必須標(biāo)明文章出自http:///!??! (吧主加精!) |
|