Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

HoloLens参考書読書会 vol9

956 vues

Publié le

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

Publié dans : Ingénierie
  • Soyez le premier à commenter

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

×