ニューラルネットワーク・モデルのプリロード( Neural Network Model Preloading)の 使い方
メッシングやデプスなどの認識機能は、ARセッションで各ピクセルをどのように描画するかを知るためにニューラルネットワークモデルを使用します。 実行時のパフォーマンスを向上させるために、モデルのプリロードにより、前もってモデルファイルをダウンロードすることができます。これにより、インストールプロセスをフロントローディングし、ユーザーエクスペリエンスに悪影響を与えるジャストインタイムのロード遅延を回避することができます。

前提条件
- Lightship ARを有効にしたUnityのプロジェクトが必要です。 詳細については、 ARDK 3.0 のインストール をご覧ください。
Neural Network Performance Modes
Lightshipのアウェアネス機能は、さまざまなパフォーマンスモードをサポートしており、開発者はパフォーマンス、品質、またはバランスの取れたミックスを選択することができます。 これらのモードは、 XROcclusionSubsystem
で使用される Unity EnvironmentDepthMode 値 に類似しています。
例えば、 Fast
は、品質を犠牲にして処理時間を短縮するように最適化し、 Smooth
は、最高のグラフィックを提供するために時間をかけます。 各モードは、AR機能を使用する前にプリロードできる独自のニューラルネットワークモデルファイルを持っています。 独自のニューラルネットワークモデルファイルを指定する場合は、 RegisterModel
を使用して、Lightshipの定義済みのモデルをオーバーライドできます。
機能モードを要求するには、アウェアネス機能を開始する前に機能とモードを指定します:
DownloadModel(DepthMode.Medium);
DownloadModel(SemanticsMode.Smooth);
Runtime/Utilities/Preloading/Feature.cs
を参照してください。
Lightshipニューラルネットワークモデルのプリロード
アウェアネス機能を開始する前に、ニューラルネットワークモデルファイルをプリロードします:
- アプリケーションのパフォーマンスと品質のニーズに基づいて、プリロードするモデルを決定します。
- プリロードのタイミングを決めます。 プリロードは、AR Foundation が Lightship ローダーを初期化した後(
XRGeneralSettings.Instance.Manager.isInitializationComplete
が true の場合)、アウェアネス機能が開始する前であればいつでも実行できます。 例えば、ARスクリプトがMonoBehaviour
の場合、プリロードはStart()
の間に行うことができます。 :::caution 注意!
プリロードAPIを使用するシーンに、アクティブなARマネージャーが存在しないことを確認してください。 ARマネージャーが存在する場合、関連するモデルは自動的にダウンロードされます。 :::
モデルのプリロードAPIは、Lightship ARセッションが開始した後のランタイム中にのみ利用可能です。 モデルがプリロードされていない場合、アウェアネス機能が起動時に自動的に選択します。
-
以下の手順で、UIオブジェクトが配置された
Canvas
を設定します。- Hierarchy でメインシーンを右クリックし、 UI メニューを開いて、 Canvas を選択します。
- 同じ手順を4回繰り返し、
Button
オブジェクトとText
オブジェクトをそれぞれ2つずつ追加します。 見た目は自由にカスタマイズしてください。
-
プリロードが行われるべきシーンに、空の
GameObject
を作成する:- Hierarchyでシーンを右クリックし、 Create Emptyを選択します。 新しい
GameObject
に ModelPreloader と名前を付けます。
- Hierarchyでシーンを右クリックし、 Create Emptyを選択します。 新しい
-
新しいスクリプトコンポーネントを空に追加する:
- Hierarchy で ModelPreloader を選択し、 Inspector で Add Component をクリックし、新しいスクリプトを追加します。
-
スクリプトの先頭に、UIオブジェクト用のシリアライズされたフィールドを追加します。
[SerializeField]
private Button _downloadButton;
[SerializeField]
private Button _clearButton;
[SerializeField]
private Text _progressPercentText;
[SerializeField]
private Text _statusText; -
Inspector のスクリプトにGameObjectsをアタッチします。
-
プリローダーの非公開フィールドを作成し、ダウンロードするモデルの機能を設定し、状態を追跡するためのブール値を追加します。
Start
メソッドでModelPreloaderFactory
を使用してオブジェクトをインスタンス化します。
private IModelPreloader preloader;
private DepthMode _depthMode = DepthMode.Medium;
private bool _isDownloading = false;
private void Start()
{
preloader = ModelPreloaderFactory.Create();
if (null == preloader)
{
// プリロードはXRの初期化を待ってから行う必要がある
// プリローダーのインスタンス化を後の関数に延期する。
return;
} -
ExistsInCache()
を呼び出して、モデルが既にキャッシュに存在するかを確認し、シーンのステートを設定します。if (!preloader.ExistsInCache(_depthMode))
{
_statusText.text = $"{_depthMode} モデルがキャッシュに見つかりません";
_progressPercentText.text = "0%";
_clearButton.interactable = false;
_downloadButton.interactable = true;
}
else
{
// モデルはすでにキャッシュ内に存在します。 ダウンロードは不要です。
_statusText.text = $"{_depthMode} モデルがキャッシュに見つかりました";
_progressPercentText.text = "100%";
_clearButton.interactable = true;
_downloadButton.interactable = false;
} -
プリローダーでモデルをダウンロードするための
Download
メソッドを作成します。private void DownloadModel()
{
preloader.DownloadModel(_depthMode);
_isDownloading = true;
_statusText.text = "モデルをダウンロード中...";
_progressPercentText.text = "0%";
_clearButton.interactable = false;
_downloadButton.interactable = false;
} -
ダウンロードしたモデルを削除する
ClearCache
メソッドを追加します。private void ClearCache()
{
preloader.ClearFromCache(_depthMode);
_statusText.text = $"{_depthMode} モデルがキャッシュから削除されました";
_progressPercentText.text = "0%";
_clearButton.interactable = false;
_downloadButton.interactable = true;
} -
onClick
リスナーをボタンにアタッチし、対応するメソッドを呼び出します。private void OnEnable()
{
_downloadButton.onClick.AddListener(DownloadModel);
_clearButton.onClick.AddListener(ClearCache);
}
private void OnDisable()
{
_downloadButton.onClick.RemoveListener(DownloadModel);
_clearButton.onClick.RemoveListener(ClearCache);
} -
ユーザーにダウンロードの進捗状況を表示したい場合は、定期的に
CurrentProgress()
を呼び出す。progress
が1.0
の場合、モデルのプリロードは完了します。 使用例:private void Update()
{
if (!_isDownloading)
{
return;
}
var statusCode = preloader.CurrentProgress(_depthMode, out float progress);
if (Mathf.Approximately(progress, 1.0f))
{
// ダウンロードが正常に完了したか、またはモデルがすでにキャッシュ内に存在していた
_statusText.text = $"{_depthMode} モデルが正常にダウンロードされました";
_progressPercentText.text = "100%";
_clearButton.interactable = true;
_downloadButton.interactable = false;
_isDownloading = false;
return;
}
if (statusCode != PreloaderStatusCode.RequestInProgress)
{
// ダウンロードは進行中ではない
_statusText.text = $"現在のステータス: {statusCode}";
_isDownloading = false;
return;
}
_progressPercentText.text = $"{progress * 100.0f}%";
} -
Unityエディターでシーンをテストしたものの、うまくいかない場合は、上記の手順を再度確認してください。