# Unity2022.3
# 手機優化
## 2DUI、無光、無物理
#### 分享人:薛威明
#### 2025.06.12
[影片](https://youtu.be/3ublch49-hs)
---
# 平台
* 優先優化iOS
* '.'Android一併被優化
* 反之未必
---
# 資源導入
* 每次匯入一批資源就要Inspector優化一批
* 沒效率且易出錯
----
## 匯入自動設定
1. [AssetPostprocessor](https://docs.unity3d.com/2022.3/Documentation/ScriptReference/AssetPostprocessor.html) & [AssetModificationProcessor](https://docs.unity3d.com/2022.3/Documentation/ScriptReference/AssetModificationProcessor.html)
* 自幹項目
3. [Presets](https://docs.unity3d.com/2022.3/Documentation/Manual/class-PresetManager.html)
* Unity本身提供
* 避免後修改 + AssetModificationProcessor
5. [AssetGraph](https://docs.unity3d.com/Packages/com.unity.assetgraph@1.7/manual/index.html)
* 第三方套件(from 日本)
* 強大、但更新慢
----
## Audio
* 通常不是瓶頸,但是可以造福更多效能空間
* 靜音把AudioSource刪除/關閉,而非調0
* Force To Mono,節省大小,音頻左右聲道相同
----
* 可用WAV未壓縮格式,避免多次修改而失真
* 採樣數 <= 22050Hz
* 省容量,手機也聽不出來
* 透過Sample Rate修改
----
* Compression Format
* PCM。幾乎不壓縮,適合小音訊
* Vorbis。用在大部分音效
* ADPCM。簡短音訊用,例如腳步聲
* Load Type
* Decompress On Load。
* < 200kb 增加讀取即時性
* Compress In Memory
* *> 200kb,或時長超過5秒*
* Streaming
* 邊撥邊讀取,背景音樂等更大的檔案
----


----
## Module & Animation
* 專案多與Spine或Live2D
* 參照各自優化文件
----
## Texture
* 2的冪次方,但不用長寬一樣
* 關閉Read/Write
* 不透明關閉
* Alpha Source
* Alpha is Transparency
* 原始格式:png或tga
* 壓縮格式:ASTC (數字低品質好;高壓縮好)
* 一般貼圖:6x6
* 無透明度貼圖:8x8
* Filter Mode越下方成本越高
* 雙線性攻守皆宜
----

----

----
### MipMap
UGUI無法直接使用
----
### Texture - 注意事項
* Atlas利用率低
* UI背景貼圖而不採用9宮格縮放的圖
* 純色圖沒有使用Single Channel
* 不合理的半透明佔據大量螢幕區域,造成Overdraw開銷
* 序列幀動畫沒atlas
---
# 場景
* Transform層級勿太深,效能可能會差到10倍
* 以前如此,如今不確定
* Game Object多利用Tag搜尋
----
## UGUI - 1
1. Canvas Rebatch 時間過長 V 次數太多
* 產生網格頂點時間過長
* 使用profiler查看每個批次的頂點數
* Canvas Over-dirty -> Rebatch次數太多
2. OverDraw
* Fill-rate overutilization
* UI shader中GPU像素著色器利用率過高
* 透明部分沒必要,卻一直被計算blending
----
### UGUI - 2
* Rebuild發生在Rebatch中
* Layout
* 盡量減少物件層級
* Graphic
* 所有可能打斷batch的物件移到最下圖層
* 避免UI重疊(尤其字體)
* 拆分多個Canvas減少Rebatch複雜度
* 分割動態和靜態物件放到不同Canvas下。
* 盡量不使用Layout組件
----
### UGUI - 3
* profiler檢查batch數量
* FrameDebugger檢查batch過程
* batch數量
* Canvas.BuildBatch耗時
* Canvas.SendWillRenderCanvases耗時
* Overdraw
----

----

----
## UGUI - 4
* 隱藏介面(效能排序)
1. CanvasGroup.Alpha=0 | Canvas.enable=false
2. SetActive(false)
3. graphic.enable=false
4. graphic.alpha = 0
* Raycast儘可能關閉
* 盡量放在淺層
----
## UGUI - 5
* 使用RectMask2D取代Mask
* 全螢幕時,關閉隱藏UI元件,減少GUI運算
* TMP Text Pro > UI Text
* 不同字型、Size、大小寫、粗體、斜體都會打包到不同DrawCall
* 不使用遮罩、裁切的UI,使用更便宜的shader
----

---
## Meterial
* read only -> sharedMaterial
* release time
* change scene
* Resources.UnloadUnusedAssets()
---
## Unity AA
* 抗鋸齒 Anti-Aliasing
* 圖形渲染的技術
* 旨在減少或消除畫面中出現的鋸齒狀邊緣
* 由於有限解析度
* Render Pipeline Asset -> Quality
---
## PostProcess
* 不要全局都使用volume效果
* 移除不需要的後處理效果
* 而非不勾選,仍會綁定資源
* PostProcess當最後使用手段
* 優先使用替代方式
* 依專案
* 修改PostProcessPass.cs (eq:採樣次數)
* 修改各效果shader (eq:註解某些pass)
---
# Profiler
----
## Timeline查比例吃重
* 常見等待函數
* WaitForTargetFPS
* 等目標幀率,沒負載問題
* Gfx.WaitForGfxCommandsFromMainThread/WaitForCommand
* 等CPU
* 等CPU - GPU
* Gfx.WaitForPresentOnGfxThread
* 等GPU
* 等CPU - GPU
* WaitForJobGroupID
* 等CPU
---
# 記憶體
1. 託管
2. 非託管 (C#)
* unity collection
* C# collection
4. Native (C++)
* Allocator & Memory Lable
----
## 術語
* Page:記憶體最小單元 (Used/Free/Cache)
* 默認4K
* MMU:管理Page的單元,對應實體記憶體
----
## 工具
* Unity Profiler -> Memory
* 預設非全指標,透過profiler modules添加
* Unity Memory Profiler
* 快照比對
----
### 行動平台的記憶體
* Android Studio Profiler
* Xcode-Profile-Allocations
* 1G的分配記憶體用到700MB以上就會崩潰
* 不同平台獲取的記憶體不一樣
* USS
* RSS(USS+PSS)+compressed
----
* Project Setting -> Memory Setting
* 分配大小
* 抽象意義的分類 != Unity底層的分類
---
# 優化手段
----
## 記憶體
* Mesh佔用的記憶體過高,超過Texture
* 頂點數是否造成記憶體過高
* RenderTexture是否降解析度
* Lua溝通,盡量避免Unity物件
----
## Shader
* Float 用於位置計算
* Half 用於紋理計算
* 計算式減少
* 少用超越函數 (指數、三角函數、對數)
* 乘法 > 除法 (* 1/X)
* VS > FS
* 避免隱式轉換 (f x f3 x f x f3 => f x f x f3 x f3)
* sRPB解壓縮
----
### Shader-記憶體
* 不宜超過 50MB
* Unity Memory Profiler 快照下可查到
* 氾濫原因:關鍵字過多 -> 變體過多
* ProjectSetting -> Graphics -> Shader Loading
* Current tracked shader & variant
* shader數量 & 變體數量
* 變體查詢
* shader inspector -> comiled code -> 最底下
* 不同平台值不一樣
* 最好看到打包後的Editor Log
* 搜尋Compiling shader
* 變體個數 / 寶體個數
----
### Stripping scriptable shader variants
* 變體剔除 - 打包時間減少,運行時記憶體占用
* dynmic_branch - no variants
* multi_compile -> 大量變體
---
## 耗電 & 發熱
* 網路封包 < 2kb/秒(耗電量high) < 4kb/秒(耗電量very high)
* 動態調整螢幕亮度 (例如待機時候)
* OnDemandRendering > Application.targetFrameRate
* 僅更新顯示頻率
* 邏輯更新頻率不變(怕IO感受延遲)
----
* [OnDemandRendering](https://docs.unity3d.com/ScriptReference/Rendering.OnDemandRendering.html)
* .renderFrameInterval設定更新頻率
* .willCurrentFrameRender判斷此偵更新與否
* [fps計算](https://docs.unity3d.com/ScriptReference/Rendering.OnDemandRendering-effectiveRenderFrameRate.html)根據vSyncCount是否開啟
* 繪製頻率低 (eq.對話框UI )
* 輸入頻率維持
----
## 第三方套件
* !網路封包
* !Wwise (音訊用)
* 後臺線程多
* !CRIWARE (視頻用)
* CAK開頭的線程都是他開啟且開銷超高
----
# 啟動優化
* 黑頻-Logo-第一個場景
* 啟動分為首次啟動、冷啟動、熱啟動(背景回來遊戲)
### iOS
* 啟動時間超過20秒會被自動殺掉
* 豎屏啟動時間較長(些微)
----
### UNITY初始化完成到第一個場景載入完成最佳化建議
* 盡量不使用Resources,使用也不要過多資源
* 紅白樹檢索,遊戲開始被加載,不釋放
* 拖慢啟動時間
* 越大佔記憶體越多
* 第一個場景盡量保持簡單,掛載腳本不宜過多,Awake/Start的邏輯盡量簡單
* 資源Text模式比force binary模式慢很多
----
# Asset Bundle
* 2M-5M的包體是合理的參考值。
* 過小的包體
* 包頭佔用記憶體壓力會比較大
* 資源載入與銷毀重複建立銷毀檔句柄會造成系統資源開銷大
* 電量消耗加大
----
# Asset Bundle
* 移動平台建議使用LZ4壓縮格式。
* LZMA包小(X0.7),需完全解壓,加載時問長
* Stream解壓,全解。解壓跟讀取都慢
* LZ4載入時間較快(x10),包體大
* 按塊解壓(ChunkBased),解壓用到部分
* 不使用MD5值作為更新包依據
* 可能包內沒變化但md5發生變化
----
### 確定使用相同版本Unity發布打包
### 後續不會升級Unity
* BuildAssetBundleOption.DisableWriteTypeTree
* TypeTree資訊不會被打到AB中
* 極大化減小包體大小
* 減少載入時的記憶體開銷
---
## IL2CPP vs Momo
* IL2CPP
* AOT
* Mono
* JIT
* runtime code execution
* Must ship managed assemblies
---
## 移除用不到的module
* Physics module 5mb
---
# 行動平台記憶體
# 經驗值資料分享
2022年大陸開發者經驗
----
* Texture: 80M-160M
* Mesh: 50M-70M
* Render Texture: 50-80M
* AnimationClips: 30-60M
* Audio: 10-20M
* Cubemap: 0-50M
* Font: 5M-15M
* Shader: 20M-40M
----
* System.xxx總和:15M-30M
* 不要大的配置表緩存進內存
* 特別是文字資料
* AssetBundle: 0-10M
* 其他各類物件單項:0-10M,數量小於10000
* ReservedMono: <100M
* ReservedGFX: <300M
* ReservedTotal: <650M
---
資料參考:
[《Unity性能优化》课程 by Metaverse大衍神君](https://www.youtube.com/playlist?list=PLZkFlM4qb0dtb5ieApJVm1CeEkuyAGYDa)
THE END
{"title":"Unity手機2D優化","slideOptions":"{\"progress\":true,\"slideNumber\":true}","description":"影片連結","contributors":"[{\"id\":\"3877c546-06f0-440b-a33d-99383a2ceb45\",\"add\":12386,\"del\":4911}]"}