• 締切済み

シミュレーション描画時のちらつきを抑える方法?

いつもお世話になっています。 MFCでプログラムをしています。 船の衝突現象をシミュレートする プログラムを作ったのですが、 時々刻々の状態を表示するときに 画面がちらつきます。 ヘルプを調べたのですが、 「ちらつき」では、ヒットせず、 「描画」では、ヒットが多すぎて だめでした。 確か、BASICの時には、 2枚のスクリーンに交互に 書いていたと記憶しているのですが、 MFCでは分かりません。 どのようなキーワードで検索したら良いか、 もしくは、どのような手法があるかなどを 教えていただければ有り難いです。 よろしくお願いします。

みんなの回答

noname#30727
noname#30727
回答No.4

「海の描画→船の描画」を繰り返すと、一瞬船の無い海だけが表示されるのがちらつきの原因だと思います。 DirectX を使わない一般的な GDI の手法としては、メモリビットマップとメモリDC を作成して、そのメモリビットマップに対して描画していき、完成されたビットマップをウィンドウに対して BitBlt する方法がよく使われます。ウィンドウサイズが可変の時には、大きめのメモリビットマップを作成するなどの工夫が必用になりますが、一般的なウィンドウアプリとしては、ちらつきは気にならないレベルになると思います。 欠点としては、描画が二度手間になる事などによって速度的に不利になる事で、利点としては、今のプログラムを大きく変更する必用がないというところです。

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.3

MFCでできるかどうかは別にして・・。 通常はダブルバッファを使うと思います。 ハードウェア的に画面を2枚用意して、 一枚を表示しておいて、一枚を非表示にする。 で、画面の更新は非表示の画面に行い, 画面の更新が終わった段階で表示、非表示の画面を入れ替えます。 ちらつくというのは、ビデオ信号を出力するためのVRAMアクセスと、 画面内容の更新のためのCPUからのVRAM更新が同時に起きると発生します。 画面を2枚にすることによってそれを防ぎます。 うちの会社ではたいていOpenGLを使い、そのダブルバッファの機能を使ってちらつかない アニメーションを表示させてます。 勿論,DirectXにも同じ機能はあります。 他にも上記のVRAMのアクセスがぶつからないように タイミングをとって書き換えると言う手もありますが、 WindowsAPIを使うような描画では多分無理でしょう。 かなりハードウェアよりのプログラムが必要になるので。 昔,NECのPC-9801でVRAMを直接CPUで書き換えて描画する場合にはよく使われた手ですし、 今でも分野によっては使っていると思われます(ゲーム専用機、アーケードゲーム等)。 もし興味があれば、垂直帰線割り込みとか調べて見てください。

zico
質問者

お礼

terra5様 アドバイスありがとうございます。 DirectXで 調べてみることにします。

  • -soh-
  • ベストアンサー率27% (55/201)
回答No.2

ちわ、sohです MFCは使わなかったんで知りませんけど そですね、#1さんの言われるようDirectXを使って サーフェースを2枚作るのがわしが知ってる限りお手軽さは一番かな?(3年前の知識だけど) 検索ワードはダブルバッファリング とか トリプルバッファとか オフスクリーンサーフェス+バックサーフェース とかかなぁ? あんま参考にならなくてごめん。

zico
質問者

お礼

SOH様 アドバイスありがとうございます。 やはり、DiretXがキーワードなのですね。 早速調べてみることにします。 ありがとうございました。

  • TMINET
  • ベストアンサー率32% (45/140)
回答No.1

>どのような手法があるかなどを教えていただければ有り難いです。 おっしゃっているような複数のスクリーンバッファに順次書き込んで随時表示していく方法はVRAMとの関係や制御が必要になってきます。 DirectXを使うと少し楽だと思います。 「ちらつき」の原因の一つに描きかえ時のバッファクリアが考えられます。 次の画面を描く前に一度真っ白にする処理が入っているせいです。 リドローしているクラスが継承しているクラスを調べていくとどこかにこの処理があるかも知れません。 自分でクラスを作った方がいいかも。

zico
質問者

お礼

TMINET様 アドバイスありがとうございます。 DiretXやリドロークラスについて 調べてみようと思います。 ありがとうございました。

関連するQ&A