MRが楽しい

MRやVRについて学習したことを書き残す

IL2CPPScriptingBackendでWindowsStoreアプリをコンパイルして実行する

本日は Unity の技術調査枠です。
IL2CPPScriptingBackendでWindowsStoreアプリのコンパイルを行う方法をまとめます。

スクリプトバックエンドとはスクリプトを駆動させる Unity のフレームワークです。
IL2CPPはスクリプトC++ コードに自動変換して駆動させる技術です。
以下の公式マニュアルに図解があります。
docs.unity3d.com

最大のメリットは C++ 化で最適化がかけられるのでアプリのパフォーマンスが上がる点です。
例えば hololens アプリではアプリ起動時間の短縮や SpatialMapping のスキャンも早くなるという話を耳にしました。
早速試してみます。

ビルドを行う WindowsStore プロジェクトを起動します。
今回は hololens の基本設定を行い、SpatialMapping を配置しただけのプロジェクトをテスト用に準備しました。
f:id:bluebirdofoz:20171024034641j:plain

Edit -> ProjectSettings -> Player からプロジェクト設定の Inspector を開きます。
f:id:bluebirdofoz:20171024034648j:plain

OtherSettings 内の Configuration の ScriptingBackend を「IL2CPP」に変更します。
f:id:bluebirdofoz:20171024034656j:plain

File -> BuildSettings からビルドを実施します。
f:id:bluebirdofoz:20171024034705j:plain
このとき、IL2CPP を利用していると Unity C# Projects は選択できません。(変換するので当然ですが)

生成された VisualStudio のプロジェクトを開きます。
以下の il2cppOutput フォルダが作成され、変換が行われています。
後は hololens にインストールして実行するだけです。
f:id:bluebirdofoz:20171024034717j:plain
docs.unity3d.com


さて私の環境では VisualStudio のビルドで、幾つかセットアップとエラー対処が必要になりました。
以下に各問題の対処内容をまとめます。

まず、C++ のプラットフォームツールのインストールを求められました。
f:id:bluebirdofoz:20171024034823j:plain
VisualStudio のインストール時に選択していなかったので当然ですね。
画面に従ってインストールを実行すれば問題ありません。
f:id:bluebirdofoz:20171024034834j:plain

次に hololens へのインストールでリモート実行を用いる場合の指定方法です。
il2cppOutput ではなく、ビルド元のプロジェクトを選択した状態にします。
メニューから プロジェクト -> プロパティ でプロパティウィンドウを開きます。
構成プロパティ -> デバッグ を開き、コンピュータ名を設定します。
f:id:bluebirdofoz:20171024034852j:plain

プラットフォームツールセットが v140 未満だとビルドエラーが発生するようです。
この場合はソリューションを右クリックし、ソリューションの再ターゲットをクリックします。
f:id:bluebirdofoz:20171024034900j:plain

ソリューション操作の再ターゲットダイアログが表示されます。
プラットフォームツールセットのターゲットが v140 以上であることを確認して「OK」をクリックします。
f:id:bluebirdofoz:20171024034908j:plain

ターゲットの Runtime バージョンが 10.0.16299.0 以上の必要があるという配置エラーが発生します。
f:id:bluebirdofoz:20171024034916j:plain

hololens の SDK をアップデートする手段がないのでターゲットの最小バージョンを 10.0.10240.0 に再設定します。
メニューから プロジェクト -> プロパティ でプロパティウィンドウを開きます。
構成プロパティ -> 全般 を開き、ターゲットプラットフォームの最小バージョンを設定します。
f:id:bluebirdofoz:20171024034943j:plain

以上で、ビルド、配置ともに成功します。
無事、hololens 上でアプリが動作しました。
f:id:bluebirdofoz:20171024035109j:plain


……が、.NET 版も用意して比較しても体感ではあまり差は感じられず。。
何か間違った?それとも最適化の効果がでるほど複雑なプロジェクトを組んでないから?
効果については色々なアプリでパフォーマンスチェックしてみる必要がありそうです。

なお、IL2CPPを用いることのデメリットは以下の2点です。
・.NET と比較してビルドに時間がかかる。
・Unity ビルドの時点で Unity C# Projects が選択できないため、VisualStudio での修正が難しい。

デバッグなどのトライ&エラーを繰り返すときは .NET を使い、最終的なリリース時に IL2CPP を用いるのが良いでしょう。
ただし物によっては IL2CPP の変換が上手くいかないコードがあるようなので、その点も注意です。


また、Unity の WindowsStore ビルドで IL2CPP を使うにはパッケージのインストールが必要です。
Unity をインストールする際に以下の Windows Store IL2CPP Scripting Backend を有効にしておきます。
f:id:bluebirdofoz:20171024035200j:plain