[Unity] UDC 2017 Note



Day2 Overview

1. Keynote: Infinity Unity
2. GPU Instancing – 羅志達
3. Unity 影視工具 Timeline – Marek Marchlewicz
4. Animation Instancing – 張陳淵
5. Unity 非同步編程技術詳解 – 楊懷忠

Day3 Overview

1. Unity 遊戲原型快速開發實踐 – 楊棟
2. UGUI 深度優化提升手遊效能 – 楊懷忠
3. Unity 靜態腳本分析 – 張黎明
4. Unity 圖形快速定位與 Debug 技巧 – 張陳淵
5. Scriptable Render Pipeline – 張黎明
6. Asset Bundle Graph Tool 流程工具深度介紹 – 羅志達


Keynote: Infinity Unity


劉景岩:大陸市場的問題
– Localization & Integration
– Platform support
– Publishing license

Reference: unity.mi.com

常守瑜:Unity Connect
– Showcase
– Find help
– Get paid

Kelvin Lo:新功能
CinemachineCamera (Virtual Camera)
– Procedure Camera Work:判斷目標位置或障礙物自動切換 Camera

NavMesh
– Progressive Lightmapping
– 不需要重新烘焙
– 針對 Camera 可視範圍,先用低階方式算
– 動態計算場景、無接縫地圖(可設定範圍大小)

Kelvin Lo:GPU Instancing,從入門到放棄

問題
– 大量的渲染、無雙系列
– 一次 Draw Call,來達到降低 CPU 負載

Instanced Shader: 5.6
– Advanced Options => Enable Instancing 打勾

原理
– 把相同 Geometry 物體的頂點數據以及世界座標交給 GPU 處理

限制
– 跟光有關的無法使用:Light probe
– 除了 PC 或家用主機外,其他平台還沒有好的解決方案:放棄!

API
– 5.5: DrawMeshInstanced
– 5.6
– DrawMeshInstancedIndirect
– Shader variant stripping

解決方案
– Array-of-Struct Layout:更緊湊的排列每個 Instance
– Out-of-Bounds Read

改進
– 支援半精度 half2, half4
– 大部分功能正在測試及程式審查 2017.2

Carl Callewaert:Unity 5.6 Video Player

Cinemachine FreeLook Camera
– LookAt
– Follow
– Rotate by mouse position

Cinemachine Virtual Camera
– Aim: 可以調整 Offset & Size
– Noise: 加入手震的感覺

Timeline + Playable Director
– 結合同一物件中的各個 Animation:Idle => Jump => Die
– 結合不同的物件 Animator

張陳淵:基於 Animation Instancing 的人群模擬
i7 + GTX 980Ti:30000個角色 x 500面 = 50~60 FPS
GPU Instancing 的缺陷:不支援骨骼動畫 => Animation Instancing

Animation Instancing
– GPU Instancing 的一種擴展
– 需要的數據
– Instancing Vertex:Animation T-Pose下的頂點數據、骨骼的索引及權重
– Instancing Data 角色的獨有數據:世界矩陣、骨骼動畫數據、動畫索引、動畫幀索引

LOD
– 距離 Camera 比較遠的物件,就使用低精度的 Mesh => 低頂點數
– 降低渲染的面數、降低 overdraw

Animation Texture
– TextureFormat.RGBAHalf
– Filter Mode: Point
– 不需要 mipmap

Animation Texture Bake Flow
– 搜索模型的動畫
– 計算蒙皮矩陣

提交渲染
– Material.SetBuffer
– DrawProcedural
– DrawMeshInstanced

優點
– 避免骨骼動畫的計算開銷 (Animator.Update())
– 在 GPU vertex shader 計算蒙皮 (MeshSkinning.Update())
– 降低了 CPU 到 GPU 的數據傳說 => 降低 Drawcall

缺點
– 無法使用 Blend Tree
– 不支持 IK
– 動畫精確性降低

楊懷忠:Unity 中的非同步程式技術(Job System)

多執行緒渲染
– 過多的遊戲性能負荷集中在 Main Thread
– 在 Unity 5.4 中把 Camera.Render 的工作移出,但大大還不足
– Unity 5.6 開始支持 Vulkan

Unity Job System (Worker threads)
– Main thread, Render thread, many worker threads
– Particle systems, Animation systems, 不料計算、遮擋剔除、視錐體剔除、蒙皮和靜態裁剪
– 基於任務式的高效安全多執行緒系統
– 多工之間可以存在依賴關係
– 可以根據主執行緒排優先順序

Unity 中的非同步作業
– Resources.LoadAsync, Lightmapping.BakeAsync…
– AssetBundle.LoadFromFileAsync:可能主執行緒只佔用 1% 時間

Coroutine
– Main thread
– one frame 中的執行順序:WaitForSeconds, WaitForFixedUpdates, WaitForEndOfFrame
– C# 編譯器會建立一個 Coroutine 類別,也是一種消耗(增加內存消耗)
– 生命週期與 MonoBehaviour 相同
– Coroutine 中的區域變數會變成 Class 的 Member
– 為了減少 Main Thread 的開銷,避免在 Coroutine 中進行一些大量的計算
– 盡可能少用 Coroutine
– 巢狀式的 Coroutine 對於 Code 的簡潔與維護都不錯,但會容易導致較高的記憶體開銷

C# Threads
– 真正的並行
– Race condition:Lock
– 鎖死:Deadlock
– 不能在 C# 的執行緒中 Call Unity API

楊棟:Unity 遊戲原型快速開發實踐

Why
– 驗證技術可行性
– 核心玩法試驗
– 從一堆原型中挑出最好的

實際案例分析:簡單的橫向捲軸格鬥遊戲(打殭屍)
– Parallax Scrolling:2D platformer
– Flash 2 Unity:GAF Pro: Flash to Unity ($95)
– SWF => .gaf (binary) + .png (atlas)
– Import 後會生成 Animation Controller + Animations => Create Prefab
– 自己連接 State:Sub State Machine
– 連擊操作 + 簡單 AI:PlayMaker
– 各種手勢:EasyTouch 5
– 解決碰撞體在正確時間出現在正確位置
– 粒子特效:Cartoon FX
– Custom Script:碰撞、控制 PlayMaker

楊懷忠:UGUI深度優化手遊效能

UI Basics
– Render Details
– Back-to-front with alpha blending
– High level of overdraw (每個像素期望只畫一次)
– Rebatch
– 保存結果,重用 Batching,直到 Dirty (任何 Mesh 發生變化)
– 如何計算 Batching (為何浪費):Mesh sorting (depth, overdraw, material)
– Rebuild
– Layout rebuilds:重新計算所有頂點
– UI 元素的位置或大小改變時
– 優先計算根節點
– Graphic rebuilds:Color & Alpha channel
– 頂點數據 Dirty
– 材質或貼圖 Dirty
– Perform::Update()

UI Optimize Tools
– Profilier
– Canvas.BuildBatch
– Canvas.SendWillRenderCanvases
– Unity Frame Debugger
– Xcode’s Instruments
– Xcode’s Frame Debugger

Canvas Rebuild
– 子物件的順序:把相同材質的物件排一起
– 多級 Canvas:僅影響自身 Canvas
– Rebuild 會是效能瓶頸嗎?
– 只存在單一或少數的 Canvas
– 太過平凡的 Dirty 導致 Rebuild

Canvas
– 一般準則:根據靜態與動態元件區分 Canvas
– Raycaster
– 必要組件才開啟 Raycast Target
– 放在越底層越好

Font
– 每個字都是四邊形
– Font Mesh Rebuild
– UI Text 組件發生變化
– 父物件發生變化
– SetActive or Enable/Disable
– 動態字體和字體集
– 當前 Font texture 未包含所需要的字時,Font texture 會 rebuild
– 字體集的大小只增不減
– Font.RequestCharactersInTexture 可以有效降低啟動時間
– Best Fit:自動調整到最大的整數大小,一般不建議開啟

ScrollView
– 列出所有的 Cell:只適用於少量的情況
– Buffer Pool
– 需要申請足夠大的記憶體
– RectMask2D

重要建議
– Layout 組建很昂貴:不要用
– Disabling Canvas Component
– SetActive 或是移到看不到的地方,同樣需要重建
– 使用 Disable 可以重新利用 Buffer Pool
– 避免 UI 重疊
– 優化 UI Shader

張黎明:Unity靜態腳本分析

Why
– 有限的開發時間
– 避免人工檢查的遺漏
– 可以整合 CI

已有的代碼分析器
– Visual Studio “Squiggles”
– Resharper
– Roslyn
– 可擴展的 Analyzer
– https://github.com/dotnet/roslyn

Unity Engine Analyzer
– https://github.com/meng-hui/UnityEngineAnalyzer
– Reflection
– Nuget => UnityEngineAnalyzer
– Customize
– Visual Studio SDK
– .Net Compiler Platform (“Roslyn”) SDK

Unsealed Derived Class Analyzer
– 利用 sealed class 來減少 virtual function 的消耗
– 繼承 DiagnosticAnalyzer:將所有 method 拿來判斷 IsOverride() && !IsSealed()

張陳淵:Unity圖形bug定位及調適技巧

Filter Mode
– Point = Bilinear
– Trilinear:使用不同的層級來進行 Mipmap

Why
– 找出壞圖原因
– 暸解原理,進一步優化

工具:確認數據(你的推測)
– 調查方法:分析 => 調試 => 驗證
– 範例(pic * 100 – 90)

優化
– 檢查渲染時間:Draw call time
– 渲染順序:Rendering Pipeline (常用:VS, PS)
– 同一 draw call 下,透過檢查頂點順序
– 裁剪

錯誤檢查
– 狀態檢查:History (檢查Overdraw)
– 輸入輸出檢查:確保每個階段的 I/O 都正確
– Shader調試

工具
– Unity Frame Debugger
– Nsight
– Visual Studio Graphics Analyzer (可看到 Geometry Stage 階段的狀態)
– Render Doc (推薦***)
– Android Studio
– Apple Instrument

Dynamically Batching
視角固定的遊戲:透過固定渲染順序來優化 (UGUI 就是透過此種方式來優化 Draw Call)

張黎明:Unity Scriptable Render Pipeline

Current pipeline status
– Configurability: Big black box
– Discoverability: Not documented
– Flexibility: Can’t be extended
– Maintainability
– Architecture is complex
– Camera does everything
– Outdated features: Grab pass

The new philosophy
– Small C++ core
– Expose API
– Implement specifics in C#

Features
– Lean
– User centric: Easy to debug, work & extend
– Optimal
– Explicit: No magic, clean API

How
– Rendering is generally (SUPER HIGH LEVEL)
– What to render
– What state of objects
– Submit to GPU

Scriptable Render Pipelines
幫助 User 進行底層光照陰影等細節
– Script a whole pipeline – High level abstractions
– Draw a list of things, rather than single thing
– Sorting
– Shadows
– State management
– More functionality
– User centric

Userland v.s Unityland
Performance: If it’s performance critical, it’s done in C++.
Future: More in C# if we can make it fast.

C# / Userland
– Instantiating culling
– Rendering passes
– No per renderer operations

C++ / Unityland
– Culling /soting modules
– Issuing watchable draw calls

Making a render pipeline
Render Pipeline Asset => (create) => Render Pipeline Instance
Render Pipeline Asset

– IRenderPipelineAsset: DestroyCreatedInstances, CreatePipeline
– IRenderPipeline: dispose, Render(ScritableRenderContext ,cameras);

Example
GraphicSettings => Scriptable Renderloop Setting => Drag render pipeline asset

– Clear depth buffer
– Draw opaque objects
– Draw skybox
– Draw transparent objects

Command scheduling
– Everything is queued up
– Submit gets called
– Every command is a job

Kelvin Lo:Asset Bundle Graph Tool

Hiroki Oame 大前廣樹:Unity Director, Unity-Chan’s father

AssetBundles
– Minimize first package
– Dynamically updating
– Better memory management

Current situation
– 文件不齊全
– 跨平台載入效率不一
– 某些系統相容性不足:Code stripping, shader variants

Asset Bundle Browser
– Configure: Drag prefab
– LoadAsset.cs
– LoadScene.cs:Disabled after load,可以設定 Loading
– Conflict detection: 把共用的 object 再拉出來,會自動建立關聯
– 可以關連 AssetBundle Graph Tool

Asset Bundle Manager
– Simulation mode:還沒 Build 之前可以先模擬
– Local Server
– Remote Server

Asset Bundle Graph Tool
– Load From Directory => Split By Filter => Group By File Path (Grouping keywords) =>
Configure Bundle from group => Build Asset Bundle => Export To Directory
– Extract shared assets: Check dependancy
– Group by runtime memory size
– Automation: 自動化美術資源匯入格式設定流程
– Load from directory => Split by filter => Overwrite import setting (Use As Postprocessor)
– Last imported items: 不管從哪來的資源都執行,建立好命名規則即可
– Label Assets: Preview 加標籤

Unity Technologies: Asset Bundle Manager + GraphTool + Browser
https://bitbucket.org/Unity-Technologies/assetbundledemo
https://bitbucket.org/Unity-Technologies/assetbundlegraphtool
https://bitbucket.org/Unity-Technologies/assetbundles-browser




歡迎您留言與分享!(Welcome for comments or sharing!)

Related Post:

Tagged on: