# Unity 2017 開發者大會 ###### tags: `Unity` `SpeechNote` 有參與的講座之筆記,編輯者:[鴨仔開發日記](https://www.facebook.com/douduck08develop/?fref=mentions) ## GPU instsncing - 用單一 drawcall 繪製大數量的網格 - 減少 CPU 消耗,不減 GPU 消耗 - 限制:相同材質、相同Mesh - 實作: - 用 world matrix array 傳遞 pos, rotation, scale 資料 - before 5.6, 需要新增 instancing shader - after 5.6, check Enable Instancing option - 新API: - 5.5, DrawMeshInstanced - 5.6, DrawMeshInstancedIndirect - 需要每禎呼叫 - 視界剔除要自行處理 - 目前 shader 編譯速度會因為自訂資料大幅拉長 - 目前不支援GI,預計2017.2支援 ## Animation Instancing - Ref: http://forum.china.unity3d.com/thread-24240-1-1.html - 需要的數據 - 骨骼動畫 T-pose 的頂點數據、索引、權重 - 世界矩陣、動畫數據、動畫索引、禎編號 - 為了優化傳輸效率,可以加上float對齊128位元 - ref: http://blog.csdn.net/redline2005/article/details/38383405 - 透過多組頂點數據可以實現LOD - 動畫數據可以用貼圖來儲存 - 將動畫的蒙皮矩陣,以像素點的顏色來儲存 - 貼圖格式 RGBAHalf + point filter - 以動畫禎及動畫索引去採樣動畫數據的貼圖 - 優化上可以省去權重0的採樣 - 優點 - 可以省去 Animation.Update 的 CPU 開銷 - 可以製作大量物件的動畫 - 缺點 - 不支持blend tree、IK - 動畫是透過採樣實現,精度降低 ## 非同步程式設計 - coroutine、thread、job system - 5.4已經將camera.render從主執行緒移出 - 5.6開始支援vulkan,對多線程運行圖形API更有幫助 - 使用coroutine要注意建立的動作有消耗,要盡量減少建立頻率,讓多個工作共用coroutine - managed thread要注意線程安全以及資源爭奪 - Unity API 不是線程安全,所以不能在其他線程呼叫 ## Movie player in 5.6 - new component: Video player - 可用於 camera remder, render texture, mesh ## TimeLine - 感覺像 Animation 進化版 - 可多線並行 multi track、可腳本控制 - API script: play, stop, pause, jump to - 支援 alpha sprite, NevMesh ## NavMesh - navigation mesh: 可行徑的表面 - 透過 bake 可以得到 static NavMesh - 5.6 開始支援 runtime NavMesh - NavMeshBuilder - 開源的 component: [github](https://github.com/Unity-Technologies/NavMeshComponents/tree/master/Documentation),[More ref](https://docs.google.com/document/d/1usMrwMHTPNBFyT1hZRt-nQZzRDTciIQRVzmA7MQsFNw/edit#heading=h.9qjpe9imo9tj) - runtime 不支援會移動的物件平台 ## UGUI 深度優化提升手遊效能 - 術語 - Re-batch - Sub-canvas - Graphic: UI 的基礎類別 - Layout: UI 佈局,影響 UI 在畫布上的佈局 - The updates of Layout and Graphic components is called a rebuild - 渲染細節 - Transparent 佇列 - 因為 alpha blending,會排序 UI 從後面開始渲染 - 因為要相容透明渲染,無法避免產生大量 overdraw - 填充率: 網格貼圖中 alpha = 0 的像素點比例過高會造成效能浪費,可透過修剪網格優化 - Re-Batch - 執行後會保存結果,直到 dirty 發生 - 任何組成網格發生變化則重新執行 - 如何計算 Batching - 網格排序 - 深度 - 檢查覆蓋關係 - 材質 - 多執行緒 - Re-build - Layout rebuilds - Graphic rebuilds - PerformUpdate() :: CanvasUpdateRegistry invoked by WillRenderCanvases 事件 - Dirty Layout - Dirty Graphic components - Clipping components (such as Masks) ## 靜態代碼分析 - 不經過編譯執行的動作下進行單元分析測試 - [UnityEngineAnalyzer](https://github.com/meng-hui/UnityEngineAnalyzer)是基於Roslyn發展來的代碼分析工具 - 可以由 VS NuGet Package 取得,也可自訂分析條件 - 例子:加上sealed關鍵字可以讓C#的override method編譯得到適當的優化 ## Unity 圖形 debug - Ref: https://gameinstitute.qq.com/community/detail/114353 - 盡可能將GPU中的資料數據輸出可以幫助除錯 - 分析 -> 調試 -> 驗證 - 確認關鍵數據 - 修改並應用 - 工具: - [RenderDoc](https://docs.unity3d.com/Manual/RenderDocIntegration.html) - Nsight - Visual Studio Graphics Analyzer (可以看到幾何階段的數據) - 利用頂點順序的調整來改變單一draw call中的渲染順序 ## eaglEEye 性能分析 - Ref: http://forum.china.unity3d.com/thread-24247-1-1.html ## rendering pipeline - 目前 unity 可以提供的自訂選項 - forward vs deferred - standard shader properties - command buffer and custom shader - 新設計的 unity pipeline - 有一個小型的 C++ 核心 - 以 C# 實現對外開放的 API - 可以根據每個專案需求進行變動 - 方便 debug - 針對各種平台專門優化 - 原本的 command buffer 可執行的時間點受限 - 新的 scriptable render pipeline - 可以自訂整個流程 - 所有的 command 都是 jobs,運算分散效率更佳 ## AssetBundle Graph Tool - AssetBundle - 縮小安裝包,提供安裝包以外的資源下載 - 壓縮格式:不壓縮、LZMA、LZ4 - 可針對平台優化資源 - 分為場景跟一般資源 - 更好的記憶體管理 - AssetBundle Browser - https://github.com/Unity-Technologies/AssetBundles-Browser - 一個簡易版AB打包與瀏覽工具 - 適合進行檢查、修改與測試,不適合做大結構的AB建立 - 自動檢查重複的資源 - 需要 unity5.6 - AssetBundle Manager (已經停止維護) - [Assate store link](https://www.assetstore.unity3d.com/en/?_ga=2.207826388.718599052.1497016655-1522464112.1482201974#!/content/45836) - 可以利用模擬模式,不需打包即可進行測試 - 可以模擬http server運作進行測試 - AssetBundle Graph Tool - https://bitbucket.org/Unity-Technologies/assetbundlegraphtool - 圖形化的AB建立流程編輯器 - 可以作為資源前置處理器來利用 - 需要 unity5.4 - 上述AB工具的主要開發者github:https://github.com/hiroki-o