我的優化原則:
三原則:
注意細節、注意細節、注意細節!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了)。
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...
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...