Hololensでの開発で知っておくと便利なこと(De:code 2017取込み分追記）

# Hololensでの開発で知っておくと便利なこと

<font color="Red">De:Code 2017で得た追加の情報を付加しました。追加分は「(De:Code 2017)」を追記しています。</font>

Hololensのハンズオンセミナーで得たちょっと便利なことを整理します。Hololensでの開発で知っておくといいなと思った内容を自分の備忘録もかねているためすべてを網羅しているわけではありませんが参考になれば幸いです。

※時々忘れないほうがいいものは増やしていきます
## 情報源
- 2/4(土)開催「[Osaka HoloLens Meetup vol.1](https://hololens.connpass.com/event/47003/)」
- De:code 2017のHoloLens関連のセションなどから
## 環境
今回記載している内容については以下の環境での話になります。

- Visual Studio 2015 Community Edition update 3
- Unity 5.5.0P2 Personal
- HoloToolkit-Unity-1.5.5.0

## 覚えておくと便利なこと
### 実装/環境周り
実際の開発や動かしていた時に参考になる情報。
#### Unity関連
UnityでHololensアプリケーションを開発するときのちょっとしたTips。

- Hololensのスイートスポットは大体2m付近<font color="Red">→2Dアプリを操作するのに適した距離感はこの値。(De:Code 2017)</font>
- <font color="Red">仮想の物体を置くのに適している範囲は1.25m～5m。これは、仮想の物体を触れない位置に置くことを考慮している。手に届く範囲に置くと触ろうとしてしまう利用者の混乱を避けるため(De:Code 2017)</font>
- 現実世界と仮想で作った物体を両方注視する場合はHoloLensから2m以上離れた状態を維持すること(2017/3/18追記)[^1]。
- Unityでの1Scaleは現実世界での1m相当。
- HololensToolkit-Unity使うとHololensのアプリケーションを作るのは相当簡単になる。ただし、そこそこ変更頻度が高いので過去の記事は情報が古くて使えない場合がある。
- Hololensでは黒色が透過扱いになるなので、「Main Camera」の設定で「Clear Flags」を「Solid Color」にした上で黒にしておくのが基本。

#### UWP関連
- UWPのライブラリはHoloLensでも利用可能
- UWP側のライブラリでデバイス等リソースを利用する場合はPackage.appxmanifestでリソースに対する設定が必要
- <font color="Red">手書き(Ink)や、文字認識(OCR)、音声解析等UWPで標準提供されるものはOSにインストールされてる言語ライブラリに依存しているためHoloLensでは日本語用に使うことはできない(De:Code 2017)</font>

#### <font color="Red">パフォーマンス関連(この節はDe:Code 2017で追記)</font>
<font color="Red">HoloLens自体はそれほどスペックの高いPCではないので色々注意が必要。</font>
##### <font color="Red">性能として意識が必要な要素</font>
<font color="Red">HoloLensの体験を楽しむための性能指標的な話。一言でいうと極端な
性能劣化を起こさないようにほどぼどのパワーで使いこなすという形です。</font>

- <font color="Red">3Dアプリについては60FPSを目指す。</font>
  - <font color="Red">ただしVR機とは異なりHoloLensでは多少のフレーム落ちはOK。現実世界が透過されているためVR酔いが発生しにくい。</font>

- <font color="Red">電力消費量を極力抑える。</font>
  - <font color="Red">デバイスポータルから見れるPeformanceのデータの内１分平均の電力消費量をラインを6割程度（グラフのオレンジのライン以下）で運用できるようにする(注：60fpsを維持している状態で)。</font>

- <font color="Red">メモリは900MB未満</font>
  - <font color="Red">HoloLensは１アプリのメモリ使用量が900MB未満という制約がついている。 </font>

##### <font color="Red">実装時に気を付けたほうがいい要素</font>

<font color="Red">パフォーマンス関連は色々聞いているとUnityとC#で分かれる。共通して言えることはいかにして無駄なオブジェクトの生成やロジックを避けてアプリを構築するかになります。HoloLens関係なく知っておいたほうがいいことがおおいです。余計なGCを避けながら処理プロセスを軽量化する話が多かったです。</font>

- <font color="Red">できるだけオブジェクトの使いまわしをする(C#/Unity)。</font>
  - <font color="Red">不用意に生成→破棄を繰り返すと不要なオブジェクトが急増しGCの発生を招く。</font>
- <font color="Red">構造体をなるべく使う(C#/Unity)。</font>
  - <font color="Red">C#では構造体は値型として扱われ、GCの対象から外れる。不要になった構造体は参照を外せば廃棄される。</font>
- <font color="Red">LINQ、lambda式を使わない(C#/Unity)。</font>
  - <font color="Red">LINQ、Lamdba式は動作時には内部で一時的なインスタンスを生産しやすい機能なのでGCを誘発する。</font> 
- <font color="Red">GetHashcodeはリフレクション使うので避ける(C#/Unity)</font>
  - <font color="Red">リフレクション（動的呼び出し）は言語の機能としてもかなりコストがかかる（高負荷）</font>
- <font color="Red">foreachよりはforを使う(C#/Unity)。</font>
  - <font color="Red">foreachは内部でイテレーターを回す処理をする際の演算が多い。要素数が明ならfor文で回すほうが処理はスマートになる。</font>
- <font color="Red">FixedUpdateは使わない。</font> 
  - <font color="Red">FixedUpdateは決まった間隔で必ず処理が呼び出されるためFixedUpdateの処理に時間がかかると処理が畳込まれて遅くなっていく。</font>
- <font color="Red">階層が深いオブジェクトの移動は避ける</font>
  - <font color="Red">大量の再計算が走るため。</font>

#### UWPとUnityのスレッドの関係
UnityからUWPのアプリケーションをビルドして作成するUWPアプリケーションではUWPのみで開発したアプリケーションと動作するスレッドが異なる。このため、これを意識した実装を行わないと例外が多発する。


#### Hololensの空間情報
Hololensを利用している際の空間情報の管理についてのTips。

- Hololensでの空間情報は接続する無線LANの環境毎に記録される（SSID単位）
- 例えば自宅と職場で別のSSIDでの接続でHololensを利用しているとそれぞれ別の空間情報として持っている。このため、自宅で開きっぱなしのウィンドウは自宅の空間には存在するなどしてる。
- 逆言えばデザリングでつないでいるとどこでも空間情報としては同一のものがつかわれる？
- 空間情報はメニューを開き「Settings」-「System」-「Spaces」で確認できる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/9e2c3fd6-e608-67b8-8fc1-e2654bed4683.png)



　・なんとなく画面のオブジェクトがずれていると感じるときは空間情報をいったん削除して再作成すると直る場合がある。削除方法は上記画面で消したい空間情報をタップすると削除可能

#### Visual Studioを使った開発
HololensのアプリケーションをUnityとVisual Studioで開発する際のTips。
実際のHololensの開発ではUnity<-->Visual Studioの相互開発になる。この時Visual Studioのソリューションファイルは複数できるので、取扱い注意。区別する方法は以下のとおり。

##### Unity用ソリューションファイル
Unityで追加したC#などのソースコードを修正する際に利用されるVisual Studioソリューションで、このソリューションを開いた場合は、展開先が「Unityにアタッチ」となっている。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/5c764923-ec3a-cc74-7a5e-9d8ad2851259.png)

##### UWP用のVisual Studioソリューション
UnityのBuildによって出力されるUWP用のソリューションファイルでこの場合は、展開先が「Device」などになる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/53e940d5-750d-460c-dbef-135c412e9606.png)

#### Hololensでの動きを共有したいなど
Hololensの感動を共有しようと思っても基本Hololensは1人用でかぶった人以外は全く蚊帳の外になります。なおハンズオンでも当人たちはHololensでいろいろ見えているので楽しんでましたが、それを見てる人たちはいい大人がなにか動き回ってるという状況にしか見えない異様な光景が展開されます。このようなときはDevice Portalが利用可能。~~有線接続ではありますが、~~Hololensの各種情報をPC側から確認できるようになり、MR状態のLiveViewなどもPCから見れるのでこれを利用して間接的にMRの体験が可能になります。ポータルに接続すると以下のようなサイトが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/a7fec4cb-cbcc-60b2-2427-6b2e7aed4282.png)
設定が少し必要ですが以下の手順で実施可能。

##### Hololensでの設定
###### Device Portalを有効にする。
Hololensのメニューを開き「Setting」-「UPDATE&amp;SECURITY」開き「For Developers」を選択
。一番下のほうに「Device Potal」についての設定があるのでそこをオンにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/49ecc1fe-61a7-5089-8563-6fb40a23cbe3.png)


###### PC側での操作（USBケーブル接続時）
1.HololensをUSBケーブルで接続する。
2.ブラウザから「127.0.0.1:10080」にアクセスする。
3.PINとユーザ名、パスワードの設定を行う(初回のみ)
4.ユーザ名、パスワードを入力しポータルにログインする。

###### PC側での操作（Wifi接続時）
1. Hololensと対象のPCを同じネットワークに参加させる。
2. ブラウザから「https://[HoloLensのIPアドレス]」にアクセスする。
3. 証明書のエラーが発生した場合は、無視して接続を続行する。
4. PINとユーザ名、パスワードの設定を行う(初回のみ)
5. ユーザ名、パスワードを入力しポータルにログインする。

PINについてはアクセスと同時にHololens側にPINが表示されるのでその値を入力します。2回目以降はユーザとパスの入力のみでログインできます。このサイトからはHololens内のデータの参照や、Live Viewや動画の撮影、アプリのデプロイなどが実施可能。

[^1]: https://developer.microsoft.com/ja-jp/windows/holographic/hologram_stability