---
# System prepended metadata

title: 效能優化整理

---

---
title: '效能優化整理'
disqus: hackmd
---

DC 效能優化整理
==

[TOC]
## 地圖物件

- 地格資源效能優化：
    - 目前的物件 Mesh 頂點少且每個類型共用一張 Material，優化走 Dynamic Batching 較合適
    - 規則是不同 Mesh (頂點需300以下) 相同 Material (超過的可拆分)
    - Render Queue 是判定渲染順序依據，每個類型的 Material 自行定義後，就會分層渲染
     ![image](https://hackmd.io/_uploads/B1fxhDt8p.png)
    - [官方說明](<https://docs.unity3d.com/2022.3/Documentation/Manual/dynamic-batching.html>)
- 建築陰影效能優化
    - 陰影Texture打包 Unity 原生 Spriteatlas V2
    - 統一透過 AtlasLoader 加載
    - Spriteatlas 設定 not included in build [官方說明](<https://docs.unity3d.com/ScriptReference/U2D.SpriteAtlasManager-atlasRequested.html >)
        
SD小兵
---
- 使用套件:
    - Mesh Baker  [套件連結](<https://assetstore.unity.com/packages/tools/modeling/mesh-baker-5017/>) 
    - FBX Export  [套件連結](<https://docs.unity3d.com/Packages/com.unity.formats.fbx@2.0/manual/index.html>) 
    - AnimMap Baker  [套件連結](<https://github.com/chenjd/Render-Crowd-Of-Animated-Characters>)

- 作業流程
    1. Mesh Baker 合併 Texture 與 Skinned Mesh (移除物件的陰影、設定 Skinned Mesh Type，可使用專案內MeshBaker場景，內建基本設定) 
            a.![image](https://hackmd.io/_uploads/ryrTqFYU6.png)
            b.![image](https://hackmd.io/_uploads/ByJesKK8p.png)
            c.建立新的Prefab&Mesh並指定輸出![image](https://hackmd.io/_uploads/rk0dntt8T.png)
            
    2. 合併後的 Mesh 使用 FBX Export 存成 FBX
    ![image](https://hackmd.io/_uploads/S19ChKtIa.png)

    3. 使用 AnimMap Baker 把動作打包成 Animation Texture
    FBX->Rig->Animation Type 設定為Legacy
    ![image](https://hackmd.io/_uploads/BJ2QpttUa.png)
        ![image](https://hackmd.io/_uploads/By_wScFUa.png)

    4. 調整 Animation Texture 使用的 Material，開啟 GPU Instancing 讓相同 Mesh 與 Material Batch 在一起，並設定 Render Queue 固定值達到分層渲染
    ![image](https://hackmd.io/_uploads/S1kGIqt8T.png)

    
- 需修改內容
    1. Shader - 原SD小人用的Shader Amplify/Amplify_Toon 整合 AnimMap Baker的Shader AnimMapWithShadowShader
    2. 面數 - 賽季後期預期會有大量SD小兵在法典附近行軍 需測試效能
    3. Render Queue 整理 - 建立列表清單進行管理
    4. 程式控制SD小人動畫邏輯更新 (移除Animator+Animation體系，改為切換Pool GameObject)

- 衍生優化
    -  AnimMap Baker Shader邏輯加上隨機時間軸起點，讓三小支的動畫(Idle,Move,Attack?)隨機亂序
    -  [實作範例](<https://tedsieblog.wordpress.com/2020/03/24/animation-instancing-a-case-study-of-ten-thousand-units-rendering/>)
    
- 畫面表現上的影響
    - SD小人動畫無法CrossFade

- DrawCall與多邊形的優化
    - 40個原SD小人![image](https://hackmd.io/_uploads/rJ6-35KLp.png)
    - 40個新版小人![image](https://hackmd.io/_uploads/BJ3Vh5YU6.png)
    
UI 系統
---
- 使用動態圖集：https://zhuanlan.zhihu.com/p/367679754
    - 程式實作上還要再研究