時乃工房-Windowsとアマグラマーな関係-

アクセスアップにオートリンクネット リンクが自動で増殖オートリンクの登録はこちら 節約内職情報検索局
ページランク向上リンク集
役立つリンク集 Web Links
SEO対策ディレクトリ型検索エンジン Su-Jine
メニュー
トップ
アマグラミング
C++編 目次
第14章
第16章
ソフトウェア開発製品
相互リンク

<勘違いだらけのアマグラミングな日々(C++編)>

第15章 伸びる豆腐(3)

2006年11月8日

いやぁ、久々に大チョンボをしてしまい、システムを吹き飛ばしてしまった。
仕事にも使っているPCだったので被害甚大
この原稿を書いている最中も、HDD内のデータをサルベージしている最中である。
本連載を楽しみにしていただいている皆様方、申し訳ありませんでした。
なんとか事態は好転しつつあるので、本連載を再開していこうと思います。
これからも度々ご迷惑をおかけする場面があるとは思いますが、なにとぞ温かい目で末永くお付き合いください。
・・・なんて、現状のアクセス数からすると非常にポジティブな謝罪文のような気がする。

さて、遂にWindowsOSVistaRC1の発表を迎え、またひとつ大きな転換期を向かえようとしている。
当担当者も、.NET中心に構成されているはずのVista上でのWin32APIプログラミングに危惧を覚え、早速RC1を導入してみた。
したがって、この章からのアマグラムサンプルは、Vista上のVisualC++2005ExpressEditionによって製作していくことになる。
ちなみに、お気づきの方も多いと思うが、今までの私の開発環境はWindows2000によるものであった。
どうもWindowsXPは私の肌に合わなかったのだ。
また、現状の担当者のPCでは、どうもVistaは時期尚早のようなので、RC1のライセンスが切れた時点でWindows2000にいったん戻す予定であることも付記しておこう。

さて、毎度の事ながら長々と前置きを書いたところで、前章の続きを語らしてもらおう。
List002−011が正常に動作しなかった理由は、”graphics_control.cpp”内、関数BildClientArea()でデバイスコンテキストの取得に関数BeginPaint()を利用している為である。
これを関数GetDC()に変更したものがこちら。

List.002-012
main_window.h
main_window.cpp
main_callback.h
main_callback.cpp
main_process.h
main_process.cpp
graphics_control.h
graphics_control.cpp
bitmap.rc
main_menu.h
main_menu.cpp
main_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-013
main_window.h
main_window.cpp
main_callback.h
main_callback.cpp
main_process.h
main_process.cpp
graphics_control.h
graphics_control.cpp
bitmap.rc
main_menu.h
main_menu.cpp
main_menu.rc
<ソースのダウンロード>

なにを試したのかと云うと、関数MainTransaction()内のwhileループ内で、更にforループを使って1.と2.の処理をくくってみたのだ。
これで1.と2.の処理が50回繰り返した後で3.の処理が行われる。
はてさて、その結果は?
白四角はずるずると延びるような描画ではなく、左クリックした瞬間に、それこそどかっと横たわるがごとく描画された。
効果満点、まずまずの成果である。
あとはこの結果を踏まえて、CPUの負荷を軽減する方法を見出してみようと思う。

と、今回はここまで。
いやはや、次回までによい方法が見つかればよいが・・・

<前章> <目次>





<時乃工房>
Net Office Nakai
メビウスリング投稿掲示板には小説日記ゲームアニメコミック小学生中学生などの掲示板過去ログがあります。相互リンクも募集中。