夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Azure RemoteRendering を動かす その③リモートセッションの作成及び参加

本日は昨日に引き続きAzure RemoteRenderingを勉強していきます。

昨日はAzure RemoteRenderingの遷移状態に関して学びました。

Azure RemoteRenderingではコストが高いため、いくつかの状態遷移を行いながらユーザー自身にセッションへのアクセスを決めさせる必要があります。

この状態遷移は [NotSet]→[NotInitialized(初期化されていない)]→[NotAuthorized(非承認)]→[NoSession(セッション無し)]→[ConnectingToExistingRemoteSession(既存のリモートセッションへの接続)]→[ ConnectingToNewRemoteSession(新しいリモートセッションへの接続)]→[RemoteSessionReady(リモートセッションの準備)]→[ConnectingToRuntime(ランタイムへの接続)]→[RuntimeConnected(ランタイム接続)]の順で進行しリモートレンダリングに接続します。

昨日は[NotAuthorized(非承認)]までの進行を見ました。

redhologerbera.hatenablog.com

今回は第二段階としてセッションへの接続を行います。

ステートマシーン(状態遷移)では[NotAuthorized(非承認)]の後、ConnectingToNewRemoteSessionもしくはConnectingToExistingRemoteSessionのいずれかの状態へ遷移します。

これは既存のセッションへ接続するか、新規でセッションを開始するかということになります。

この状態に移るとOnSessionStatusChangedイベントが発火されます。

これにより状態がRemoteSessionReady(リモートセッションへの準備)へと移行します。

①セッションへ接続するためにJoinRemoteSessionStopRemoteSessionの中身を書き加えます。

    /// <summary>
    /// 現在のセッションへ参加を行うもしくは新しいセッションを開始
    /// </summary>
    public async void JoinRemoteSession()
    {
        //すでにセッションがある場合はそれを使用、ない場合は新たなセッションの作成
        RenderingSessionProperties joinResult;
        if (await IsSessionAvailable(LastUsedSessionID))
        {
            CurrentCoordinatorState = RemoteRenderingState.ConnectingToExistingRemoteSession;
            joinResult = await ARRSessionService.OpenSession(LastUsedSessionID);
        }
        else
        {
            CurrentCoordinatorState = RemoteRenderingState.ConnectingToNewRemoteSession;
            joinResult = await ARRSessionService.StartSession(new RenderingSessionCreationOptions(renderingSessionVmSize, (int)maxLeaseHours, (int)maxLeaseMinutes));
        }

        if (joinResult.Status == RenderingSessionStatus.Ready || joinResult.Status == RenderingSessionStatus.Starting)
        {
            LastUsedSessionID = joinResult.Id;
        }
        else
        {
            //The session should be ready or starting, if it's not, something went wrong
            await ARRSessionService.StopSession();
            if(LastUsedSessionID == SessionIDOverride)
                SessionIDOverride = "";
            CurrentCoordinatorState = RemoteRenderingState.NoSession;
        }
    }

    public void StopRemoteSession()
    {
        if (ARRSessionService.CurrentActiveSession != null)
        {
            ARRSessionService.CurrentActiveSession.StopAsync();
        }
    }

StopRemoteSessionはAzure RemoteRenderingのセッションを終了する際に使用します。

この状態でシーンを実行することでセッションへの遷移が行われ、Unityのシーンを停止することでConnectingToNewRemoteSessionへ遷移することを確認できました。

本日は以上です。