Unity 幾種優化建議

2021-08-12 00:11:34 字數 4129 閱讀 6838

最簡單的優化建議:

1.pc平台的話保持場景中顯示的頂點數少於200k~3m,移動裝置的話少於10w,一切取決於你的目標gpu與cpu。

2.如果你用u3d自帶的shader,在表現不差的情況下選擇mobile或unlit目錄下的。它們更高效。

3.盡可能共用材質。

4.將不需要移動的物體設為static,讓引擎可以進行其批處理。

5.盡可能不用燈光。

6.動態燈光更加不要了。

7.嘗試用壓縮貼圖格式,或用16位代替32位。

8.如果不需要別用霧效(fog)

9.嘗試用occlusionculling,在房間過道多遮擋物體多的場景非常有用。若不當反而會增加負擔。

10.用天空盒去「褪去」遠處的物體。

11.shader中用貼圖混合的方式去代替多重通道計算。

12.shader中注意float/half/fixed的使用。

13.shader中不要用複雜的計算pow,sin,cos,tan,log等。

14.shader中越少fragment越好。

15.注意是否有多餘的動畫指令碼,模型自動匯入到u3d會有動畫指令碼,大量的話會嚴重影響消耗cpu計算。

16.注意碰撞體的碰撞層,不必要的碰撞檢測請捨去。

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介紹:

需要注意的是:

在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更少的工作,需要減少可見物的數目:

draw call batching : 

b.在專案中使用更少的材質(material),將幾個分開的貼圖合成乙個較大的圖集等方式處理。

如果你需要通過指令碼來控制單個材質屬性,需要注意改變renderer.material將會造成乙份材質的拷貝。因此,你應該使用renderer.sharedmaterial來保證材質的共享狀態。

有乙個合併模型材質不錯的外掛程式叫mesh baker,大家可以考慮試下。

c.盡量少用一些渲染步驟,例如reflections,shadows,per-pixel light 等。

d.draw call batching的合併物體,會使每個物體(合併後的物體)至少有幾百個三角面。

假設合併的兩個物體(手動合併)但不共享材質,不會有效能表現上的提公升。多材質的物體相當於兩個物體不用乙個貼圖。所以,為了提公升cpu的效能,你應該確保這些物體使用同樣的貼圖。

另外,用燈光將會取消(break)引擎的draw call batch,至於為什麼,檢視以下:

forward rendering path details:

e.使用相關剔除數量直接減少draw call數量,下文有相關提及。

5.優化幾何模型

最基本的兩個優化準則:

a.不要有不必要的三角面。

b.uv貼圖中的接縫和硬邊越少越好。

需要注意的是,圖形硬體需要處理頂點數並跟硬體報告說的並不一樣。不是硬體說能渲染幾個點就是幾個點。模型處理應用通展示的是幾何頂點數量。例如,乙個由一些不同頂點構成的模型。在顯示卡中,一些集合頂點將會被分離(split)成兩個或者更多邏輯頂點用作渲染。如果有法線、uv座標、頂點色的話,這個頂點必須會被分離。所以在遊戲中處理的實際數量顯然要多很多。

6.關於光照

在移動裝置上和低端電腦上盡量不要在場景中用真光,用光照貼圖。這個方法大大節省了cpu和gpu的計算,cpu得到了更少的drawcall,gpu則需要更少頂點處理和畫素柵格化。

7.對gpu的優化——壓縮和多重紋理格式

compressed textures(壓縮):

壓縮將降低你的大小(更快地載入更小的記憶體跨度(footprint)),而且大大提高渲染表現。壓縮貼圖比起未壓縮的32位rgba貼圖占用記憶體頻寬少得多。

之前u3d會議還聽說過乙個優化,貼圖盡量都用乙個大小的格式(512 * 512 , 1024 * 1024),這樣在記憶體之中能得到更好的排序,而不會有記憶體之間空隙。這個是否真假沒得到過測試。

mipmaps(多重紋理格式):

跟網頁上的略縮圖原理一樣,在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中計算其是否被擋住則會很耗計算,反而得不償失。

以下是這幾個優化技術的相關使用和介紹:

level of detail :

per-layer cull distances :

occlusion culling :

9.關於realtime shadows(實時陰影)

實時陰影技術非常棒,但消耗大量計算。為gpu和cpu都帶來了昂貴的負擔,細節的話參考下面:

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格式計算的四倍。

RabbitMQ的幾種工作模式和優化建議

1.broker 它提供一種傳輸服務,它的角色就是維護一條從生產者到消費者的路線,保證資料能按照指定的方式進行傳輸,2.exchange 訊息交換機,它指定訊息按什麼規則,路由到哪個佇列。3.queue 訊息的載體,每個訊息都會被投到乙個或多個佇列。4.binding 繫結,它的作用就是把excha...

Unity優化 Unity優化技巧高階開篇

所謂的優化,目的應該是盡可能減弱某種消耗,而在unity上來說,大概可以分為以下幾種 程式的執行速度,一般是指執行幀率,也包括載入速度。是我們首要考慮的重點,也是將會花最多的精力去 的話題,執行幀率是遊戲類專案的乙個非常重要的效能指標,幀率的下降將直接導致遊戲體驗的下降。程式的資源消耗,一般是指包體...

Unity 優化 渲染優化

渲染優化主要是減少gpu的壓力。1 透明效果 overdraw就是過度繪製,是指在一幀的時間內 16.67ms 畫素被繪製了多次,理論上乙個畫素每次只繪製一次是最優的,但是由於重疊的布局導致一些畫素會被多次繪製,而每次繪製都會對應到cpu的一組繪圖命令和gpu的一些操作,當這個操作耗時超過16.67...