Unity 性能優化總結(適合初學者)

性能優化

引言: 本篇博客總結了一些常用的性能優化方法,希望能幫到和我一樣在開發道路上前進的童鞋們!在此,需要感謝CSDN、簡書的一些博主,泰課、Siki學院和B站的一些老師們。
開發版本: Unity 2017

1. 前提

Mono虛擬機

Mono可以實現強大的跨平臺功能,Unity打包時會將Mono一起打包進來,所以哪怕空場景打包,安裝包也會有二三十兆的大小。

DrawCall

Draw Call,就是CPU對圖形繪製接口的調用,CPU通過調用圖形庫(DirectX/OpenGL)接口,命令GPU進行渲染操作。
因爲每次繪製時,CPU都需要調用DrawCall,而每個DrawCall都需要很多準備工作,檢測渲染狀態,提交渲染數據,提交渲染狀態等,而GPU本身具有很強大的計算能力,可以很快處理完渲染任務。 但是當DrawCall過多時,CPU就會產生很多額外的開銷用於準備工作,CPU就可能處於負載狀態。

知乎Unity遊戲開發雜談之走近DrawCall

Unity Profiler

Profiler是用來分析遊戲運行性能,內存使用等情況的工具,可以準確定位到影響遊戲性能的腳本方法,內存過高的資源等等。可以在Window菜單中打開。

Unity Statistics

Statistics面板
Statistics是unity的渲染統計窗口,可以快速瞭解當前場景中關於聲音、圖形渲染、網絡狀況等多種統計信息

  • FPS:每秒傳輸幀數(Frames Per Second),表示引擎渲染一個遊戲幀所需要的時間,主要受到場景中渲染物體數量和GPU性能的影響,遊戲畫面每秒幀數至少要保證在30以上,後面括號中的5.2ms(1S = 1000ms)是指處理一幀需要的時間
  • CPU:獲取到當前佔用CPU進行計算的時間絕對值,和時間點。如果主進程處於掛斷或休眠的狀態時,CPU time將會保持不變
  • Render thread:GPU渲染線程處理圖像所花費的時間,具體數值由GPU的性能決定
  • Batches:是Unity內置的Draw Call Batching技術。引擎每對一個物體進行一次DrawCall,就會產生一個Batch,Batch中包含了該物體的所有網格和頂點數據。當渲染另一個相同的物體時,引擎會直接調用Batch裏的信息,將相關的頂點數據直接送到GPU,從而讓渲染過程更加高效,即Batching技術是將所有材質相近的物體進行合併渲染。
  • Tris、Verts:指攝像機視野範圍內的三角面數量和頂點數量,即Camera中的fieldOfView所有取值下的Tris和Verts,即使在game視圖中看不到,但只要在這個範圍內,都會被渲染。而且哪怕某個模型上只有一個頂點在範圍內,整個模型都要被渲染出來
  • Screen:表示當前屏幕分辨率的大小,後面的值表示總內存的使用數值
  • Setpass Calls:每當GPU運行一個Pass之前,就會產生一個“SetPass Call”,可以用來描述渲染性能的開銷
  • Shadow Casters:表示場景中有多少可以投射陰影的物體,一般這些物體都作爲場景中的光源
  • Visible Skinned Meshed:渲染皮膚網格的數量
  • Animations:表示正在播放的動畫數量

2. 資源優化

移動端優化標準

  • 模型單位統一
  • 相機視野內渲染模型面數或頂點數必須小於15萬
  • 場景中燈光光源數量需要控制在50個以內
  • 場景中粒子數量控制在50個以內
  • 儘量使用效率較高的Shader,不要使用涉及反射,屏幕UV座標,屏幕後處理的Shader
  • 單個模型材質數小於3個
  • 貼圖實際尺寸小於1024,根據實際情況選擇大小
  • 長時間音樂(背景音樂)壓縮格式 mp3
  • 短時間音樂(音效)非壓縮格式 wav ogg
  • 減少冗餘資源和重複資源,不同目錄下的相同資源,如果都被引用,那麼都會被打進包中

模型、貼圖優化

  • 儘可能減少模型中三角形的數目
  • 儘可能合併頂點
  • 合理合併網格
  • 合理合併貼圖
  • 使用插件Mesh Beaker

地形

儘量選擇使用常規網格地形,而非Unity的地形系統
默認的Unity地形系統性能不佳,會產生數百個額外的Draw Call和上千個分佈糟糕的多邊形,而常規網格可以按照需求。爲默認的地形系統編寫着色器受限。

資源監測與分析

UWA資源監測與分析

3. 渲染優化

CPU/GPU分工

  • CPU負責邏輯運算、數值處理等
  • GPU負責場景渲染、燈光處理等

    CPU和GPU採用渲染流水線的方式進行並行工作和交互,兩者相互獨立互不依賴。

批處理

Unity中有兩種批處理的方式,分別是動態批處理和靜態批處理。

  1. 動態批處理是Unity自動完成的。不需要我們自己操作,但是有很多限制,一不小心破壞,就能導致Unity無法處理使用相同材質的物體。
    動態批處理條件如下:
  • 使用同一種材質的物體
  • 頂點數量小於900
  • 所以使用相同材質的對象必須使用同一個縮放尺寸
  • 使用LightMap的物體不會批處理
  • 使用過多Pass的shader的對象會中斷批處理
  • 接受實時陰影的對象也不會批處理

所以是否能動態批處理,隨緣吧~

  1. 靜態批處理,自由度高,限制少,但不能移動。
    只需要勾選物體的Static屬性即可,Unity在運行的時候會合並所有標識爲“Static”的物體。

LOD

層次細節(Leves of Detail)是根據物體在遊戲中所佔視圖的百分比來調節不同複雜度模型的。當攝像機距離某物體較遠的時候,採用低模,當攝像機距離較近的時候,採用高模。可有優化遊戲渲染效率,但會佔用更多的內存。

  1. 添加LOD Group組件
    LOD Group組件
  2. 將高精度,中等精度,低精度的模型,拖拽到組件的各個級別上。LOD 0對用高精度模型,LOD 1對應中等精度,LOD 2對應低精度。
  3. 添加模型後會出現彈框,提示是否設置爲子物體,點擊YES
    彈框
  4. 拖動組件上的小攝像機可以進行遠近的觀察,並且距離的區間可以根據實際情況調節
    小攝像機

Occlusion Culling

遮擋剔除(Occlusion Culling)在對象被其他靜態物體遮擋,攝像機無法看到的時候,禁用對象的渲染。遮擋剔除和視椎體剔除(Frustum Culling)不同,視椎體剔除只禁用攝像機視野外的對象渲染,不會禁用視野內被遮擋對象的渲染。在使用遮擋剔除的時候,任然受益於視椎體剔除。

  • 未開啓遮擋剔除的場景渲染效果
    未開啓遮擋剔除
  • 開啓遮擋剔除的場景渲染效果,可以發現不在視野內和被遮擋的物體被禁用渲染
    開啓遮擋剔除
    步驟:
  1. 將場景中需要實現遮擋剔除的物體都勾選Occluder Static
    勾選Occluder Static
  2. 打開Occlusion Culling面板,點擊Bake按鈕
    在這裏插入圖片描述
  3. 在大場景中,爲了能更好使用遮擋剔除的功能,應該將物體合理分離,不要將大量模型合併成一個物體。例如,單個屋頂,單個椅子,單面牆,單個房間等,一個整體作爲一個對象,不能分離的太細碎
  4. 後期添加新的物體,需要重新烘培

Lightmapping

實時光照對於移動平臺是個非常昂貴的操作。如果只有一個平行光還好,但如果場景中包含了太多光源並且使用了很多多Passes的shader,那麼很有可能會造成性能下降。燈光貼圖技術可以預先計算場景中的燈光信息,並且生成燈光貼圖

  1. 在物體面板中將要烘培光照貼圖的物體設置爲LightMap Static,這樣Unity就會知道哪些物體是需要被烘培的
    Static
  2. 將場景中的燈光的Mode設置爲Baked
    設置爲Baked
  3. Window > Lighting > Settings打開Lighting面板,取消勾選Auto Generate,點擊Bake按鈕
  4. 等待編輯器底部狀態欄右側的精度條結束時,說明烘焙完成,可以將場景中的燈光都禁用了

合併Mesh

將多個模型合併成一個物體

  • 提高運行性能
  • 統一材質,創建統一的材質,方便控制、分配所有物體
  • 方便控制人物動畫,將不同衣服、武器、褲子、人物骨架等結合成一個物體,再由同一個骨架控制運動,就能實現不同組合角色,卻可以做一樣的動作

Mesh Beaker
簡介:用於合併網格、貼圖,將場景中細碎的模型合併,可以有效提高性能
基礎操作:

  1. GameObject->CreateOther->MeshBaker->Mesh And MaterialBaker 創建MeshBeaker對象
  2. 點擊Open Tools For Adding Objects
  3. 選中需要合併的物體,點擊Add Selected Meshes,注意需要合併的物體材質必須使用相同的Shader
  4. MeshBaker0的ObjectsToBeCombined裏就是剛纔選擇的物體,當然,自己手動拖進去也是可以的
    ObjectsToBeCombined
  5. 接下來點擊CreateEmptyAssetsForCombinedMaterial,主要是用來儲存合併材質和合並信息的
  6. 點擊Bake Materials Into Combined Material
  7. 等待操作完成後,選擇子物體,點擊Bake生成一個 CombinedMesh-MeshBaker0-mesh 的對象,
    然後點擊Disable Renderers on Source Objects,可以隱藏原來物體的Render組件
    隱藏原來物體

    MeshBeaker的基礎使用

4. 其他優化

優化工具:Amplify Impostors

簡介

  • Amplify Impostors是一種一鍵式解決方案,可以極大的減少你的多邊形面數和DrawCall的調用次數。使用這種技術的目的就是爲了能夠使用非常低的多邊形數來表示遙遠的物體,例如:樹木、灌木叢、岩石、遺蹟、建築物等。
  • Impostors(冒牌者)是面向攝像機的扁平的四邊形,或者是簡單的多邊形形狀。通過渲染一個原始資源的虛假替代品,來替換複雜的高多邊形對象,可以在運行時進行編輯或者創建。目前只支持在編輯器狀態下烘焙對象,之後會添加實時生成的功能。
  • Impostors在運行時,可以移動、旋轉、縮放,並且可以接受和投放陰影,甚至可以和其他對象或Impostor交互。Impostors可以直接和LOD或第三方的LOD系統搭配使用,可以在近距離顯示實際的網格,一定的距離使用Impostor。

    地址:百度雲下載地址

    密碼:2lz0

    注意:支持Unity 2017.1或者更高版本,商用請到Asset Store購買

快速上手

  1. 選擇場景中的遊戲對象或者項目中的預製體
  2. 爲你選擇的對象在Inspector窗口添加“Amplify Impostor”組件
  3. 點擊“Bake Impostor”按鈕,並且選擇你想要保存Impostor Asset的文件夾

The Inspector
AmplifyImpostorAsset

  • Impostor Asset:這是對AmplifyImpostorAsset的引用,如果您有多個相同對象的Impostor,可以共享該數據
  • LOD Group:當添加LOD組件時,會自動賦值
  • References:這是被用於烘焙Impostor的對象引用
  • +:打開文件夾,創建一個Impostor Asset並且自動賦值給組件
  • Bake Impostor:依據當前的數據和路徑來烘焙Impostor

當Impostor Asset賦予到該組件時,你可以配置高級烘焙設置

  • Bake Type:以效果對比來說 Spherical < Octahedron < HemiOctahedron
  • Texture Size:設置烘焙圖像的紋理大小
  • Axis Frames:每個軸向的幀數,如果值爲16,則代表對於一個Impostor有256(16*16)個不同的攝像機,幀數越大,效果越好,當然數據量也越大
  • Pixel Padding:設置圖像邊緣像素溢出的大小
  • Billboard Mesh:設置更適合的形狀
  • Max Vertices:設置最大頂點數
  • Outline Tolerance:允許頂點更加貼合形狀
  • Normal Scale:根據形狀的法線,展開頂點。當值爲1時,可以快速生成四邊形
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章