しがないエンジニアのブログ

技術的な内容をメモ代わりにつらつら

[Unite2018] エディター拡張マニアクス2018

公式サイト

http://events.unity3d.jp/unitetokyo2018/session-lineup.html#session36

講演者

安藤 圭吾 (ユニティ・テクノロジーズ・ジャパン合同会社)

SlideShare

https://www.slideshare.net/UnityTechnologiesJapan/unite-2018-tokyo2018-96373327

概要

  • ここ3年の間に実装された機能について
    • 公開済・非公開含む

内容

赤文字は開発段階

  • Scripted Importer
    • 未対応ファイルのインポートを自動化
      • 拡張子ごとに作成
        • Unityがサポート済の拡張子には対応できない
      • OnImportAsset()
        ※アセットIDは変更しないこと


  • UI Elements
    • UnityエディタはIMGUIで設定されている
      • UIが複雑になるほどコード量が増える
      • 処理が1箇所にまとまってしまう
    • RMGUIであるUI Elementsの開発
      • まだinternal customer (Unity社員)向け
    • 概要
      f:id:turgure:20180618084539j:plain
      • web知識に当てはめて考えられる
      • 覚えることは4つ + 1つ
        • 4つ
          • Visual Tree
            • Visual Elementと呼ばれるノードからなるグラフ
            • 要はXML
          • UXML
            • Visual Treeの構造をテキスト化し、ファイルとして扱う
            • 要はXMLファイル
          • USS
          • UQuery
        • +1つ
          • Visual Container
            • Visual Treeを格納する領域
            • RMGUIのOnGUIみたいなもの
    • UI Elementsの今後
      • 色々課題が多い
        • Custom Editor
        • Property Drawer
        • Performance
      • おそらく2019.x 後半


  • Graph View
    • 現状
      • まだ社員向け機能
      • まだdocumentもない


  • Shortcut System
    • ex) Shift + A のショートカットコマンドを実装
      • 特定のEditor Windowでショートカットを実装する場合
        • Eventからショートカットコマンドを検知
      • Menu Itemで実装する場合
        • グローバルなコマンドとして実装
    • ショートカット機能の実装は難易度が高い!
      • OSによるキーの違いも考慮する必要
      • ショートカットキーのコンフリクトを調べられない
      • ショートカットのリスト化が困難
    • Unity2018.2から新しいシステムを実装
      • まだプレビュー段階
      • できるようになること
        • ショートカットのリスト化
        • ユーザによるショートカットキー変更
        • ショートカットキーがコンフリクトした場合の修正
    • 実装方法
      • Menu Itemのような実装方法


  • Preset
    • UnityEngine.Objectのプロパティを保存/復元する機能
    • Preset Asset
      • Serialized Propertyを保持している
    • スクリプトで生成/操作が可能
    • Presetに保存した値をデフォルト値として扱える
    • 一番役立つのがインポータ設定


  • Package Manager
    • Assetを配信するシステム
    • Module Managerとの違い
      • コンセプトは同じ
      • 失敗点を改善
        • 扱うモジュールがcore部分に強く依存していて切り離しが難しい
    • 最終的にModule Managerがなくなり、Package Managerに完全移行
    • 基盤システムはnpm
      • そのためパッケージ情報はpackage.jsonで管理
    • 今後
      • unitypackageは過去のフォーマットになる


  • Unity C# Reference
    • 標準機能をエディタ拡張で使いたい
    • 特定のプロパティにアクセスしたい
    • 公式でc#ソースコードを公開
      • 2017.1~2018.2
    • Unity Reference-Only License
      • 再配布・改変は不可
    • 活用法
      1. UnityCSReferenceをクローンする
      2. 必要な機能を調べる
      3. 目的のコードを探す
        • ex) project browser(エディタのUI分割)
      4. どのように実装されているか学ぶ

用語

[Unite2018] その最適化、本当に最適ですか!? ~正しい最適化を行うためのテクニック~

公式サイト

http://events.unity3d.jp/unitetokyo2018/session-lineup.html#session32

講演者

Valentin Simonov (Unity Technologies Field Engineer)

SlideShare

https://www.slideshare.net/UnityTechnologiesJapan/unite-2018-tokyo-96358722/UnityTechnologiesJapan/unite-2018-tokyo-96358722

概要

  • メモリの種類について
  • Dirty Memoryを最小限に抑えるべし
  • 最適化ツールの紹介

内容

  • メモリ消費の管理
    • ツールごとに値が様々
    • what kind of memory?
    • RAM(物理メモリ)
      • 物理的なメモリ
      • 上限を超えられない
        f:id:turgure:20180614083307j:plain
    • Virtual Memory(VM)
      • RAMの一部を借りる
      • iOSのアプリはVM上で動く
      • pageとしてメモリのアロケートをする
        f:id:turgure:20180614083356j:plain
    • Resident Memory
      • VMの一部
      • 使用せず、確保するだけ
        f:id:turgure:20180614083415j:plain
    • Clean and Dirty Memory
      • Clean Memory
        • readonlyなメモリ領域
          • binaryファイルなど
      • Dirty Memory
        • そのた
          f:id:turgure:20180614083650j:plain f:id:turgure:20180614083657j:plain
    • Graphics Memory(VRAM)
      • GPUとCPUが共有する物理メモリ
      • ほとんどがResident or Dirty memory
        f:id:turgure:20180614083749j:plain
    • Malloc Heap
      • VMの一部
      • malloc/callocで確保される
        f:id:turgure:20180614083756j:plain
    • Swapped(compressed) Memory
      • 圧縮されていないDirty Memory
      • 圧縮されたDirty Memory
        f:id:turgure:20180618083329j:plain
    • Native(Unity) Memory
      • Native Memory
        • malloc heap(VM)の一部
        • すべてのassetはNM上で管理
          f:id:turgure:20180618083458j:plain
    • Native Plugin
    • Mono Heap
      • NMの一部
      • .NETバーチャルマシンの一部
      • 連続したものではなく、断続的なもの
        f:id:turgure:20180618083539j:plain f:id:turgure:20180618083600j:plain


  • iOSメモリ管理
    • iOSマルチタスクメモリ
    • 物理メモリが少なくなると、物理メモリを開放しようとする
      1. Clean Memoryの削除
      2. Dirty Memoryの使用が多い場合、警告を発する
      3. 確保できなかった場合、Dirty Memoryを削除
    • Dirty Memoryのサイズを最小限に抑える!
      • Dirty Memoryの使用量を把握する
      • Dirty Memoryを使用しているオブジェクトを減らす
      • Note. 圧縮のやりやすさ、やりにくさがある


  • Tools
    • Unity Profiler
      • 内部ツール
      • Simple View
        • Mono(used)
          • Mono Heapサイズ(ピンクと緑の総和)
        • Mono(total)
          • Mono Heapに対してcommitされた総量
        • GfxDriver
          • 2Dの総量 – renderターゲット
        • FMOD
          • audioがリクエストしたサイズの総量
        • 他の値は使い物になっていない
      • Detailed View
        • Native Memory上のオブジェクト名
        • Native Memory上でアセットをどれくらい消費しているか
    • Memory Profiler
      • 外部ツール
      • BitBucket
        • Assets(VM)
        • Asset(GPU)
        • Managed object(Mono)
          • コンテンツリストの確認
        • オブジェクト参照ができる
        • 相対的サイズの確認が用意
    • Memory Profiler Extension
      • Github
        • Mono Heapのブロックを確認できる
    • Xcode Debug View
      • メモリ管理
        • Dirty Memory + Swapped Memoryだと思われる
        • 黄色いゾーンに入ってきたとき、終了される確率が高まる
    • VM Tracker
      • アプリケーションのメモリの消費量
      • 扱いが難しい
        • www dcのカンファレンスを見る
        • 他のuniteの講演を見る
      • Dirty Memory/Graphics Drive/Mono Heap/Malloc Heapなどの確認が可能
      • いつ、なぜの確認ができない
    • Allocations Instrument
      • stack traceが可能
        • ex) asset bundleのロードの確認、metadataの初期化の確認
        • parsing JSON
      • すべてVM

[Unite2018] パーティクル・マニアクス

公式サイト

http://events.unity3d.jp/unitetokyo2018/session-lineup.html#session28

講演者

Karl Jones (Unity Technologies Software Developer)

SlideShare

資料なし(ライブデモのみ)

概要

  • legacy particlesは2018.3でオワコン
  • particleの新機能紹介

内容

  • Ring Buffer Mode

    • 一番上のタブの下の方に追加
    • パーティクルの最大数
    • 最大以上になると、古いものから消えていく
    • pause until replace
      • フェードアウトして消えていく
    • loop until replace
      • 最大数以上に作れる
      • ゆっくり消えていく
  • Shape Module

    • Shapeモジュール
      • type module -> ping-pong
      • speedを下げていく
    • meshのvertex, edgeから順番に発生させる
  • External Forces Module

    • External Forceモジュール
      • Shape
      • Inner Radius
        • particleが放出されず、途中から発生点に戻る方向に動く
      • Gravity
        • 軌跡の変化を与える
  • Texture Sheet Animation Module

    • 固定FPS
    • minmax勾配なども
    • bake mash機能
      • collisionで利用するなど
  • Line Renderer Editor

    • エディタ上でマウスをクリック&ドラッグで軌跡描画
      • 点のクリックをつなげることも可能
      • 一度作成した点の編集も可能
    • Simple Rendererの設定によって粗さの設定も可能
    • bake meshにより、作成したものをmeshにして再利用することも可能
  • UI Particles

    • textureのマスクを掛けることが可能
  • automatic Culling Enabled

    • cullingによって自動updateがかかる?
    • 見えるparticleのみをupdateさせる
  • Particle System C# Jobs

    • ジョブシステムの統合
    • スクリプト内で直接変数を変更できる

[Unite2018] 実践的なパフォーマンス分析と最適化

公式サイト

http://events.unity3d.jp/unitetokyo2018/session-lineup.html#session24

講演者

Kerry Turner (Unity Technologies Developer Relations Engineer)

SlideShare

https://www.slideshare.net/UnityTechnologiesJapan/unite-2018-tokyo-96352657/UnityTechnologiesJapan/unite-2018-tokyo-96352657

概要

  • プロファイリングのベストプラクティス
  • メモリ消費を抑えるための設定事例
  • tips

内容

  • プロファイリング改善
    • Unity上で特定しない
      • プレイヤが体験するゲームを体験できない
      • メモリの最適化は実機上で変わる
    • 実際のHWでプロファイリングする
    • ゲーム全体でプロファイリングする
      • 全体のリソースの影響を考慮する
    • どの変更がどんな影響が与えたか、変更前と後で確認
    • Unity Profile Windowの利用 CPU資源管理
      • Deep Profiling
      • Profiler.BeginThreadProfiling()
    • Unity Frame Debugger
      • グラフィックAPIに送られたコマンドを調べる
    • Unity Memory Profiler
    • Platform-specific tools
      • OSレベルのプロファイリング
      • Unityツールに対して補完的なもの
        • GPU確認、コアな処理


  • 問題解決
    • ランタイムメモリ利用
      • Asset(texture, oudio)など
      • アセット利用のルールを作る
        • Ex) 特定の解像度以上にしてはいけない
        • AssetPostProcessor
        • 過剰に複雑なassetを使う
          • 完璧な陰影をつけた1セント硬貨的なやつ
          • 利用対効果を考える
        • Read/write enambed texture
          • 2個のテクスチャ
            • GPU
            • CPU用(余分)
              • CPU用のメモリを解除してメモリ効率を半減
          • Texture 2D
            • デフォルトでenable
            • Readonlyにする
              • Texture2D.Apply(updateMipmaps, true)
        • Mip map
          • 33%のテクスチャサイズの増加
          • デフォルトでtrue
          • カメラの距離が変わらないならdisable
            • Ex) UIなど
        • Read/write enabled mashes
          • GPU
          • CPU用
            • メッシュサイズを倍以上にしてしまう
            • Enableにするとき
              • コード上でメッシュにアクセスする場合
                • mesh colliderでマイナスのscale
                • mesh colliderでmeshをななめに利用
          • mesh.UploadMeshData(true);
            • readonlyにする
        • Vertex Compression
          • player settingで指定
            • 頂点チャネル数を指定
            • ただし精度は多少落ちる
            • 静的バッチ含め全てに適用される
            • 上書きされている場合は無効
              • 上書きされる条件
                • import設定
                  • mesh compressionで設定されている
                  • meshのread/writeがenableのとき
        • animation compression
          • 出来る限り設定する
          • animation compression errorの調整により精度の調整も可能
          • デフォルトはoff
            • legacy clipのとき
              • keyframe reduction
            • generic and humanoid clipのとき
              • optimal
        • audio load type
          • 推奨設定
            • streaming if > 1 MB
            • compressed in memory if > 200KB and < 1MB
            • decompress on Load if < 200KB
              • 解答されるバッファサイズが上回ってしまう
      • audio compression format
        • 短いaudio clip、圧縮率がそこまで必要ない
        • 長いaudio clip
        • 100%クオリティでやりたい
          • MP3
      • load times
        • GetScriptingClass()
          • MonoManager::GetScriptingClass()がクソ重い
            • 名前をたよりにクラスをアセンブリレベルで探す
            • Unity 2017以降は改善
        • ETC Crunch Texture
          • 非可逆圧縮
            • Unity 2017.3で新しいライブラリで、ETCでも利用可能
            • CrunchテクスチャGPUにアップロードする前にCPUでdecrunch
              • かなり時間がかかる
                • ETC
                  • サイズが大きいが早い
                • ETC Crunch
                  • サイズが小さいが思い
      • animation CPU optimization
        • Unity Animation System for clips if > 300 curves
        • Legacy for clips if < 300 curves
          • ex) UI、チェストを開くなど
          • ただし、ローエンドなコアの場合の結果であることに注意
        • Humanoid or Generic?
          • Humanoid
            • retargeting, IKを使う場合
          • Generic
            • そのた
        • Culling Mode
          • Always Animate(default)
            • すべてのanimationを実行する
          • Cull Completely
            • 何も実行しない
          • Cull Update Transforms
            • transform, retarget IKをスキップ
        • Animator bindings


  • Tips. more talk like this
    • Unite Europe 2017
    • Unity 2016
    • Unite Europe 2016

[Unite2018] ユニティちゃんトゥーンシェーダー2.0使いこなしスペシャル ~こだわりの活用法を紹介します!~

公式サイト

http://events.unity3d.jp/unitetokyo2018/session-lineup.html#session15

講演者

小林 信行 (ユニティ・テクノロジーズ・ジャパン合同会社)
京野 光平 a.k.a. ntny (ユニティ・テクノロジーズ・ジャパン合同会社)
暁 ゆ~き (フリーランス 3DCGキャラクターモデラー)
あいん つばい (フリーランス 3DCGキャラクターモデラー)

SlideShare

https://www.slideshare.net/UnityTechnologiesJapan/unite-2018-tokyo20

概要

  • ユニティちゃんトゥーンシェーダー(UTS) v2.0.4の新機能紹介
    • カラー設定
    • 光源を強調したカラー強調
    • 明色/暗色
    • 光源方向マスク
    • etc
  • モデラーのテクスチャワークフロー
    • 暁 ゆ~き
    • あいん つばい

内容

  • 暁 ゆ〜き
    f:id:turgure:20180611072528j:plain
    絵的な材質感にこだわった効率的なワークフロー
    • Unlit vs UTSv.2
    • High Color Mask
      • 金属部分以外の不要なスペキュラ(光沢)を抑える
    • Rim Light Mask
      • 材質によって光量を調整
      • 服の中に光を入れない
      • 服のシワの表現
    • Mat Cap
      • 金属の反射を環境に合わせる
    • Outline Sampler
      • ローポリモデル特有の髪の分かれ目の汚れを解決
    • UTS_Edge Detection
      • 輪郭・境界の表現


  • あいん つばい
    f:id:turgure:20180611072621j:plain
    Emissiveが印象的なモデル
    • マテリアルのEmissive設定と、Post Processing StackのBloom設定
    • Rimlight Feather Offの効果
      • リム部分のぼかし(feather)をカットしたリムライトを加算
    • Color Map + Emissive Texture
      • ブレードの刃文をEmissive Textureに書き込み
      • 明るい場所はEmissiveの効果が薄い
        • Color Mapで書き込んで表現


  • ntny流UTS2.0使いこなし講座
    f:id:turgure:20180611072804j:plain
    • 描画順トリックは古のテクニック
      • 「髪の上に眉毛」と同じ理屈
      • Light Wave、ステンシルの利用(max用語)
    • 横を向いたときに逆の目が透ける
      • 遮蔽用シールドを内部に配置して解決
    • 白目の陰影も三段強調
    • 口パク


[Unite2018] 誘導ミサイル完全マスター

公式サイト

http://events.unity3d.jp/unitetokyo2018/session-lineup.html#session10

講演者

安原 祐二 (ユニティ・テクノロジーズ・ジャパン合同会社)

SlideShare

https://www.slideshare.net/UnityTechnologiesJapan/unite-2018-tokyo/UnityTechnologiesJapan/unite-2018-tokyo

動画

https://www.youtube.com/watch?v=dOA5MHNamnc

概要

  • 誘導ミサイルのゲーム性について
  • 誘導ミサイルの実装方法
  • 描画テクニック

内容

  • Frustum Culling (視錐台)
    • Frustum Cullingの外側の物体の描画を省略する
    • やり方は? f:id:turgure:20180525113949j:plain f:id:turgure:20180525114002j:plain f:id:turgure:20180525114011j:plain


  • 追尾レーザーの実装
    • 運動方程式
      • y = vt+\frac{1}{2}at^{2}
      • a = \frac{2(d-vt)}{t^{2}}
    • 目標は常に動いている
      • 加速度を常に計算しなおす
    • 必ず命中する
    • 非推奨:線形補間(Linear Interpolation)で実装
    • 応用
      • 初速を与える
      • スクロールを加える
      • 発射直後にゆらぎを加える
      • 着弾時間をずらす
    • 敵が発射する場合
      • 加速度に上限を加える
        • 回避可能
    • 必中とゲーム
      • ロックオンしたら必ず命中させる
      • ロックオンをする
        • 的に方向を向ける
          • ここで駆け引きを作る



  • トレイルの描画
    • 便利テクニック

      • テクスチャの縁の1ドットを透明にする f:id:turgure:20180610183753j:plain
    • トレイルねじれ問題

      • 起きやすい条件
        • ノード間の間隔が狭い
        • トレイル幅が広い
          • 暫定的解決としては幅を狭くすればいい
          • 根本的解決が難しい
            • 折り返しが激しいところを透明にしてしまう


  • 重い処理をなくす方法
    • 昔の話
      • 整数しか使えない
        • 4096を1に(固定小数点方式)
        • 掛け算のたびに4096で割る(12bitシフトは高速)
      • 割り算処理が重い
        • 使わない
    • 工夫

      • \Delta t = 1にする
        • その代わり1秒を60にする
          • 足し算のみで運動方程式が作れる!
            • v += a * Time.deltatime
            • pos += v * Time.deltatime
            • v += a
            • pos += v
      • 加速度計算
        • 常に計算し直す必要がある
          • →2のべき乗時刻のみで行う
            • 割り算をシフト演算で実行可能
          • 動きが変わっているため、最適化とは言わない
          • が、ほとんど見た目は変わらない f:id:turgure:20180610184618j:plain f:id:turgure:20180610184633j:plain
    • 神は二階微分に宿る

      • 加速度を非線形にしても見た目の問題は変わらない


  • iPhone6で動くデモ〜コンピュートシェーダ応用〜
    • コンピュートシェーダを事項する2つの関数
      • SetData   CPU -> GPU
      • Dispatch   GPU -> CPU
    • CPUとGPUの正しい理解
      • CPU
        • 発行:命令を発行したら仕事完了
          • バケツに詰め込んでGPUに送る
          • CPUはGPUの結果を待たない
      • GPU

        • 取得、計算→描画 f:id:turgure:20180610191246j:plain f:id:turgure:20180610191253j:plain f:id:turgure:20180610191259j:plain
      • CPUとGPUの計算のずれ

        • CPU:SetData, Dispatch
          • CPU
            • GPU:exec, shade
        • CPUで実行しても通常シェーダに渡されるデータは同じ
    • 記述
      • 512(8x8x8)並列で実行される
      • 3重のforループの実装想定
[numthreads(8, 8, 8)]
void exec(uint3 id)

1重ループならこうする

[numthreads(512, 1, 1)]
void exec(uint3 id)

f:id:turgure:20180610191705j:plain

  • コンピュートシェーダを使った誘導ミサイル
    • 課題1:ターゲット情報
      • CPU側で毎フレーム更新される
      • ターゲットバッファをCPUで更新
        • setDataで毎フレーム更新 f:id:turgure:20180610193759j:plain
    • 課題2:ミサイルは1つずつ発射される
      • しかしGPUは512並列で実行される
        • 2つの処理に分ける f:id:turgure:20180610194521j:plain
      • ミサイルの静止状態はCPUで管理せざるを得ない
        • 1フレームの最大発射可能数を32とする
          • 生成バッファに有効・無効フラグを追加 f:id:turgure:20180610194800j:plain f:id:turgure:20180610194807j:plain
      • Tips. 乱数もGPUバッファに追加して管理 f:id:turgure:20180610194853j:plain
    • 課題3:ミサイル(Mesh)の描画
      • 情報はGPUにしかない
        • ミサイルバッファをGPUで参照、IDリストのみ送る
      • ミサイル・トレイルを描画
        • Graphics.DrawMeshInstancedIndirect
        • ミサイルごとに軌跡をバッファ
        • 爆発してもミサイルは生存状態を維持
        • 完全に処理が終了するまで f:id:turgure:20180610195103j:plain
      • 実機確認
        • ○50マイクロ秒で動く
        • △最初の動作確認までが長い
          • 簡易シミュレータを作る
    • 課題4:ターゲットの消滅
      • ミサイルよりも先に敵が消滅する場合
        • ターゲットバッファに死亡時刻を追加
        • 現在時刻を毎フレーム送る f:id:turgure:20180610195431j:plain
      • 死亡時刻と現在時刻のズレ(死亡経過時刻>0)
        • 加速度を無効
      • Tips. 時刻は絶対時刻で管理する(並列処理向き) f:id:turgure:20180610195458j:plain
    • 課題5:ターゲットに命中を通知
      • どうしてもCPUにデータを戻す必要がある
        • ComputerBuffer.GetData を使う?
          • GPU処理が終了するまでCPUは処理を停止してしまう
        • AsyncGPUReadback (Unity2018.1, Win)
          • CPUを止めずに非同期リクエストでバッファを取得
          • 運動プログラムで結果バッファを作成
            • 死因・爆破距離なども記述
            • 結果バッファからCPUの状態バッファ更新
              • 死んだミサイルを再利用 f:id:turgure:20180610195512j:plain
    • 課題6:描画バウンド
      • 描画がボトルネックになる
        • コンピュートシェーダを活かす作戦
          • ミサイル総数を16倍の8192発
            • Dispatchの引数を16(GPUの処理速度16倍)
          • 表示は1024発
          • 優先度
            • Frustumの外側の優先度を最低に
            • 近くのミサイルの優先度を高く
              • 優先度でソート
              • Tips. ソートの高速化
                • メモリアクセスを減らす f:id:turgure:20180610195915j:plain
    • 課題7:GetDataの絶望
      • CPUのGPU待ち
      • 呼び出すタイミングをずらす
      • 2フレームに2フレーム分のデータを取得
        • 可能だが、安定させるのは難しい f:id:turgure:20180610195929j:plain f:id:turgure:20180610195933j:plain

[Unite2018] レポートリンクまとめ

Unite2018 Tokyoに参加してきたので、講演メモをアップしていきたいと思います。

自分用ですがもし参考にする人がいれば。

DAY2

DAY3

  • 新機能Shader Graphを使えばプログラミング無しにシェーダーが作れるようになります!

  • スクリプトによるTimelineがっつり拡張入門

  • 運営中コンテンツにおける大型アップデート成功のための考え方とUnity最適化手法

  • Unityの開発サイクルとバグへの取り組みについて

  • スクリプタブルレンダーパイプライン入門

  • Unity 2D機能のアップデートとその周辺