シリーズ第3弾はCPU,GPUなどのパフォーマンス!
第1弾:デザイン
第2弾:物理環境(空間マップとか)
第3弾:最適化(CPU,GPUなど)
- MRTKとは
- Profiles
- Hololens1のアプリをHololens2に対応させる
- Unityの推奨設定
- MRTK Standard Shader
- Input overview
- デバイスのメッシュオブザーバーの構成
MRTKとは
ここらへんはHubsで体験できるね。
MRTK.Examples.Hub_v2.3.0のデモ16個全部やった【Hololens2】 - トマシープが学ぶ
入力記録などのツールもあるらしい
サンプルアプリもあるって
GALAXY EXPLORERは元から入ってたけど、元素表記表は自分でビルド済みアプリを入れたほうが良さそう。
遊んだ
専用Slackもある。リンクから参加できるけど全部英語だったので抜けた・・・
Profiles
MRTKの細かい設定はプロファイルで行う。
デフォルトだと「DefaultMixedRealityToolkitConfigurationProfile」というVRもHolo12も対応しているプロファイル。
「DefaultHoloLens2ConfigurationProfile」はHololens2用
デフォルトとの違い
無効な機能:
- 境界システム
- テレポートシステム
- 空間認識システム
- ハンドメッシュの視覚化(パフォーマンスのオーバーヘッドによる)
対応システム:
- アイトラッキングプロバイダ
- アイ入力シミュレーション
Hololens1のアプリをHololens2に対応させる
Unity2018とUnity2019の違い
Unity 2018 LTS | Unity 2019.x |
---|---|
ARM32ビルドのサポート | ARM32およびARM64ビルドのサポート |
安定したLTSビルドリリース | ベータ安定性 |
.NET Scriptingバックエンドは 非推奨 | .NET Scriptingバックエンドが 削除されました |
廃止予定の UNETネットワーキング | 廃止予定の UNETネットワーキング |
Unityプロジェクトに入っているDLLがARM64でビルドできない場合は2018を使うべし
IL2CPP
.NETでなくIL2CPPを使おう!でもIL2CPPはビルド時間が長くなるので最適化するために開発者のマシンをセットアップする必要がある。
- インクリメンタルビルド
インクリメントビルドを行うには、(ターゲットディレクトリを削除せずに) 以前のビルドロケーションと同じ場所にプロジェクトをビルドします。(上書きでビルドするということ?)
- プロジェクトとビルドフォルダーをマルウェア対策のソフトウェアスキャンから除外
WIndowsDefenderを無効にする。40~66%ビルド時間が減少した
- SSDにプロジェクトとビルドデータを格納
HDDよりいいよ!
キャッシュサーバーを設定するのもよい
ARM
Unity 2018 LTSはARM32、Unity 2019.xはARM32およびARM64アプリのコンパイルをサポートします。
パフォーマンスには実質的な違いがあるため、ARM64アプリケーション向けの開発が一般的に推奨されます
アプリケーションのすべてのDLL依存関係を確認します。プロジェクトから不要になった依存関係を削除することをお勧めします。必要な残りのプラグインについては、それぞれのARM32またはARM64バイナリをUnityプロジェクトに取り込みます。
ベストプラクティス
・MRTK標準シェーダーを使う
・デフォルトのMRTK UX(ボタン、スレートなど)を使用
・サンプルシーン、特にHandInteractionExamples.sceneを確認
・Quad、コライダー、およびTextMeshProテキストを使用。uGUIのcanvasは△
・深度バッファ共有を有効にするか、フォーカスポイントを設定
・SinglePass Instances
・DefaultHoloLens2ConfigurationProfile使用
x86→ARM
・すべてのUnityネイティブプラグインをVisual Studio 2019にアップグレードしてから、ARM用に再ビルドする必要があり
・アプリケーションが必要なプラグイン用のUWP / ARMプラグインが存在しないことがあります。プラグインプロバイダーに連絡して、問題を解決し、ARMのサポートを提供してください。
・_asm命令はARMでは機能しない
・ARMではSIMD命令セットはサポートされていません。ARMでは、xmmintrin.h、emmintrin.h、tmmintrin.h、immintrin.hなどのさまざまなヘッダーが使用できないためです。
・ARMのシェーダーコンパイラは、シェーダーが読み込まれた後、またはシェーダーが依存しているものが変更された後、最初の描画呼び出し中に実行されるので、フレームレートへの影響が顕著になる場合があり
Unityの推奨設定
他の記事と被っている部分が多い
・Unity Quality設定をVery Lowに変更する
・RealtimeGlobalIlluminationをオフにする。シーンごとに設定しないといけない
XRSettings
透明マテリアル
透明オブジェクトやテキストオブジェクトは一般的に深度をレンダリングしない。
MRTKシェーダーを透明にしたら警告が出る。FixNowを押す
Customになっていい感じになる。
(アルファ0状態で真っ白にしても透明にならないのに、明るさを落とすと透明になった!どういう状態なんだろう?)
そもそもHololensなら半透明は白と黒の割合で変えたほうが良さそう。
ハンドメッシュがQuadの奥だと表示されない。これも深度に関係あるのかな?
スプラッシュイメージ
通常のUnityロゴスプラッシュ以外に、WindowsだとWindowsHolographicスプラッシュがあるって!
ウサギを設定しているOnTrackingLossPause~はトラッキングロストしたときに出る。デフォルトだと山の形の画像が出てる
これを自分で設定できる。
移動はしないコンテンツで、追跡ロストの時に中断しなくていいなら、OnTrackingLossPause~のチェックを外す。
Capability
能力 | 機能を必要とするAPI |
---|---|
SpatialPerception | SurfaceObserver |
ウェブカメラ | PhotoCaptureおよびVideoCapture |
PicturesLibrary / VideosLibrary | PhotoCaptureまたはVideoCapture(キャプチャされたコンテンツを保存する場合) |
マイクロフォン | VideoCapture(オーディオをキャプチャする場合)、DictationRecognizer、GrammarRecognizer、KeywordRecognizer |
InternetClient | DictationRecognizer(およびUnityプロファイラーを使用) |
MRTK Standard Shader
fluentDesignSystemにのっとっている。
サンプルはここで見れる
UnityStandardとの比較もある Unity← →MRTK
レンダリングモード
6つある
Opaque | (デフォルト)透明な領域がない通常のソリッドオブジェクトに適しています。 | |
Cutout | 不透明な領域と透明な領域の間にハードエッジを持つ透明な効果を作成できます。このモードでは、半透明の領域はなく、テクスチャは100%不透明または不可視です。これは、透明度を使用して、植生などのマテリアルの形状を作成するときに役立ちます。 | |
Fade | 透明度の値を使用して、オブジェクトのスペキュラハイライトや反射など、オブジェクトを完全にフェードアウトできます。このモードは、オブジェクトがフェードインまたはフェードアウトするアニメーションを作成する場合に役立ちます。反射やハイライトもフェードアウトするため、透明なプラスチックやガラスなどのリアルな透明マテリアルのレンダリングには適していません。 | |
Transparent | 透明なプラスチックやガラスなどのリアルな透明素材のレンダリングに適しています。このモードでは、マテリアル自体が(テクスチャのアルファチャネルとティントカラーのアルファに基づいて)透明度の値を取ります。ただし、実際の透明なマテリアルの場合と同様に、反射と照明のハイライトは完全に明瞭に表示されます。 | |
Additive | 前のピクセルカラーと現在のピクセルカラーを合計する加算ブレンドモードを有効にします。これは、透明度の並べ替えの問題を回避するために推奨される透明度モードです。 | |
Custom | レンダリングモードのあらゆる側面を手動で制御できます。高度な使用のみ。 |
Cull Mode
基本的にBackにするのかな?両面必要な場合はOff。後ろ側だけ見せたいときがfront?
Off | フェイスカリングを無効にします。カリングは、両面メッシュが必要な場合にのみオフに設定する必要があります。 |
Front | 前面カリングを有効にします。 |
Back | (デフォルト)背面カリングを有効にします。レンダリングのパフォーマンスを向上させるには、できるだけ頻繁に背面カリングを有効にする必要があります。 |
パフォーマンスとライティング
MRTKシェーダーのほうがパフォーマンスめっちゃいいよ!
ライトは正確に計算するのではなく疑似的に使用しているので軽いよ
・Directional Light
シーン内の最初のUnity Directional Light(有効な場合)の方向、色、強度を考慮。動的ポイントライト、スポットライト、またはその他のユニティライトは、リアルタイムライティングでは考慮されません。
・球面調和関数
シェーダーは、有効になっている場合、球面プローブを使用してシーン内のライトを近似するためにライトプローブを使用します。球面調和関数の計算は、計算コストを削減するために頂点ごとに実行されます。
LWRP
LWRPに対応している。
メニューからアップグレードしたらマテリアルのエラーが消える
uGUI
MRTK標準のシェーディングシステムはUnityの内蔵UIシステムと連動します。Unity UIコンポーネントでは、unity_ObjectToWorld行列は、Graphicコンポーネントが住んでいるローカルトランスフォームの変換行列ではなく、その親Canvasの変換行列となります。多くのMRTK/Standardシェーダ効果では、オブジェクトのスケールを知る必要があります。この問題を解決するために、ScaleMeshEffect.csは、UIメッシュの構築中にUVチャンネルのアトリビュートにスケーリング情報を格納します。
余計なSourceImageは消したほうがいい。
輪郭
スクリプトでつけている。
MeshOutline.csをつけて輪郭用のマテリアルをセットする。
複数オブジェクトをまとめて付けたいときは、親にMeshutlineHierarchy.csをつけると、Unity
Input overview
InputDeviceの切り替わりは自動で検知される(WinMRのコントローラーやゲームパッドなど)
入力イベントの取り方にはいろいろある。
デバイスに依存しない処理はPointerイベント
MRTKにはデバイスに依存しない方法で入力状態を直接問い合わせるための便利なメソッドがいくつか用意されています
こっちは依存する
デバイスのメッシュオブザーバーの構成
空間メッシュの設定???MRTKのSpatialAwareness設定
GeneralSetting
自動で実行するか。update間隔は一般的な値は、0.1〜5.0秒の範囲
オブザーバーの形状
Physics Settings
Unityにレイヤー作ってるよ!
空間メッシュデータの詳細さ
-
Coarse -アプリケーションのパフォーマンスへの影響が小さく、ナビゲーション/飛行機の検索に最適です。
-
Medium -大規模なフィーチャ、床と壁、およびオクルージョンの詳細の両方について環境を継続的にスキャンするエクスペリエンスに役立つバランスの取れた設定。
-
Fine-一般に、アプリケーションのパフォーマンスへの影響が大きいため、オクルージョンメッシュに最適です。
-
Custom -アプリケーションがTriangles / Cubic Meterプロパティを指定する必要があり、アプリケーションが空間メッシュオブザーバーの精度とパフォーマンスへの影響を調整できるようにします。
DisplaySettings
ユーザーが空間メッシュを見えるようにするか
None - オブザーバはメッシュをレンダリングしません。
Visible - メッシュデータは、可視マテリアルを使用して可視化されます。
Occlusion - メッシュデータはオクルージョンマテリアルを使用してシーン内のアイテムをオクルードします。
デフォルトでVisibleになってたけど、表示されてないよ??