最簡單的優化建議:
- PC平臺的話保持場景中顯示的頂點數少於200K~3M,移動設備的話少於10W,一切取決於你的目標GPU與CPU。
- 若是你用U3D自帶的SHADER,在表現不差的狀況下選擇Mobile或Unlit目錄下的。它們更高效。
- 儘量共用材質。
- 將不須要移動的物體設爲Static,讓引擎能夠進行其批處理。
- 儘量不用燈光。
- 動態燈光更加不要了。
- 嘗試用壓縮貼圖格式,或用16位代替32位。
- 若是不須要別用霧效(fog)
- 嘗試用OcclusionCulling,在房間過道多遮擋物體多的場景很是有用。若不當反而會增長負擔。
- 用天空盒去「褪去」遠處的物體。
- shader中用貼圖混合的方式去代替多重通道計算。
- shader中注意float/half/fixed的使用。
- shader中不要用複雜的計算pow,sin,cos,tan,log等。
- shader中越少Fragment越好。
- 注意是否有多餘的動畫腳本,模型自動導入到U3D會有動畫腳本,大量的話會嚴重影響消耗CPU計算。
- 注意碰撞體的碰撞層,沒必要要的碰撞檢測請捨去。
1.爲何須要針對CPU(中央處理器)與GPU(圖形處理器)優化?
CPU和GPU都有各自的計算和傳輸瓶頸,不一樣的CPU或GPU他們的性能都不同,因此你的遊戲須要爲你目標用戶的CPU與GPU能力進行鍼對開發。
2.CPU與GPU的限制?
GPU通常具備填充率(Fillrate)和內存帶寬(Memory Bandwidth)的限制,若是你的遊戲在低質量表現的狀況下會快不少,那麼,你極可能須要限制你在GPU的填充率。
CPU通常被所須要渲染物體的個數限制,CPU給GPU發送渲染物體命令叫作DrawCalls。通常來講DrawCalls數量是須要控制的,在能表現效果的前提下越少越好。一般來講,電腦平臺上DrawCalls幾千個以內,移動平臺上DrawCalls幾百個以內。這樣就差很少了。固然以上並非絕對的,僅做一個參考。每每渲染(Rendering)並非一個問題,不管是在GPU和CPU上。極可能是你的腳本代碼效率的問題,用Profiler查看下。
關於Profiler介紹:http://docs.unity3d.com/Documentation/Manual/Profiler.html
須要注意的是:在GPU中顯示的RenderTexture.SetActive()佔用率很高,是由於你同時打開了編輯窗口的緣由,而不是U3D的BUG。
3.關於頂點數量和頂點計算。
CPU和GPU對頂點的計算處理都不少。GPU中渲染的頂點數取決於GPU性能和SHADER的複雜程度,通常來講,每幀以內,在PC上幾百萬頂點內,在移動平臺上不超過10萬頂點。
CPU中的計算主要是在蒙皮骨骼計算,布料模擬,頂點動畫,粒子模擬等。GPU則在各類頂點變換、光照、貼圖混合等。
【我的認爲,具體仍是看各位的項目需求,假設你項目的是3D遊戲。你遊戲須要兼容低配置的硬件、流暢運行、控制硬件發熱的話,還要達到必定效果(LIGHTMAP+霧效),那麼頂點數一定不能高。此時同屏2W頂點我認爲是個比較合適的數目,DRAWCALL最好低於70。另,控制發熱請控制最高上限的幀率,流暢的話,幀率其實不須要過高的。】
4.針對CPU的優化——減小DRAW CALL 的數量。
爲了渲染物體到顯示器上,CPU須要作一些工做,如區分哪一個東西須要渲染、區分開物體是否受光照影響、使用哪一個SHADER而且爲SHADER傳參、發送繪圖命令告訴顯示驅動,而後發送命令告訴顯卡刪除等這些。
假設你有一個上千三角面的模型卻用上千個三角型模型來代替,在GPU上花費是差很少的,可是在CPU上則是極其不同,消耗會大不少不少。爲了讓CPU更少的工做,須要減小可見物的數目:
b.在項目中使用更少的材質(material),將幾個分開的貼圖合成一個較大的圖集等方式處理。若是你須要經過腳原本控制單個材質屬性,須要注意改變Renderer.material將會形成一份材質的拷貝。所以,你應該使用Renderer.sharedMaterial來保證材質的共享狀態。有一個合併模型材質不錯的插件叫Mesh Baker,你們能夠考慮試下。
c.儘可能少用一些渲染步驟,例如reflections,shadows,per-pixel light 等。
e.使用相關剔除數量直接減小Draw Call數量,下文有相關說起。
5.優化幾何模型。
最基本的兩個優化準則:
a.不要有沒必要要的三角面。
b.UV貼圖中的接縫和硬邊越少越好。
須要注意的是,圖形硬件須要處理頂點數並跟硬件報告說的並不同。不是硬件說能渲染幾個點就是幾個點。模型處理應用通展現的是幾何頂點數量。例如,一個由一些不一樣頂點構成的模型。在顯卡中,一些集合頂點將會被分離(split)成兩個或者更多邏輯頂點用做渲染。若是有法線、UV座標、頂點色的話,這個頂點必須會被分離。因此在遊戲中處理的實際數量顯然要多不少。
6.關於光照。
7.對GPU的優化——圖片壓縮和多重紋理格式。
圖片壓縮將下降你的圖片大小(更快地加載更小的內存跨度(footprint)),並且大大提升渲染表現。壓縮貼圖比起未壓縮的32位RGBA貼圖佔用內存帶寬少得多。以前U3D會議還據說過一個優化,貼圖儘可能都用一個大小的格式(512 * 512 , 1024 * 1024),這樣在內存之中能獲得更好的排序,而不會有內存之間空隙。這個是否真假沒獲得過測試。MIPMAPS(多重紋理格式):
http://docs.unity3d.com/Documentation/Components/class-Texture2D.html跟網頁上的略縮圖原理同樣,在3D遊戲中咱們爲遊戲的貼圖生成多重紋理貼圖,遠處顯示較小的物體用小的貼圖,顯示比較大的物體用精細的貼圖。這樣能更加有效的減小傳輸給GPU中的數據。
8.LOD 、 Per-Layer Cull Distances 、 Occlusion Culling
LOD (Level Of Detail) 是很經常使用的3D遊戲技術了,其功能理解起來則是至關於多重紋理貼圖。在以在屏幕中顯示模型大小的比例來判斷使用高或低層次的模型來減小對GPU的傳輸數據,和減小GPU所須要的頂點計算。攝像機分層距離剔除(Per-Layer Cull Distances):爲小物體標識層次,而後根據其距離主攝像機的距離判斷是否須要顯示。遮擋剔除(Occlusion Culling)其實就是當某個物體在攝像機前被另一個物體徹底擋住的狀況,擋住就不發送給GPU渲染,從而直接下降DRAW CALL。不過有些時候在CPU中計算其是否被擋住則會很耗計算,反而得不償失。
如下是這幾個優化技術的相關使用和介紹:
9.關於Realtime Shadows(實時陰影)
10.對GPU優化:採用高效的shader
a.須要注意的是有些(built-in)Shader是有mobile版本的,這些大大提升了頂點處理的性能。固然也會有一些限制。
b.本身寫的shader請注意複雜操做符計算,相似pow,exp,log,cos,sin,tan等都是很耗時的計算,最多隻用一次在每一個像素點的計算。不推薦你本身寫normalize,dot,inversesqart操做符,內置的確定比你寫的好。
c.須要警醒的是alpha test,這個很是耗時。
d.浮點類型運算:精度越低的浮點計算越快。
在CG/HLSL中--
float :32位浮點格式,適合頂點變換運算,但比較慢。
half:16位浮點格式,適合貼圖和UV座標計算,是highp類型計算的兩倍。
fixed: 10位浮點格式,適合顏色,光照,和其餘。是highp格式計算的四倍。
11.另外的相關優化: