Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

HoloLens参考書読書会 vol9

694 views

Published on

「第9回 HoloLens参考書読書会@アカツキ」の発表資料です。

Published in: Engineering
  • Be the first to comment

HoloLens参考書読書会 vol9

  1. 1. Copyright © 2018 TIS Inc. All rights reserved. 戦略技術センター 大島昇時 第9回 HoloLens参考書読書会@アカツキ ch.10 デバッグとパフォーマンス
  2. 2. Copyright © 2018 TIS Inc. All rights reserved. 自己紹介 名前 : 大島昇時 ハンドル : さんすうP @Sansuusetto 所属 : TIS株式会社 戦略技術センター 1
  3. 3. Copyright © 2018 TIS Inc. All rights reserved. ・三菱のグループ会社で、組み込み系エンジニア約4年 ・映像系の中小で、マネージャ、映像制作、VRゲーム制作約3年 ・TISに2018/02入社。xRの研究開発を行う 組み込み系エンジニア・エンタメ系エンジニア・映像制作・ 企画・ディレクションと、結構色々やってきたので、その辺 りの経験を交えつつ、お話していきたいと思います。 2 経歴
  4. 4. Copyright © 2018 TIS Inc. All rights reserved. 今日覚えて帰ること • Debug – Unity + Holo + 一般的な開発でのDebugの基本 • PerformanceTuning – Profilerの見方 – Tuningの基本 3
  5. 5. Copyright © 2018 TIS Inc. All rights reserved. Debug編 4
  6. 6. Copyright © 2018 TIS Inc. All rights reserved. Debug 5 No Debug方法 重要度(5段階) 1 IDE(VisualStudio)でDebugする ★★★★★ 2 HoloをRemoteでDebugする ★★★★★ 3 Logを出力する ★★★★★ 全部大事。この辺りを使いこなせないと確実に開発で躓きます。
  7. 7. Copyright © 2018 TIS Inc. All rights reserved. IDE(VisualStudio)でDebug VisualStudioでUnityEditorにアタッチしてステップ実行する 事ができる。 超使う。これが無いと始まらない。 上記赤枠を押下し、UnityEditorでPlayするだけ。 7
  8. 8. Copyright © 2018 TIS Inc. All rights reserved. IDE(VisualStudio)でDebug 実行を中断したい行でF9を押下すると、ブレークポイントを 設定することができる。 実行中にブレークポイントの箇所が実行される直前に処理を 一時停止し、その時点の変数の値を確認することができる。 F10で次の行まで実行(ステップオーバー) F11で当該行の中で実行される関数の中へ移動(ステップイン) 8
  9. 9. Copyright © 2018 TIS Inc. All rights reserved. HoloをRemoteでDebugす る 9 実機で動かしてDebugしたい場合は「Holographic Remoting Player」を使います。 まずは、HoloLens本体に上記アプリをインストールしま しょう。
  10. 10. Copyright © 2018 TIS Inc. All rights reserved. HoloをRemoteでDebugす る Holo上でHolographicRemotingPlayerを立ち上げた状態で、 以下の通り実行すると、HoloとRemoteで繋がるので通常通 りDebugできます。ビルドしなくていいので楽。 10 IPアドレスを入力した後、 Enterを押下しないとつなが りません 1 2 3 4
  11. 11. Copyright © 2018 TIS Inc. All rights reserved. Logを出力する 問題の発生原因を特定するため、Logは重要です。 しかし、Logを入れなくても機能自体には影響しないため、 意外と軽視されがち。 11
  12. 12. Copyright © 2018 TIS Inc. All rights reserved. Log出力関数の種類 12 ↓いっぱいあるけどどれを使えば?
  13. 13. Copyright © 2018 TIS Inc. All rights reserved. Log出力関数の種類 13 それぞれこんな感じで 出力されます。 GameObjectを指定すると、 Consoleのログをクリックしたとき に、対象のオブジェクトが Hieralky上でハイライトされる
  14. 14. Copyright © 2018 TIS Inc. All rights reserved. 14 Log出力関数の種類 この辺りの設定はDebug.Logで 出力した際にも有効となる
  15. 15. Copyright © 2018 TIS Inc. All rights reserved. 以上のように、Log出力関数自体はどれも大差ないので好き な物を使えば良いと思います。 ただ、私は標準の機能では色々と不便なので、Log出力の Helperクラスを作って使っています。 15 Log出力関数の種類
  16. 16. Copyright © 2018 TIS Inc. All rights reserved. こんな感じ 16 以下の情報が自動的に付加される ・Tick ・ファイル名 ・関数名 ・行数
  17. 17. Copyright © 2018 TIS Inc. All rights reserved. • C#5.0で追加されたCallerInfoを使うことにより メソッドの呼び出し元の情報を取得し、 ログとして出力する 17 仕組み .NETのバージョンが古いと 動かないので、ご注意
  18. 18. Copyright © 2018 TIS Inc. All rights reserved. なんとなくLogを追加しても問題個所の特定にはあまり役に 立たないので、イイ感じにLogを出力したい。 どこで、どんな情報を出力すべきか。 18 Logで問題個所を特定するために
  19. 19. Copyright © 2018 TIS Inc. All rights reserved. 下記表の様に、出力すべきLogの種別を予めプロジェクト内 部で決めておきましょう。 それぞれがなんとなくLogを入れると、それが問題特定の妨 げになることが往々にして起こります。 19 LogLevelを設計する No Level 出力内容 ビルド時 1 Trace Debug時に処理を追いかけるための詳細情報 × 2 Info 正常系の重要な情報・処理結果 〇 3 Warning エラーっぽいけどほんとに大丈夫?という確認 〇 4 Assert 実行時に満たすべき条件の判定結果 × 5 Error 異常系の重要な情報・処理結果 〇 6 Exception IOの失敗等、クリティカルなエラーのException情報 〇 ※上記表は例であり、正解はありません
  20. 20. Copyright © 2018 TIS Inc. All rights reserved. ・パフォーマンス - Update()で毎フレーム出力されるログを出力しない ・セキュリティ(作る物によるが、一般的に) - パスワード等の重要な情報は出力しない - 平文でLogを保持しない ・追跡のしやすさ - 異常系だけではなく、正常系のログも残す 20 Loggingで考慮すべきこと
  21. 21. Copyright © 2018 TIS Inc. All rights reserved. Performance Tuning編 21
  22. 22. Copyright © 2018 TIS Inc. All rights reserved. Tuningの分類 22 大きく分けて下記の2種類がある ・Script ・Graphics ↑ 今回はGraphicsをメインに解説する
  23. 23. Copyright © 2018 TIS Inc. All rights reserved. ここから難しい話をします 23
  24. 24. Copyright © 2018 TIS Inc. All rights reserved. Unityの RenderingPipelineの話 24
  25. 25. Copyright © 2018 TIS Inc. All rights reserved. レンダリングするフレーム毎に、 CPUは次の作業を行う。 1. レンダリング対象の選定 ( 視錐台カリング ( Frustum culling ) ) 2. 描画するオブジェクトの情報を収集し、描画コマンド(DrawCall) 順にソートする。このとき特定条件下でDrawCallをまとめる処理 を行う(Batching) 3. 各DrawCall呼び出し毎にBatchと呼ばれるデータのパケットを生 成する DrawCall:グラフィックスAPI を使用して、 画面に描画を行う際に呼び出す命令の事 25 CPUとGPUの役割
  26. 26. Copyright © 2018 TIS Inc. All rights reserved. Batch毎にCPUは次の作業を行う。 1. GPUに対して次のメッシュのレンダリングに使用する設定をGPU に指示する(SetPassCall)この呼び出しは、次のメッシュが前の メッシュからのレンダリング状態(RenderState)の変更を必要と する場合にのみ送信される 2. DrawCallをGPUに送信する。DrawCallは、最新のSetPassCallで 定義された設定を使用して、指定されたメッシュをレンダリング するようにGPUに指示する 3. Batchに複数のPassがある場合は、レンダリング状態への変更を 必要とするため、CPUは新しいSetPassCallを送信しなければな らず、次にDrawCallを再度送信する必要がある 26 CPUとGPUの役割
  27. 27. Copyright © 2018 TIS Inc. All rights reserved. GPUは次の作業を行う。 • GPUは、送信された順にCPUからのタスクを処理する • 現在のタスクがSetPassCallである場合、GPUはレンダリング状態を 更新する • 現在のタスクがDrawCallの場合、GPUはメッシュをレンダリングす る • 上記プロセスは、CPUから送信されたすべてのタスクがGPUによって 処理されるまで繰り返される 27 CPUとGPUの役割
  28. 28. Copyright © 2018 TIS Inc. All rights reserved. CPU • 描画対象の決定 • GPU用のコマンドの準備 • GPUにコマンドを送信する GPU • CPUから要求された通りレンダリング状態を更新し、 メッシュを描画する まずは、CPUとGPUのどちらがボトルネックとなっ ているのか調べることから始めましょう 28 まとめると
  29. 29. Copyright © 2018 TIS Inc. All rights reserved. Profilerの見方 29 Ctrl+7 or Window->Profilerで出せる
  30. 30. Copyright © 2018 TIS Inc. All rights reserved. 30 Profilerの見方 DefaultではGPUのProfiler が非表示なので出してお くとよい
  31. 31. Copyright © 2018 TIS Inc. All rights reserved. CPU/GPUのどちらに時間がかかっているかで、 ボトルネックが分かる 31 Profilerの見方
  32. 32. Copyright © 2018 TIS Inc. All rights reserved. 32 Profilerの見方 該当の関数、および その関数によって呼 び出される全ての関 数が消費する時間 の合計 該当の関数自体 が消費する時間 どの処理で時間がかかっ ているかグラフィカルに 確認できる
  33. 33. Copyright © 2018 TIS Inc. All rights reserved. 33 Profilerの見方 どのスレッドでどんな 処理をしているのか 確認できる ※重要※ どのスレッドがボトルネックになっているか確認すること
  34. 34. Copyright © 2018 TIS Inc. All rights reserved. VSyncは描画の同期待ちなので、厳密にはCPUの処理ではありま せん。なので気にしなくてよいです。 34 VSyncについて
  35. 35. Copyright © 2018 TIS Inc. All rights reserved. 35 HoloとProfilerを繋ぐ ここにチェックを入れて いつも通りビルドして、 Holoにデプロイする
  36. 36. Copyright © 2018 TIS Inc. All rights reserved. 36 HoloとProfilerを繋ぐ Holoでアプリが動作した後、 HoloのIPアドレスを入力して、 Connectを押下すると実機の パフォーマンスを見ることができる
  37. 37. Copyright © 2018 TIS Inc. All rights reserved. お待たせしました ここからTuningの話です 37
  38. 38. Copyright © 2018 TIS Inc. All rights reserved. Tuningの基本 38 チューニング項目 デザイナー エンジニア 効果 DrawCallを減らす 〇 × ★★★★★ Meshを減らす 〇 × ★★★★★ Texture解像度を下げる 〇 × ★★★★ GameObject(Update)を減らす 〇 〇 ★★ Scriptを調整する × 〇 ★★ Shaderを調整する × 〇 ★★★★★★★★ ★★★★★★★★ ※これは個人の感想です あと作るものによって大きく変わる
  39. 39. Copyright © 2018 TIS Inc. All rights reserved. 前述の表の補足 HoloLensでの開発における、ありがちなチューニング項目 を書いています。 当然、個々のアプリケーションでボトルネックは異なります。 なので表に無い項目がボトルネックとなっている可能性は十 分にあります。まずは、Profilerでボトルネックを見つける ことが重要です。 あと、影響の大きいShadowとかLighting周りとか省いてい ます。 この辺り書くと話が広がりすぎるし、Holoでそんなリッチ な表現やらないですよね? 39
  40. 40. Copyright © 2018 TIS Inc. All rights reserved. ・可能な限りMaterialを減らす →複数のTextureがある場合は、結合して一つのTextureにする ・SkinedMeshRenderを減らす →理想は1キャラにつき1つ ・材質の違いはMapping用のTextureで表現する →MetallicSmoothnessなんかはよく使う ex.革と鉄の材質を1つのマテリアルで表現する等 ・静的なオブジェクトはStaticにする →StaticBatchingが行われることにより、DrawCallが減る 40 DrawCallを減らす
  41. 41. Copyright © 2018 TIS Inc. All rights reserved. • 1キャラにつき、できれば5kポリゴン以内に収める →作るものとデバイスによるので、何とも言いにくいが、 多くとも10k以内にしたい。 41 Meshを減らす
  42. 42. Copyright © 2018 TIS Inc. All rights reserved. • 基本はメッシュの面積に比例してTexture解像度を 増減させ、妥協点を探る →キャラクターの場合、人間は顔に注目しやすいため、 頭の解像度を高くして、それ以外を落とすというのも よく使われている 42 Texture解像度を下げる
  43. 43. Copyright © 2018 TIS Inc. All rights reserved. • 可能であれば、Modelに対して「OptimizeGameObject」 をかけてあげると良い • Scriptは、可能な限りMonoBehaviourを継承しない →Inspectorを使いたいがために、MonoBehaviourを継承するのは非常に無 駄 ちょっと、この辺話すと長くなるので割愛します 43 GameObject(Update)を減らす
  44. 44. Copyright © 2018 TIS Inc. All rights reserved. 44 その他 このチェックは外しておきましょう。 (DefaultはON) これを有効にすると、メモリ消費量が 2倍になります。 有効にする必要があるのは以下の場合 -負のスケーリング((-1、1、 1)など) - シアターランズフォーン(例えば、回転さ せたメッシュにスケルトンした親トラック フォームがある場合)
  45. 45. Copyright © 2018 TIS Inc. All rights reserved. Script・Shaderの 調整は割愛します。 難易度高くなるし、 時間もたりないので。 45
  46. 46. Copyright © 2018 TIS Inc. All rights reserved. こんな事は色々な場所で散々言わ れてるから知ってるけど 具体的にどうやるんじゃ! という人のために。 46
  47. 47. Copyright © 2018 TIS Inc. All rights reserved. <題材> Holoで UnityChanを7体出してみる 47
  48. 48. Copyright © 2018 TIS Inc. All rights reserved. 調整前 48 ※PC上でキャプチャした映像です Batches : 265 SetPassCall: 22 Tris : 220k
  49. 49. Copyright © 2018 TIS Inc. All rights reserved. 49 調整前 ※Holo実機のProfilerです
  50. 50. Copyright © 2018 TIS Inc. All rights reserved. 結果 60FPSを下回る事が多々あり、 頭を動かすと結構カクつく 50
  51. 51. Copyright © 2018 TIS Inc. All rights reserved. 調整後 51 ※PC上でキャプチャした映像です Batches : 71 SetPassCall: 14 Tris : 67k
  52. 52. Copyright © 2018 TIS Inc. All rights reserved. 調整後 52 ※Holo実機のProfilerです
  53. 53. Copyright © 2018 TIS Inc. All rights reserved. 結果 60FPS以上を保ちつつ、 見た目はほぼ変わらない (目立つ破綻を直したのでむしろきれいになった) 53
  54. 54. Copyright © 2018 TIS Inc. All rights reserved. 何をしたか 54
  55. 55. Copyright © 2018 TIS Inc. All rights reserved. ↓前述の表とおなじもの 55 チューニング項目 デザイナー エンジニア 効果 DrawCallを減らす 〇 × ★★★★★ Meshを減らす 〇 × ★★★★★ Texture解像度を下げる 〇 × ★★★★ GameObject(Update)を減らす 〇 〇 ★★ Scriptを調整する × 〇 ★★ Shaderを調整する × 〇 ★★★★★★★★ ★★★★★★★★ ※これは個人の感想です あと作るものによって大きく変わる とりあえず上記3つはどんなプロ ジェクトでもやっておく。 それでも解決しない場合は、色々 大変な思いをすることになる
  56. 56. Copyright © 2018 TIS Inc. All rights reserved. 最適化した結果 56 Batches : 40 SetPassCall: 13 Tris : 31.5k Batches : 12 SetPassCall: 9 Tris : 9.6k Before After 理想は Batch/SetPass それぞれ1です
  57. 57. Copyright © 2018 TIS Inc. All rights reserved. 具体的なやり方 57
  58. 58. Copyright © 2018 TIS Inc. All rights reserved. お土産動画 58 お土産を用意したので 見たい方は下記からご覧ください 又は、YouTubeで「HoloLens参考書読書会」で検索
  59. 59. Copyright © 2018 TIS Inc. All rights reserved. 最後に 59
  60. 60. Copyright © 2018 TIS Inc. All rights reserved. 生兵法は大怪我の基です。 それぞれの責務範囲で 出来る事をやりましょう。 あと、仕様を見直すことも大事です。 無理なものは無理。 60
  61. 61. THANK YOU

×