# 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本身提供![螢幕擷取畫面 2025-04-29 102756](https://hackmd.io/_uploads/B1MBKnakge.png) * 避免後修改 + 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 * 邊撥邊讀取,背景音樂等更大的檔案 ---- ![螢幕擷取畫面 2025-04-30 101233](https://hackmd.io/_uploads/HyFjDbyexe.png) ![螢幕擷取畫面 2025-04-30 101527](https://hackmd.io/_uploads/SJlJ_-1gll.png) ---- ## Module & Animation * 專案多與Spine或Live2D * 參照各自優化文件 ---- ## Texture * 2的冪次方,但不用長寬一樣 * 關閉Read/Write * 不透明關閉 * Alpha Source * Alpha is Transparency * 原始格式:png或tga * 壓縮格式:ASTC (數字低品質好;高壓縮好) * 一般貼圖:6x6 * 無透明度貼圖:8x8 * Filter Mode越下方成本越高 * 雙線性攻守皆宜 ---- ![螢幕擷取畫面 2025-04-30 102226](https://hackmd.io/_uploads/B1jKYbJeex.png) ---- ![螢幕擷取畫面 2025-04-30 102245](https://hackmd.io/_uploads/HJbct-1gee.png) ---- ### 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 ---- ![螢幕擷取畫面 2025-05-05 101137](https://hackmd.io/_uploads/BkMO05rlll.png) ---- ![螢幕擷取畫面 2025-05-05 101534](https://hackmd.io/_uploads/r1Y81oSegg.png) ---- ## 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 ---- ![螢幕擷取畫面 2025-05-02 102933](https://hackmd.io/_uploads/SyN7Ciblgx.png) --- ## 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}]"}
    177 views
   owned this note