CTR NEX API Reference
nn::nex::Scheduler クラス

ジョブの実行をスケジューリングするクラスです。 [詳解]

#include <OnlineCore/src/Core/Scheduler.h>

+ nn::nex::Scheduler の継承関係図

公開型

enum  DispachFlag {
  ContinueWhenEmpty = 0x01,
  DispatchKeepAliveOnly = 0x02
}
 Dispatch が呼び出されたときにどのように振舞うかを指定するためのフラグです。 [詳解]
 

公開メンバ関数

size_t Dispatch (qUnsignedInt32 uiDispatchTimeout, qUnsignedInt32 uiFlags=0)
 登録されているジョブをタイムアウトを設けて実行します。 [詳解]
 
void DispatchAll ()
 登録されているすべてのジョブを実行します。 [詳解]
 
size_t GetReadyJobsSize () const
 現在 Scheduler が実行可能なジョブの個数を取得します。 [詳解]
 
CriticalSectionSystemLock ()
 システムをロックするためのクリティカルセクションの参照を返します。 [詳解]
 

静的公開メンバ関数

static SchedulerGetInstance ()
 唯一のSchedulerオブジェクトのインスタンスを取得します。 [詳解]
 
static TimeInterval GetInternalThreadDispatchInterval ()
 インターナルスレッドが Scheduler::Dispatch() を呼び出す間隔を取得します。 [詳解]
 
static void SetInternalThreadDispatchInterval (TimeInterval interval)
 インターナルスレッドが Scheduler::Dispatch() を呼び出す間隔を設定します。初期値は 8 ms です。 [詳解]
 

詳解

ジョブの実行をスケジューリングするクラスです。

SchedulerクラスはNEXのジョブを実行するために利用します。 アプリケーションから必ず Scheduler::Dispatch 、または Scheduler::DispatchAll を定期的に呼び出してジョブを実行してください。

このクラスはシングルトンです。 システムによってインスタンスが自動的に作成、解放されます。

列挙型メンバ詳解

Dispatch が呼び出されたときにどのように振舞うかを指定するためのフラグです。

列挙値
ContinueWhenEmpty 

利用できません。

DispatchKeepAliveOnly 

クライアントとの接続を維持するためのキープアライブ信号処理のみを行うフラグです。 これを指定することで、接続が切れることを防ぐことが出来ます。

関数詳解

void nn::nex::Scheduler::DispatchAll ( )

登録されているすべてのジョブを実行します。

この関数を呼び出すと、スケジューラに登録されているすべてのジョブを、空になるまで実行します。 ジョブの登録数が多いと、多くのCPU時間を消費してしまう可能性があります。 フレームレートの揺らぎを防ぐためには、タイムアウトを指定することが出来る Dispatch 関数を利用します。

この関数は必ず定期的に呼び出してください。 レイテンシ(通信遅延)を最低限に抑えるために、以下のようなシーケンスでゲームループを 構成することを推奨します。

  • DispatchAllDispatch の実行(受信想定の処理)
  • 受信データをアプリケーションでハンドリング。複製オブジェクトの場合はすべてDOデュプリカのリフレッシュ(受信データの反映)
  • ゲーム状態の変更(物理計算、AI など)
  • 送信データをセット。複製オブジェクトの場合はすべてのDOマスターの更新(送信データの準備)
  • DispatchAllDispatch の実行(送信想定の処理)
  • レンダリングなどアプリケーション側の処理

もしも極度にブロックするような処理(たとえば画面暗転中のファイルロード)を メインスレッドで実行する場合は注意が必要です。メインループの処理が滞り、 ジョブの実行が行われなくなると、メッセージの送受信に悪影響が出て、 結果的にタイムアウトが発生したと判定されてしまう場合があります。

インターナルスレッドを利用している場合は本関数を呼び出しても何も行いません。

static Scheduler* nn::nex::Scheduler::GetInstance ( )
static

唯一のSchedulerオブジェクトのインスタンスを取得します。

戻り値
Schedulerオブジェクトのインスタンスへのポインタが返ります。
size_t nn::nex::Scheduler::Dispatch ( qUnsignedInt32  uiDispatchTimeout,
qUnsignedInt32  uiFlags = 0 
)

登録されているジョブをタイムアウトを設けて実行します。

この関数を実行すると、登録されているジョブを実行します。 ただし、指定されたタイムアウトが経過した場合、この関数はジョブの実行を中断してゲームに制御を戻します。 実行されなかったジョブは、次回以降Dispatch() を呼び出したときに実行されます。

この関数は必ず定期的に呼び出してください。 レイテンシ(通信遅延)を最低限に抑えるために、以下のようなシーケンスでゲームループを 構成することを推奨します。

  • DispatchAllDispatch の実行(受信想定の処理)
  • 受信データをアプリケーションでハンドリング。複製オブジェクトの場合はすべてDOデュプリカのリフレッシュ(受信データの反映)
  • ゲーム状態の変更(物理計算、AI など)
  • 送信データをセット。複製オブジェクトの場合はすべてのDOマスターの更新(送信データの準備)
  • DispatchAllDispatch の実行(送信想定の処理)
  • レンダリングなどアプリケーション側の処理

もしも極度にブロックするような処理(たとえば画面暗転中のファイルロード)を メインスレッドで実行する場合は注意が必要です。メインループの処理が滞り、 ジョブの実行が行われなくなると、メッセージの送受信に悪影響が出て、 結果的にタイムアウトが発生したと判定されてしまう場合があります。

また、この関数に指定するタイムアウトが短すぎる場合、 登録されていくジョブの数が処理可能なジョブの数を上回ってしまうことがあります。 このとき、いつまで経ってもジョブの実行が先に進まなくなり、 上記のような状況に陥る場合があります。 アプリケーションの仕様とあわせてタイムアウト時間やトラフィック量の調整を行ってください。 残っているジョブの数は Scheduler::GetReadyJobsSize() で確認できます。

タイムアウトは正確な数値ではありません。 ジョブの内容や数、タイミングによって指定した時間をオーバーする可能性がありますのでご注意ください。

インターナルスレッドを利用している場合は本関数を呼び出しても何も行いません。

引数
[in]uiDispatchTimeoutタイムアウトをミリ秒単位で指定します。0 を渡すとタイムアウトがなしになり、Scheduler::DispatchAll() と同様に全てのジョブを実行します。
[in]uiFlagsジョブの実行方式をビットフラグ形式で指定します(デフォルトはフラグなし)。 実行方式については DispachFlag を参照してください。
戻り値
常に 0 を返します。
参照
Scheduler::DispachFlag, Scheduler::GetReadyJobsSize()
static void nn::nex::Scheduler::SetInternalThreadDispatchInterval ( TimeInterval  interval)
static

インターナルスレッドが Scheduler::Dispatch() を呼び出す間隔を設定します。初期値は 8 ms です。

Core::SetThreadMode()Core::ThreadModeInternal もしくは Core::ThreadModeInternalTransportBuffer を設定した場合にこの設定が使用されます。 NEX を初期化する前に設定してください。

引数
[in]intervalScheduler::Dispatch() を呼び出す間隔
static TimeInterval nn::nex::Scheduler::GetInternalThreadDispatchInterval ( )
static

インターナルスレッドが Scheduler::Dispatch() を呼び出す間隔を取得します。

戻り値
Scheduler::Dispatch() を呼び出す間隔
size_t nn::nex::Scheduler::GetReadyJobsSize ( ) const

現在 Scheduler が実行可能なジョブの個数を取得します。

実行可能なジョブの個数が増加傾向である場合は Scheduler::Dispatch() のタイムアウト時間が短いか、より高頻度で呼び出す必要があることを示します。

戻り値
現在実行可能なジョブの個数。
CriticalSection& nn::nex::Scheduler::SystemLock ( )

システムをロックするためのクリティカルセクションの参照を返します。

本関数で取得した CriticalSection に入った後、システムがロックされます。
システムのロック中に CallContext::Wait()Dispatch() などのブロッキング関数を呼ぶことは出来ません。

戻り値
システムをロックするためのクリティカルセクションの参照を返します。
参照
CriticalSection, ScopedCS