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() が呼ばれ、終了処理が完了するまでブロックするので注意してください。
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インスタンス毎に保持されます。初期値は通常終了モードです。