Unity 常見優化方法

2021-09-28 21:23:05 字數 2557 閱讀 8823

在物體中使用更少的材質,把不同的紋理放到乙個更大的紋理圖集中。

使用更少導致物件被渲染多次的效果(如反射,陰影和畫素光)。

請注意,合併兩個不同材質的的物件無法提公升效能。需要多種材質的最常見原因是兩個mesh沒有共享相同紋理。為了優化cpu效能,請確保合併的所有物件共享相同紋理。

當在forward rendering path中使用多個畫素燈時,可能會出現合併物件沒有意義的情況。請參閱下面的光照效能部分,以了解如何管理它。

請注意,圖形硬體必須處理的頂點的實際數目通常與3d應用程式報告的數目不同。建模應用程式通常顯示組成模型的不同角點的數量(稱為幾何頂點數)。然而,對於乙個顯示卡,為了渲染的目的,一些幾何頂點需要被分割成兩個或更多的邏輯頂點。如果乙個頂點有多個法線、uv座標或頂點顏色,則必須對其進行分割。因此,unity中的頂點數通常高於3d應用程式給出的頂點數。

雖然模型中的幾何圖形數量主要與gpu相關,但unity中的一些功能也在cpu上處理模型(例如mesh skinning)。

使用壓縮紋理可以減小紋理的大小。這樣可以縮短載入時間,減少記憶體占用,並顯著提高渲染效能。 壓縮紋理僅使用未壓縮32位rgba紋理所需的一部分記憶體頻寬。

為3d場景中使用的紋理始終啟用generate mipmaps。mipmap紋理使gpu可以對較小的三角形使用較低解析度的紋理,這與紋理壓縮的方式類似。可以限制gpu渲染時傳輸的紋理資料量。如果當乙個texel(紋理畫素)被認為是1:1對映到渲染的螢幕畫素時,就不要啟用。比如ui元素或2d遊戲中的紋理。

可以手動優化著色器以減少計算和紋理讀取,以便在低端gpu機器上獲得良好的效能。例如,一些內建的unity著色器有mobile版本,它們更快,只是有一些限制。

浮點數精度在pc gpu中差異很小,但是對於移動端優化非常重要。

在可能的情況下,將計算從畫素著色器**移到頂點著色器**中,或者將它們完全移出著色器並在指令碼中設定值。

su***ce shaders非常適合編寫與燈光互動的著色器。然而它們的預設設定為了兼顧效果並不是效能最優的。調整這些特定的設定,可以使著色器執行更快或至少更小(去掉變種):

halfasview的specular shader更快。每個頂點計算並歸一化半向量(照明方向和檢視向量的中間部分),照明函式接收半向量作為引數而不是檢視向量。

noforwardadd使著色器在前向渲染中只支援乙個單向光。其餘的光仍然可以作為每個頂點光或球面諧波的影響。這使著色器更小,並確保它總是在乙個通道渲染,即使有多個燈。

noambient在著色器上禁用環境照明和球面諧光。這可以使效能稍微快一些。

在某些平台上(主要是ios和android裝置上的移動gpu),使用colormask去掉某些通道(如colormask rgb)可能會占用大量資源,因此只有在真正需要時才使用它。

可以使用簡單的技巧代替新增燈光到場景中。比如在shader中計算邊緣照明效果,而不是多打一盞補光。

在前向渲染中,逐畫素動態照明為每個受影響畫素增加了大量渲染工作,並可能導致物件被多次渲染。避免在移動或低端pc gpu上使用乙個以上的pixel light照亮單個物件。對於靜態物件應使用lightmap預渲染,而不是每幀計算光照。每個頂點的動態光照可以為頂點轉換增加大量的工作,所以盡量避免多個光照同時照射乙個物體的情況。

避免合併相距足夠遠的網格,以使其受到不同組的畫素光的影響。使用畫素照明時,每個網格必須渲染的次數與照亮畫素的次數相同。如果合併兩個相距很遠的網格,則會增加合併物件的有效尺寸。 在渲染期間會考慮所有照亮此合併物件任何部分的畫素光,因此會增加需要進行的渲染遍數。通常,渲染合併物件必須經過的次數是每個單獨物件的通過次數的總和,因此通過合併網格無法獲得任何效果。

在渲染期間,unity會找到網格周圍的所有燈光,並計算其中哪些燈光對網格的影響最大。 「quality"視窗上的設定用於修改最終有多少燈作為畫素燈,以及多少燈為頂點燈。每盞燈根據其距網格的距離和照明強度來計算其重要性。純粹從遊戲環境來看,某些燈比其他燈更重要。 因此,每個light都有乙個"render mode"設定,可以將其設定為"important"或"not important」。 標為"not important"的燈光具有較低的渲染開銷。

優化每個畫素的照明節省了cpu和gpu的工作:cpu有更少的繪製呼叫要做,gpu需要處理的頂點更少,需要對所有附加物件渲染進行柵格化的畫素也更少。

剔除物件是一種減少cpu和gpu負載的有效方法。

在不影響玩家體驗情況下,剔除遠距離的小物體。有以下幾種方法:

使用lod系統(level of detail)

手動設定相機上的每層剔除距離(per-layer culling distances)

使用camera.layerculldistances指令碼功能將小物體放到單獨的圖層中並設定每層的剔除距離

實時陰影有相當高的渲染開銷。任何投射陰影的物件首先必須被渲染到shadow map中,然後該shadow map被用來渲染可能接收陰影的物件。啟用實時陰影甚至比pixel/vertex光對效能的影響更大。

soft shadows比hard shadows有更大的渲染開銷,但這只影響gpu,並不會導致更多的cpu工作。

通過設定shadow distance來減少必須實時渲染的陰影數量。超出這個距離的陰影根據光照設定不渲染或者使用shadowmask渲染。

參考資料[[

[[

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

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

Unity 優化 渲染優化

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

SQL語句常見優化方法

在查詢語句前使用explain關鍵字 變體 explain extended select show warnings 檢視優化後的語句 方式一 select from a join b using 兩張表有相同的字段 方式二 select from a join b on 同 select fro...