3. NetZの初期化・終了

3.1. NetZの初期化

NetZを初期化するにはNetZインスタンスを生成します。 NetZインスタンスは、 セッションごとに作りなおす必要があります。

6. で説明する Session::CreateSession() 、 Session::JoinSession() の処理に失敗した場合でも、 再度セッションに参加するにはNetZインスタンスを作りなおす必要があるので注意してください。

インターネット通信で NetZ を使用する場合は別途NATトラバーサル機能の初期化が必要になります。 その場合の初期化方法は 4. を参照してください。

3.2. NetZの終了

NetZの終了処理を行うには、NetZ::Terminate() を呼び出し、NetZインスタンスを破棄します。

NetZ::Terminate() は通信環境によっては、処理開始から完了まで5秒程度かかることがあるため、 アプリケーションがその間、何も描画を更新せず止まる状態になる実装は避けてください。 NetZ::Terminate() を呼び出さずにNetZインスタンスを破棄しようとした場合、 デストラクタ内部でNetZ::Terminate() が呼ばれ、終了処理が完了するまでブロックするので注意してください。

Code 3.1 CallContextを使用したブロッキングしないNetZ::Terminate() の呼び出し
CallContext cc;
NetZ::GetInstance()->Terminate(&cc);
while (1) {
    // アプリケーションの処理
    SampleAppUpdate();
    // NEXの処理実行
    Scheduler::GetInstance()->DispatchAll();
    // NetZ::Terminateの完了チェック
    if (cc.GetState() == CallContext::CallInProgress) {
        continue;
    }
    break;
}

注意

NetZ::Terminate() によって、複製オブジェクトが破棄されます。 アプリケーションによる参照が残っていていも、強制的に破棄されます。 そのため、NetZ::Terminate() 終了後に、複製オブジェクトへの参照が行われないようにしてください。 必ず、NetZ::Terminate() 呼び出し前に、すべての複製オブジェクトへの参照を解放してください。

3.3. 複製オブジェクトのマイグレーション

NetZ::Terminate() を呼び出すと、ローカルステーションがDOマスターである複製オブジェクトを、他のステーションに移譲(マイグレーション)します。 このマイグレーションは、最大4.2秒間行われ、NetZ::Terminate() の処理時間の主な要因となります。

通信環境が悪い場合など、マイグレーションが時間内にできない場合があります。 その場合は、マイグレーションされずにNetZの終了処理が行われます。 通信環境によっては、リモートステーションとの通信が正常に行われないため、マイグレーションは保証されません。

そのため、必要であれば複製オブジェクトの障害回復機能を有効にして、他のステーション間で複製オブジェクトのDOマスターを選出できるようにしてください。 複製オブジェクトの障害回復機能については、 12.8. を参照してください。

3.4. 処理時間

マイグレーション以外の処理に、1秒程度の時間がかかる場合があります。 マイグレーションと合わせると、NetZ::Terminate() は最大5.2秒程度の処理時間となります。 これはNEX以外の処理負荷が無い場合です。

NetZ::Terminate() の完了を待つ間は、 処理待ち中の表示を行うなど、アプリケーションがその間、何も描画を更新せず止まる状態になる実装は避けてください。

なお、DOマスターである複製オブジェクトを持たない場合や、マイグレーションが素早く完了する場合であれば1秒程度で処理が終了します。 また、後述の強制終了モードになった場合は、1秒程度で処理を終了します。

3.5. 強制終了モード

ホストの権限やマスター権限を他のステーションへ移譲する処理が不要な特定条件下で、 NetZ::SetTerminateImmediately()が強制終了モードになることで、NetZ::Terminate()を素早く終了させることができます。

強制終了モードの場合は、1秒程度で処理を終了します。 ただし、通常の切断処理が行われないため、通信相手にはキープアライブのタイムアウトが発生してこちらのステーションがネットワークから切断されたように見える場合があります。 そのため、通常の終了シーケンスで設定することは控えてください。

NetZ::SetTerminateImmediately()が強制終了モードになる条件は以下通りです。

  • ホストがSession::GameOver()を呼び出してセッションを終了した場合。
  • ホスト以外では、ホストのSession::GameOver()の呼び出しを受けて、Session::CheckGameIsOver()がtrueを返す場合。
  • 明らかにネットワークから切断されている時や自分以外のステーションがいない時に、Session::DestroySession()の呼び出しでセッションを離脱する場合。

注意

Session::DestroySession()は使用可能な条件が限定されるため、使用には注意してください。 親と子を含めた P2P セッション全体を強制終了させたい場合は、Session::GameOver()を使用してください。

Session::GameOver()、Session::DestroySession()についてはAPIリファレンスを参照してください。

強制終了モードは、NetZインスタンス毎に保持されます。初期値は通常終了モードです。