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