■ 新・ゲーム開発講座




■ へっぽこプログラミング入門♪


【トラブルシュート02】

■CPU占有時間が100%になるのですが

すみません、いまごろ改定してますが最初のスケルトンに1行、Sleep(1) を記述しておけばよかったのです(大汗 ^^;) 本稿のすべてのソースについて、WinMain() while(1) の中に、以下のように Sleep(1) を挿入して再コンパイルすればCPU占有時間を落とすことができます。

while(1){
//メッセージキューになにか入って来たか?
if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)){
//メッセージがあれば処理する
if(!GetMessage(&msg,(HWND)NULL,0,0))break; //終了メッセージならループ抜け

TranslateMessage(&msg); //キーメッセージを文字メッセージに変換
DispatchMessage(&msg); //ウィンドウプロシージャにメッセージを送付

}else{
//メッセージが無ければ Mainloop()を実行
Mainloop();

//一瞬だけOSに制御を戻しておく
Sleep(1);
}
}

これはスレッドの実行を一瞬だけ(ここでは1ミリ秒)停止してOSに制御を戻すというものです。一瞬といってもメインループはほとんどカラ回りに近い状態で抜けてくるので、実際には基本的にOS側がCPU時間を食べていて、必要に応じてプログラム側の占有度が上がるといったイメージで捕らえればよいと思います。この Sleep(1) が無いと、OSがCPUを占有していない(本来は空きとなっている)時間をプログラム側が意味もなく食いつぶすことになります。

この講座を最初に書いたときはこの Sleep(1) を入れないまま連載を続けていて、ちょっとみっともない動作状況(・・・まあ、動くには動くのですけどね ^^;) だったりしました。時間があれば順次ソースを直していきたいですけど、なかなか一気に書き直すのは難しいかも…(大汗 ^^;)

・・・それにしても、これって結構基本的な内容なのにいまごろ直しているのがなんともカッコ悪いですねぇ(爆死) w