伸びる豆腐(3)2006年11月8日いやぁ、久々に大チョンボをしてしまい、システムを吹き飛ばしてしまった。仕事にも使っているPCだったので被害甚大。この原稿を書いている最中も、HDD内のデータをサルベージしている最中である。本連載を楽しみにしていただいている皆様方、申し訳ありませんでした。なんとか事態は好転しつつあるので、本連載を再開していこうと思います。これからも度々ご迷惑をおかけする場面があるとは思いますが、なにとぞ温かい目で末永くお付き合いください。・・・なんて、現状のアクセス数からすると非常にポジティブな謝罪文のような気がする。WindowsOSもVistaRC1の発表を迎え、またひとつ大きな転換期を向かえようとしている。当担当者も、.NET中心に構成されているはずのVista上でのWin32APIプログラミングに危惧を覚え、早速RC1を導入してみた。したがって、この章からのアマグラムサンプルは、Vista上のVisualC++2005ExpressEditionによって製作していくことになる。ちなみに、お気づきの方も多いと思うが、今までの私の開発環境はWindows2000によるものであった。WindowsXPは私の肌に合わなかったのだ。現状の担当者のPCでは、どうもVistaは時期尚早のようなので、RC1のライセンスが切れた時点でWindows2000にいったん戻す予定であることも付記しておこう。毎度の事ながら長々と前置きを書いたところで、前章の続きを語らしてもらおう。List002−011が正常に動作しなかった理由は、”graphics_control.cpp”内、関数BildClientArea()でデバイスコンテキストの取得に関数BeginPaint()を利用している為である。これを関数GetDC()に変更したものがこちら。List.002-012main_window.hmain_window.cppmain_callback.hmain_callback.cppmain_process.hmain_process.cppgraphics_control.hgraphics_control.cppbitmap.rcmain_menu.hmain_menu.cppmain_menu.rc<ソースのダウンロード>この変更に関しては前出第11章を参照していただくとして、実際に変更したものを実行してみよう。うむ、マウスの左クリックした座標目指して、にょきにょきと白四角が伸びていく。マルチスレッド化に成功したようだ。それでは早速CPUの負荷を軽減するため、このスレッドに適当な休憩を与えてやろう。・・・と、ところで適当な休憩って?いやちょっと待て、そもそもマシンパワー全開でこの処理速度?たった32x32ドットの四角を描画するのに、なんでこんなに遅いんだ?・・・さまざまな疑問が立て続けに頭をよぎる。処理速度の問題に取り掛かる時はもっとも多く繰り返される処理を見直せ、と良く言われる。繰り返される処理は、その回数が多ければ多いほど、全体の処理に占める割合が大きくなるからだ。今回の場合は新しく作ったスレッド、関数MainTransaction()に焦点をあててみることにしよう。無限ループを抱えているのだ、こいつは。次に、もっとも時間がかかっているであろう処理を洗い出す必要がある。この無限ループ内で行われている処理は以下の三つ。1.白四角を描く座標計算2.白四角を仮想デバイスコンテキストに描画する部分、関数SetCharacter()の呼び出し3.仮想デバイスコンテキストの内容をデバイスコンテキストに反映する部分、関数BildClientArea()の呼び出し1.は、まぁ、大丈夫だろう。商用の3Dゲームは、物理シミュレーションと云う途方もない計算を行っているものが少なくない。それに比べれば、この程度の計算にかかる時間など無に等しい、と思われる。次に2.の部分だが、これもそう大した処理とは思えない。WindowsOS内の処理がどのように行われるのか詳しくは知らないが、仮想デバイスコンテキストはメインメモリ上に存在すると思われる。やっていることはメインメモリ間のデータ転送と思われるので、この程度のサイズを取り扱ったところで大した問題にはならないだろう。32bitカラーでも、32x32x32÷8=4096バイト(?)の転送に、いかほどの時間が掛かると云うのか。そこでいよいよ3.の部分が怪しくなってくる。ここでは、データサイズ640x480x32÷8=1228800バイト(?)のデータを、AGPバス経由で(私のマシンはAGP)ビデオカードに転送しているはずだ。AGPバスの何たるかは良く知らないが、その動作クロックから考えるに、メインメモリへのアクセスより遅いのは明白である。そこで、次の様なソースを書いて実験してみた。List.002-013main_window.hmain_window.cppmain_callback.hmain_callback.cppmain_process.hmain_process.cppgraphics_control.hgraphics_control.cppbitmap.rcmain_menu.hmain_menu.cppmain_menu.rc<ソースのダウンロード>なにを試したのかと云うと、関数MainTransaction()内のwhileループ内で、更にforループを使って1.と2.の処理をくくってみたのだ。これで1.と2.の処理が50回繰り返した後で3.の処理が行われる。はてさて、その結果は?白四角はずるずると延びるような描画ではなく、左クリックした瞬間に、それこそどかっと横たわるがごとく描画された。効果満点、まずまずの成果である。あとはこの結果を踏まえて、CPUの負荷を軽減する方法を見出してみようと思う。いやはや、次回までによい方法が見つかればよいが・・・メビウスリング投稿掲示板には詩や歌や小説や日記、ゲームやアニメやコミック、小学生や中学生などの掲示板と過去ログがあります。