My Daily Programming Life...

メッセージループ

Windowsアプリケーションを作るとき、今までは普通のメッセージループを使ってきた。でも、DirectXで(DirectXに限らないけど)リアルタイムで描画をするには別のメッセージループが必要となることを知った。
//通常アプリケーションのメッセージ処理
while(::GetMessage(&msg , NULL, 0 , 0 )){
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}



//リアルタイム処理が必要な場合のメッセージ処理
while(TRUE){
if(::PeekMessage(&msg , NULL , NULL , NULL , PM_REMOVE)){
//メッセージを取得できた場合
if(msg.message == WM_QUIT) break;
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
else{
//リアルタイム処理
}

}

普通のアプリケーションなら、メッセージが送られてきたときに初めて何かが動き出せばよい。GetMessageはメッセージが来るまでは待機して制御を返さない。

一方リアルタイム処理が必要な場合には、常に処理をし続けなくてはいけない。メッセージがあるかどうかをPeekMessageで見て、あればその処理をするけど、なければそれ以外のリアルタイムで処理しなければ行けない部分を行う。アニメーションの場合にはここに描画処理が来ることになる。

ちなみにこのリアルタイム処理を行うアプリケーションを動かすと、CPUの使用率は異常にあがる。そりゃそうだ、常に動いているから。僕のPCの場合DualCoreなので、50%まで上がる(まだシングルスレッドのアプリなので)。

実際、市販のゲームとかはどうかと思って、僕のやっている大航海時代を起動すると、やはりこちらも50%常に使っていることになる。おそらくマルチスレッドになっていることと思うので、ゲーム最中にはさらに使用率は上がるのだと思う。

ということでこのループを使いながら、ボールが落ちてくるようなアニメーションを作成中。クラスとかを設計しながらやっているので、どちらかというとそっちに時間がかかる。でも一度作ればいろいろ遊べて楽しいかも。

0 コメント:

Post a Comment

feedSubscribe to my feed