ジョブの実行をスケジューリングするクラスです。 [詳解]
#include <OnlineCore/src/Core/Scheduler.h>
公開型 | |
enum | DispachFlag { ContinueWhenEmpty = 0x01, DispatchKeepAliveOnly = 0x02 } |
Dispatch が呼び出されたときにどのように振舞うかを指定するためのフラグです。 [詳解] | |
公開メンバ関数 | |
size_t | Dispatch (qUnsignedInt32 uiDispatchTimeout, qUnsignedInt32 uiFlags=0) |
登録されているジョブをタイムアウトを設けて実行します。 [詳解] | |
void | DispatchAll () |
登録されているすべてのジョブを実行します。 [詳解] | |
size_t | GetReadyJobsSize () const |
現在 Scheduler が実行可能なジョブの個数を取得します。 [詳解] | |
CriticalSection & | SystemLock () |
システムをロックするためのクリティカルセクションの参照を返します。 [詳解] | |
静的公開メンバ関数 | |
static Scheduler * | GetInstance () |
唯一の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 関数を利用します。
この関数は必ず定期的に呼び出してください。 レイテンシ(通信遅延)を最低限に抑えるために、以下のようなシーケンスでゲームループを 構成することを推奨します。
もしも極度にブロックするような処理(たとえば画面暗転中のファイルロード)を メインスレッドで実行する場合は注意が必要です。メインループの処理が滞り、 ジョブの実行が行われなくなると、メッセージの送受信に悪影響が出て、 結果的にタイムアウトが発生したと判定されてしまう場合があります。
インターナルスレッドを利用している場合は本関数を呼び出しても何も行いません。
|
static |
唯一のSchedulerオブジェクトのインスタンスを取得します。
size_t nn::nex::Scheduler::Dispatch | ( | qUnsignedInt32 | uiDispatchTimeout, |
qUnsignedInt32 | uiFlags = 0 |
||
) |
登録されているジョブをタイムアウトを設けて実行します。
この関数を実行すると、登録されているジョブを実行します。 ただし、指定されたタイムアウトが経過した場合、この関数はジョブの実行を中断してゲームに制御を戻します。 実行されなかったジョブは、次回以降Dispatch() を呼び出したときに実行されます。
この関数は必ず定期的に呼び出してください。 レイテンシ(通信遅延)を最低限に抑えるために、以下のようなシーケンスでゲームループを 構成することを推奨します。
もしも極度にブロックするような処理(たとえば画面暗転中のファイルロード)を メインスレッドで実行する場合は注意が必要です。メインループの処理が滞り、 ジョブの実行が行われなくなると、メッセージの送受信に悪影響が出て、 結果的にタイムアウトが発生したと判定されてしまう場合があります。
また、この関数に指定するタイムアウトが短すぎる場合、 登録されていくジョブの数が処理可能なジョブの数を上回ってしまうことがあります。 このとき、いつまで経ってもジョブの実行が先に進まなくなり、 上記のような状況に陥る場合があります。 アプリケーションの仕様とあわせてタイムアウト時間やトラフィック量の調整を行ってください。 残っているジョブの数は Scheduler::GetReadyJobsSize() で確認できます。
タイムアウトは正確な数値ではありません。 ジョブの内容や数、タイミングによって指定した時間をオーバーする可能性がありますのでご注意ください。
インターナルスレッドを利用している場合は本関数を呼び出しても何も行いません。
[in] | uiDispatchTimeout | タイムアウトをミリ秒単位で指定します。0 を渡すとタイムアウトがなしになり、Scheduler::DispatchAll() と同様に全てのジョブを実行します。 |
[in] | uiFlags | ジョブの実行方式をビットフラグ形式で指定します(デフォルトはフラグなし)。 実行方式については DispachFlag を参照してください。 |
|
static |
インターナルスレッドが Scheduler::Dispatch() を呼び出す間隔を設定します。初期値は 8 ms です。
Core::SetThreadMode() に Core::ThreadModeInternal もしくは Core::ThreadModeInternalTransportBuffer を設定した場合にこの設定が使用されます。 NEX を初期化する前に設定してください。
[in] | interval | Scheduler::Dispatch() を呼び出す間隔 |
|
static |
インターナルスレッドが Scheduler::Dispatch() を呼び出す間隔を取得します。
size_t nn::nex::Scheduler::GetReadyJobsSize | ( | ) | const |
現在 Scheduler が実行可能なジョブの個数を取得します。
実行可能なジョブの個数が増加傾向である場合は Scheduler::Dispatch() のタイムアウト時間が短いか、より高頻度で呼び出す必要があることを示します。
CriticalSection& nn::nex::Scheduler::SystemLock | ( | ) |
システムをロックするためのクリティカルセクションの参照を返します。
本関数で取得した CriticalSection に入った後、システムがロックされます。
システムのロック中に CallContext::Wait() や Dispatch() などのブロッキング関数を呼ぶことは出来ません。