Unity 性能優化經驗整理

優化思路

我的優化原則:
三原則:
注意細節、注意細節、注意細節!html

優化手段:
1.減小總量
2.空間、時間互換
3.由淺入深c#

1.減小總量:
儘可能減小內存和CPU佔用的總量。segmentfault

2.空間、時間互換:
內存和CPU能夠互換、CPU和GPU能夠互換。緩存

3.由淺入深:
先優化小的細節再優化大的結構。性能優化

大體手段:
1.降CPU
2.降內存
3.內存換CPU
4.CPU換內存
5.GPU換CPU
6.磁盤換內存app

優化思路說明:
儘可能減小佔用的內存(資源體積)和CPU(計算量),是一切的前提,首先着重減小總量才能更好的進行後續細節的優化。
因爲內存比CPU便宜多了,因此通常都是內存換CPU的,內存不夠時再用CPU換內存。
好比利用對象池緩存對象,能夠省略加載資源、實例化、銷燬實例、卸載資源的步驟,能夠明顯下降CPU的消耗。
利用Loading進度條按需加載資源,能夠減小內存峯值,大量節約內存。框架

一般來講先優化細節,若是細節優化已經作的很好,沒什麼太多潛力能夠挖了,性能仍是消耗太大,那麼就須要考慮重構結構了。異步

性能分析:
使用Profiler性能分析器首先肯定性能瓶頸出如今哪裏,定位性能問題出現的根本緣由,按照具體緣由去作優化。
一般來講,性能問題大體出如今兩個方面:
1.細節不夠好(資源問題、插件問題、代碼寫法問題)
2.結構不夠好(框架問題、底層API問題)性能

細節問題解決成本低,能夠獨立調整,對其餘部分影響小,能夠批量解決。
結構問題解決成本高,牽一髮動全身,對其餘部分影響大,須要大修、大測。
因爲遊戲總體是由各個細節組成的,因此當細節作的不夠好時,總體也會顯現出問題。
反之當結構不夠好時,細節即便作的很好,遊戲總體表現出的性能也不會太好,二者是相輔相成的。
個人建議是:用嚴格認真的態度控制細節,用豐富的經驗積累出可靠的結構。
前者靠態度,後者靠經驗。當咱們經驗很少時,應該依靠態度嚴控細節,當咱們經驗足夠時,兩方面都要兼顧。學習

多讀官方API:
多讀官方API,多讀官方API多,讀官方API。重要的事情說三遍,不要重複造輪子。Unity中有不少性能細節問題都出如今功能不熟悉上,沒玩明白致使的,熟悉官方API可讓咱們事半功倍。C#代碼也同樣,也要熟悉C#官方API。

優化內存

Unity中 資源佔用的內存量比代碼高的多,只要代碼不往死掉寫,通常不會佔用過高內存,咱們要特別注意資源的內存佔用。
Unity資源內存佔用排行榜
1.貼圖 Textures
2.動畫 AnimationClips
3.網格 Meshes
4.音頻 AudioClips
5.材質 Materials

資源內存佔用說明:

名稱 單個體積 同時使用數量 整體內存佔用 內存佔用說明
貼圖 不少 很大 佔用超級大戶 遠超其餘資源(超級土豪VIP熟客 需重點關照 利潤大)
動畫 佔用大戶 時間越長 關鍵點越多體積越大(普通顧客 認真對待 利潤中)
網格 佔用中等 和精細度有關 通常內存問題不會出如今它身上(普通遊客 利潤小)
音頻 佔用大 壓縮比高 ogg加進內存後 體積增大10倍(土豪遊客 出現一次狠宰)
材質 很小 很小 佔用很小 數量也少 (鄰居 別期望從它身上賺錢了)

1.減小貼圖佔用內存
內存佔用超級大戶,史前怪獸級別的,要優化內存先從優化貼圖格式開始。
按照下面3步設置,能夠極大下降貼圖佔用內存。
1.下降分辨率
2.拆分透明通道
3.調整壓縮格式
4.禁用Mipmap
5.啓用Use Crunch Compression

1.下降分辨率(Max Size):

根據Game攝像機距離物體最近時,物體所佔的像素大小(QQ截圖),來肯定最大分辨率。
通常美工或Asset Store上下載的資源極可能是高清資源,1024x102四、2048x2048或更大,咱們須要根據實際使用的尺寸肯定。
2048x2048下降爲1024x1024後 內存會下降爲原來的1/4 極大下降內存佔用 這裏是是大頭 要控制好。
(圖片大小和像素有關 像素點數=寬x高=面積 寬高各變爲1/2 面積變爲1/4)

2.拆分透明通道(Alpha):

不須要Alpha通道的必定要去除Alpha通道 由於帶Alpha通道的貼圖 Unity會默認選擇RGBA格式。
若是不能剔除Alpha 要把format由RGBA格式選爲RGB格式 以減少內存佔用。
非漸變的透明貼圖 能夠調成RGB + 1bit alpha的格式 拆分alpha通道。
(RGBA通常各通道是平均分 每份1/4 剔除一個通道 體積減小1/4)

3.調整壓縮格式(Compression):

儘可能選用當前平臺支持的最高壓縮格式,不要輕易使用RGBA32格式,更不要使用不壓縮格式,內存天差地別。
只要啓用Compression選項,Unity會自動幫咱們選用合適的壓縮格式 要注意的是壓縮格式的支持都是有條件限制的。
當不能使用更好的壓縮格式時,Unity會出現提示,告訴咱們哪裏有問題。對於壓縮格式:通常要注意如下兩個問題。
(1)不須要Alpha透明通道的貼圖 請在PS裏剔除。
(2)高壓縮比格式要求圖片寬高是2的倍數(4的倍數更好) 寬高不能被2整除,會致使不能用高壓縮比的格式。
寬高禁止出現奇數,必須都是偶數,打成圖集的圖片是2的倍數便可,單獨使用的圖片寬高要是4的倍數。

以一張512x512分辨率的圖片爲基準 測試不一樣平臺 不一樣壓縮格式佔用的內存:

PC經常使用圖片格式:DXT

圖片格式 512x512(啓用Mipmap) 1024x1024(啓用Mipmap) 圖片質量 內存(壓縮比) 說明
RGBA 32 bit 1M(1.3M) 4 M(5.3M) 最高 最大(1) 透明高清無壓縮 最靠後選擇
ARGB 16 bit 0.5M(0.7M) 2 M(2.7M) 中(1/2) RGBA32閹割版 靠後選擇
RGB(A) BC7 256KB(341.4KB) 1M(1.3M) 中高 小(1/4) 透明高清高壓縮 次優先選擇
RGBA DXT5 256KB(341.4KB) 1M(1.3M) 小(1/4) 透明中清高壓縮 最優先選擇
RGB 24 bit 0.8M(1M) 3M(4M) 很大(3/4) 不透明高清無壓縮 最靠後選擇
RGB 16 bit 0.5M(0.7M) 2M(2.7M) 中(1/2) RGB24閹割版 靠後選擇
RGB DXT1 128KB(170.7KB) 0.5M(0.7M) 很小(1/8) 不透明中清高壓縮 最優先選擇

RGB(A) BC7:高質量高壓縮格式 可是mac上不兼容

Android經常使用圖片格式:ETC

圖片格式 512x512(啓用Mipmap) 1024x1024(啓用Mipmap) 圖片質量 內存(壓縮比) 說明
RGBA 32 bit 1M(1.3M) 4 MB(5.3M) 最高 最大(1) 透明高清無壓縮 最靠後選擇
ARGB 16 bit 0.5M(0.7M) 2 MB(2.7M) 中(1/2) RGBA32閹割版 靠後選擇
RGBA ETC2 8 bits 256KB(341.4KB) 1 MB(1.3M) 小(1/4) 透明中清高壓縮 最優先選擇
RGB 24 bit 0.8M(1M) 3M(4M) 很大(3/4) 不透明高清無壓縮 最靠後選擇
RGB 16 bit 0.5M(0.7M) 2M(2.7M) 中(1/2) RGB24閹割版 靠後選擇
RGB ETC2 4 bits 128KB(170.7KB) 0.5M(0.7M) 很小(1/8) 不透明中清高壓縮 最優先選擇
RGB ETC 4 bits 128KB(170.7KB) 0.5M(0.7M) 很小(1/8) 不透明中清高壓縮 次優選擇

IOS平臺經常使用圖片格式:PVRTC

圖片格式 512x512(啓用Mipmap) 1024x1024(啓用Mipmap) 圖片質量 內存(壓縮比) 說明
RGBA 32 bit 1M(1.3M) 4 MB(5.3M) 最高 最大(1) 透明高清無壓縮 最靠後選擇
ARGB 16 bit 0.5M(0.7M) 2 MB(2.7M) 中(1/2) RGBA32閹割版 靠後選擇
RGBA PVRTC 4 bits 128KB(170.8KB) 0.5M(0.7M) 很小(1/8) 透明低清高壓縮 最優先選擇
RGBA ASTC 6x6 block 115.6KB(154.7KB) 456.9KB(0.6M) 很小(~1/8) 透明中清高壓縮 iPhone6以後首選
RGB 24 bit 0.8M(1M) 3M(4M) 很大(3/4) 不透明高清無壓縮 最靠後選擇
RGB 16 bit 0.5M(0.7M) 2M(2.7M) 中(1/2) RGB24閹割版 靠後選擇
RGB PVRTC 4 bits 128KB(170.8KB) 0.5M(0.7M) 很小(1/8) 不透明低清高壓縮 最優先選擇
RGB ASTC 6x6 block 115.6KB(154.7KB) 456.9KB(0.6M) 很小(~1/8) 透明中清高壓縮 iPhone6以後首選

PVRTC:IOS原生支持的一種壓縮格式 優勢是:高壓縮比 兼容性好 缺點是:有損壓縮 圖片質量較差,對於透明像素的邊緣和漸變的透明度有特別明顯的失真。
ASTC :IOS支持的一種新的壓縮格式 優勢是:比PVRTC更高的壓縮比和質量,透明貼圖質量更高 缺點是:兼容性差 iPhone6纔開始支持該格式,iPhone5和以前不支持該格式。

參考資料:
《乾貨:Unity遊戲開發圖片紋理壓縮方案》https://www.jianshu.com/p/f7c...
《Unity3D的圖片壓縮格式詳解》https://www.jianshu.com/p/bec...
《Unity3D~紋理格式》https://www.cnblogs.com/rayya...
《Unity中一個簡單的圖形優化指導》http://gad.qq.com/program/tra...

4.禁用Mipmap

Mipmap至關於Texture的LOD 啓用後會生成多級紋理 會佔用更多的內存 好處是會讓貼圖看起來更平滑。
啓用該選項會生成多級小貼圖 內存會增長1/3。

5.啓用Use Crunch Compression

Crunch是Unity支持的最新壓縮格式,壓縮比很是高,若是你用其餘格式,圖片依然很大的話,這個格式將會成爲你的神兵利器。
Crunch支持Android和IOS平臺,能把圖片壓的很小,但圖片質量有損失,能夠經過調節質量百分比來解決。
Crunch在Editor下,計算壓縮的時間很長,77張2048的圖片要壓縮5~8分鐘左右。
對於大量貼圖的更新來講,整個團隊的開發人員都要消耗至關長的時間來導入貼圖,十分痛苦 很容易拉仇恨(說的就是我本身)。

參考資料:
《Unity性能優化以內存-貼圖格式優化》https://segmentfault.com/a/11...
《Unity優化(一):圖形優化》https://gameinstitute.qq.com/...
《[Unity優化] unity圖片mipmap》https://www.jianshu.com/p/651...
《Unity 2017.3 中的Crunch紋理壓縮庫》https://www.sohu.com/a/204935...
《Unity官方文檔Texture》https://docs.unity3d.com/Manu...

2.減小動畫佔用內存
總結一下優化動畫的手段:
1.減少動畫長度
2.減小骨骼數量
3.減小關鍵幀密度
4.減小動畫精度

1.減少動畫長度:
有些動畫實際使用的的長度,遠小於動畫時長,若是有被加快使用的動畫,應該考慮改短動畫,下降大小,Animator里加快速度不會減小動畫大小。

2.減小骨骼數量:
動畫導入後,查看有無無效的骨骼點,刪除這些節點能夠下降動畫大小。
(1)Animation裏 骨骼點變成黃色說明缺乏該骨骼點,須要肯定是骨骼點丟失仍是不須要這些骨骼點,若是動畫正常,則說明這些骨骼點無效能夠刪除。
無效骨骼點

(2)注意IK骨骼點 若是不須要使用反向動力學功能,而動畫裏又包含了IK骨骼點, 則刪除這些骨骼點(一般是美工作完動畫忘刪IK了)。
無效IK點

3.減小關鍵幀密度:
啓用FBX > Animation選項 > Anim.Compression選項 > Keyframe Reduction
Keyframe Reduction官方文檔翻譯:減小導入的冗餘關鍵幀。若是選擇,將顯示動畫壓縮錯誤選項。這將影響文件大小(運行時內存)和如何評估曲線。

4.減小動畫精度:
Unity存儲Animation的數值精度比較高,能夠經過減小數值精度的手段,下降動畫大小。

參考資料:
《Unity骨骼動畫資源解析與優化》https://www.cnblogs.com/damow...
《unity性能優化之下降動畫文件的大小》https://blog.csdn.net/rhett_y...
《Unity 優化翻譯官方文檔(三) Animation Clips》https://blog.csdn.net/dengshu...

3.減小網格佔用內存
1.減小頂點
2.開啓Optimize Mesh選項
3.關閉Mesh Compression

1.減小頂點Vertex:
減小頂點會顯著的提高網格的性能,減小內存的佔用,一般來講,在能夠實現美術效果的前提下,頂點越少越好。

2.開啓Optimize Mesh選項:
官方文檔翻譯:爲了更好的GPU性能,頂點和索引將被從新排序。須要嚴格頂點排序的技術,如網格變形或特殊的粒子網格發射器效果,應該禁用此選項。

3.關閉Mesh Compression:
開始網格壓縮可能會致使Optimize Mesh失敗,佔用更大的內存。

參考資料:
《Unity的Mesh壓縮:爲何個人內存沒有變化?》https://www.cnblogs.com/muron...

4.減小音頻佔用內存
音頻同時使用的數量較少,可是壓縮比率大,默認音頻格式加進內存後,體積會增大10倍。
對於較大的音頻文件(超過200KB),要特別注意。
Load Type 改成 Streaming,能夠極大下降內存佔用。
建議較長的音頻使用.mp3或.ogg格式,較短的音頻使用.wav 或.aiff格式。

參考資料:
《Unity優化翻譯官方文檔(四) ------ Audio Clip》https://blog.csdn.net/dengshu...

5.減小材質佔用內存

材質性能排行(由高到低):
1.Unlit 僅爲紋理,光線不產生效果
2.VertexLit 頂點光照
3.Diffuse  漫反射
4.Normal Mapped 法線貼圖
5.Specular 高光
6.Normal Mapped Specular
7.Parallax Normal Mapped
8.Parallax Normal Mapped Specular

儘可能用性能消耗更小的Shader來實現效果,複雜的Shader須要專人定製、管理和維護,寫好Shader須要時間和經驗的積累。

參考資料:
《Unity3D Shader性能排行》https://www.cnblogs.com/tim-u...
《UnityShader學習資料推薦》https://blog.csdn.net/wwlcsdn...
《Amplify Shader Editor手冊(中文版)》https://blog.csdn.net/Debugge...

優化CPU

1.下降DrawCall
2.注意代碼規範
3.內存換CPU
4.使用異步代替同步

1.下降DrawCall:
消耗CPU過大的狀況很容易出如今圖形渲染上,合併批處理,下降DrawCall能夠極大的提高性能。好比使用動、靜態批處理,GPU Instance技術。

2.注意代碼規範:
良好的代碼規範會讓你得到更好的性能,而且避免不少陷阱,減小入坑的概率,節約時間。多讀官方API,避免重複造輪子。

3.內存換CPU:
CPU不夠時,不但能夠想方法下降CPU的消耗,也能夠考慮用內存換CPU。使用對象池就是一種常見的內存換CPU的手段。

4.使用異步代替同步:
使用異步Async(非阻塞式)代替同步Sync(阻塞式),能夠優化用戶體驗。好比加載時用異步加載,顯示進度條就屬於這種方式。
可是一般異步比同步消耗的時間更多,遇到的問題更多,因此要合理使用異步和同步。

優化代碼

《用好lua+unity,讓性能飛起來——lua與c#交互篇》
https://www.cnblogs.com/zwywi...
《優化Unity遊戲項目的腳本》
https://connect.unity.com/p/y...

參考資料:
《[Unity優化]減小DrawCall:批處理》https://blog.csdn.net/lyh916/...
《阿里巴巴Java代碼規範》https://www.cnblogs.com/han-1...
《Unity官方文檔-DrawCallBatching》https://docs.unity3d.com/Manu...
《Unity GPU Instance(大量相同網格物體合批)》https://segmentfault.com/a/11...
《Unity 對象池》https://blog.csdn.net/wangjia...
《Unity3D研究院之異步加載遊戲場景與異步加載遊戲資源進度條》https://www.xuanyusong.com/ar...

相關文章
相關標籤/搜索