Logo
静的公開メンバ関数 | 全メンバ一覧
Yukar.Engine.MessagePump クラス

起動処理のような長時間のブロッキング処理中に、OS の「応答なし」判定 (タイトルバーの "応答なし" 表示・ゴースト化による白画面) を回避するための メッセージポンプ。 [詳解]

静的公開メンバ関数

static void Pump (bool force=false)
 フリーズ判定を避けるために必要最小限のメッセージ処理を行う。 呼び出し間隔は自動で間引かれるので、ループの中から毎回呼んでも構わない。 [詳解]
 

詳解

起動処理のような長時間のブロッキング処理中に、OS の「応答なし」判定 (タイトルバーの "応答なし" 表示・ゴースト化による白画面) を回避するための メッセージポンプ。

プレイヤーはネイティブのタスクループ (SharpKmy.Entry.run) が回り始めるまで ウィンドウメッセージを一切処理しない (メッセージ処理は kmyWindowsCommon の "windows message task" が担当しており、run 開始前は動かない)。 そのためウィンドウ生成から最初のフレームまでの間に数秒以上かかると、 OS からフリーズと判定されてしまう。 起動手順の各段階で Pump() を呼び出しておくことで、 OS に対して「このスレッドは応答している」ことを通知し続けられる。

エディタ側の ProgressWindow.pumpMessages() と同じ方針で、実際に取り出して 処理するのは描画メッセージ (WM_PAINT) のみに限定している。 入力やタイマーまで取り出してしまうと、初期化途中の状態で各種ハンドラが動いて 副作用 (二重実行やまだ準備できていないシーンへのアクセス) を起こす恐れがあるため。 PeekMessage の呼び出し自体が OS に応答中であることを通知する効果を持つので、 処理すべきメッセージが無い場合でもハング判定は回避できる。

メソッド詳解

◆ Pump()

static void Yukar.Engine.MessagePump.Pump ( bool  force = false)
static

フリーズ判定を避けるために必要最小限のメッセージ処理を行う。 呼び出し間隔は自動で間引かれるので、ループの中から毎回呼んでも構わない。

引数
forcetrue なら間引きをスキップして必ず処理する