乾貨!Unity 幾種優化建議
最簡單的優化建議:
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介紹: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更少的工作,需要減少可見物的數目:
a.合併相近的模型,手動在模型編輯器中合併或者使用UNITY的Draw call批處理達到相同效果(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,至於為什麼,檢視以下:
e.使用相關剔除數量直接減少Draw Call數量,下文有相關提及。
5.優化幾何模型
最基本的兩個優化準則:
a.不要有不必要的三角面。
b.UV貼圖中的接縫和硬邊越少越好。
需要注意的是,圖形硬體需要處理頂點數並跟硬體報告說的並不一樣。不是硬體說能渲染幾個點就是幾個點。模型處理應用通展示的是幾何頂點數量。例如,一個由一些不同頂點構成的模型。在顯示卡中,一些集合頂點將會被分離(split)成兩個或者更多邏輯頂點用作渲染。如果有法線、UV座標、頂點色的話,這個頂點必須會被分離。所以在遊戲中處理的實際數量顯然要多很多。
6.關於光照
若不用光肯定是最快的。移動端優化可以採用用光照貼圖(Lightmapping)去烘培一個靜態的貼圖,以代替每次的光照計算,在U3D中只需要非常短的時間則能生成。這個方法能大大提高效率,而且有著更好的表現效果(平滑過渡處理,還有附加陰影等)。
在移動裝置上和低端電腦上儘量不要在場景中用真光,用光照貼圖。這個方法大大節省了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中計算其是否被擋住則會很耗計算,反而得不償失。
以下是這幾個優化技術的相關使用和介紹:
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格式計算的四倍。
相關推薦
乾貨!Unity 幾種優化建議
最簡單的優化建議: 1.PC平臺的話保持場景中顯示的頂點數少於200K~3M,移動裝置的話少於10W,一切取決於你的目標GPU與CPU。 2.如果你用U3D自帶的SHADER,在表現不差的情況下選擇Mobile或Unlit目錄下的。它們更高效。 3.儘可能共用材質。 4
Unity 幾種優化建議
最簡單的優化建議: 1.PC平臺的話保持場景中顯示的頂點數少於200K~3M,移動裝置的話少於10W,一切取決於你的目標GPU與CPU。 2.如果你用U3D自帶的SHADER,在表現不差的情況下選擇Mobile或Unlit目錄下的。它們更高效。 3.儘可能共用材質。 4
注意!這幾種行為影響網站優化的效果
一般情況下,日誌功能,可以對網站所有的改動進行跟蹤,而不是僅僅只對於優化的意圖,網站修改工作這麼簡單而已。實際上很多的企業會做一些,他們以為不會對網站產生任何影響的優化改動,但是卻總是因為這樣的一些行為造成很大的影響跟麻煩。所以下面就跟小編一起來看一看,到底哪些行為會對網站的
java併發之----簡要介紹java對鎖的幾種優化
引言 新版本java對鎖的實現引進了許多技術進行優化,如偏向鎖、輕量級鎖、自旋鎖、適應性自旋鎖、鎖消除、鎖粗化等 鎖主要存在四種狀態,依次是:無鎖狀態、偏向鎖狀態、輕量級鎖狀態、重量級鎖狀態,他們會隨著競爭的激烈而逐漸升級。注意鎖可以升級不可降級,這種策略是為了提高獲得鎖和釋放鎖的效率。
非線性優化-幾種優化方法的比較(1)
我們每個人都會在我們的生活或者工作中遇到各種各樣的最優化問題,比如每個企業和個人都要考慮的一個問題“在一定成本下,如何使利潤最大化”等。最優化方法是一種數學方法,它是研究在給定約束之下如何尋求某些因素(的量),以使某一(或某些)指標達到最優的一些學科的總稱。隨著學習的深入,博
常見的幾種優化方法
常見的幾種最優化方法 1. 梯度下降法(Gradient Descent) 梯度下降法是最早最簡單,也是最為常用的最優化方法。梯度下降法實現簡單,當目標函式是凸函式時,梯度下降法的解是
rsync的幾種優化應用方案
rsync是用來做檔案同步的一個很好的工具,傳統的rsync就是使兩個目錄的檔案保持一致,但隨著檔案數量增多,rsync會造成同步緩慢,系統負載比較高,直至系統宕機。 為了解決檔案增多導致rsync變慢的問題,方案是很多的。 1、使源目錄儲存較少檔案
Unity幾種常用的設計模式
1、單例模式:某個類只能有一個例項,單例非常重要,比如我需要管理遊戲的UI,現在我要關閉某個頁面,頁面上可能開啟很多子視窗也需要一起關閉,這時候用一個單例來統一管理就很好解決這個問題。單例模式一般都是xxxController、xxxManager等,可以這麼寫。 publ
機器學習中常見的幾種優化方法
我們每個人都會在我們的生活或者工作中遇到各種各樣的最優化問題,比如每個企業和個人都要考慮的一個問題“在一定成本下,如何使利潤最大化”等。最優化方法是一種數學方法,它是研究在給定約束之下如何尋求某些因素(的量),以使某一(或某些)指標達到最優的一些學科的總稱。隨著學習的深入,博主越來越發現最優化方法的重
Caffe原始碼-幾種優化演算法
SGD簡介 caffe中的SGDSolver類中實現了帶動量的梯度下降法,其原理如下,$lr$為學習率,$m$為動量引數。 計算新的動量:history_data = local_rate * param_diff + momentum * history_data $\nu_{t+1}=lr\nabla_
以下幾種情況,建議你趁早辭職!
當你在公司或者專案中出現以下情況之一的時候: * 每天維護同一套業務程式碼 * 每天無難事可做,都是手到擒來的事 * 只發佈下程式碼或者寫寫工作文件 * 每天上班像上墳,毫無短期或長期目標 別猶豫,你該辭職了! 看起來很主觀是吧,還有人問了,這不是好事嗎,每天拿錢,還沒
Andorid中幾種簡單又常見的ListView的優化方案!
Android中的ListView應該算是佈局中幾種最常用的元件之一了,使用也十分方便,下面將介紹ListView幾種比較常見的優化方法: 首先我們給出一個沒有任何優化的Listview的Adapter類,我們這裡都繼承自BaseAdapter,這裡我們使用一個包含10
ASP.NET MVC 提高運行速度的幾種性能優化方法
服務 排隊 等待 谷歌搜索 部署 lan str run 提高 主要介紹ASP.NETMVC 應用提速的六種方法,因為沒有人喜歡等待,所以介紹幾種常用的優化方法。 大家可能會遇到排隊等待,遇到紅燈要等待,開個網頁要等待,等等等。 理所當然,沒有人喜歡等待網頁慢吞吞地加載
【巨坑】springmvc 輸出json格式數據的幾種方式!
mapping cep process 添加 exc 文件中 != style find 最近公司項目需要發布一些數據服務,從設計到實現兩天就弄完了,心中竊喜之。 結果臨近部署時突然發現。。。。。 服務輸出的JSON 數據中 date 類型數據輸出格式要麽是時間戳,要麽
逆向知識第六講,取摸優化的幾種方式
ebp 有符號 基本 什麽是 說了 xxx 個數 color 常量 逆向知識第六講,取摸優化的幾種方式 除法講完之後,直接開始講 % 運算符在匯編中表現形式 首先C的高級代碼貼上來. 高級代碼: // Tedy.cpp : Defines the en
Unity開發-你必須知道的優化建議
instant material asp renderer setting .text 屏幕 格式 coord 轉載;http://blog.csdn.net/leonwei/article/details/18042603 最近研究U3D開發,個人認為,精通一種新
幾種常見的優化算法
曲面 很大的 例子 div height 多個 滿足 設計 asi 我們每個人都會在我們的生活或者工作中遇到各種各樣的最優化問題,比如每個企業和個人都要考慮的一個問題“在一定成本下,如何使利潤最大化”等。最優化方法是一種數學方法,它是研究在給定約束之下如何尋求某些因素(的
mysql數據庫優化的幾種方法
myisam prim ant from 之間 全文索引 響應 edi 大數 1、選取最適用的字段屬性 MySQL可以很好的支持大數據量的存取,但是一般說來,數據庫中的表越小,在它上面執行的查詢也就會越快。因此,在創建表的時候,為了獲得更好的性能,我們可以將表中字段的寬度
適合小白用的css幾種睡在中間(居中)的方式!!!
HTML css css3. javascript 初學者 平常小白最討厭的事情就是css為什麽沒有辦法居中,現在小狐貍為大家整理幾種方式,請廣大人民群眾笑納!!! 吐舌頭 1水平居中1.1 內聯元素水平居中利用 text-align: center 可以實現在塊級元素內部的內聯元素水平居
適合小白用的css幾種睡在中間的方式!!!
css html h5 js 平常小白最討厭的事情就是css為什麽沒有辦法居中,現在小狐貍為大家整理幾種方式,請廣大人民群眾笑納!!! 吐舌頭 1水平居中 1.1 內聯元素水平居中 利用 text-align: center 可以實現在塊級元素內部的內聯元素水平居中。此方法對內聯元素(inli