こんばんわ。visual studio express 2013でC++を勉強している者です。
ダブルバッファリングをしたいのですが、チラつきが改善しません。
どう書けばダブルバッファリングを実現できるのか、ご教授ください。
以下は私が書いたコードの一部です。よろしくお願いします。
(要は、hdc_mem1のビットマップを、hdc_mem0(白紙のビットマップ)に読み込み、hdc_mem0のみを画面に表示しようとしています。
いずれは用意したすべての種類のビットマップをhdc_mem0に読み込み、hdc_mem0のみ画面に表示させることによってチラつきを抑えようと考えています)
case WM_CREATE:
hdc = GetDC(hWnd);
hBmp0 = LoadBitmap(hInst, TEXT("MYBMP0"));
GetObject(hBmp0, (int)sizeof(BITMAP), &bmp_info0);
hdc_mem0 = CreateCompatibleDC(hdc);
SelectObject(hdc_mem0, hBmp0);
hBmp1 = LoadBitmap(hInst, TEXT("MYBMP1"));
GetObject(hBmp1, (int)sizeof(BITMAP), &bmp_info1);
hdc_mem1 = CreateCompatibleDC(hdc);
SelectObject(hdc_mem1, hBmp1);
DeleteObject(hBmp0);
DeleteObject(hBmp1);
ReleaseDC(hWnd, hdc);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
BitBlt(hdc_mem0, 0, 0, bmp_info1.bmWidth, bmp_info1.bmHeight, hdc_mem1, 0, 0, SRCCOPY);
BitBlt(hdc, 0, 0, bmp_info0.bmWidth, bmp_info0.bmHeight, hdc_mem0, 0, 0, SRCCOPY);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
DeleteDC(hdc_mem0);
DeleteDC(hdc_mem1);
PostQuitMessage(0);
break;
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
ちらつきが発生する原因は、おそらくですが背景の消去を行っているためではないかと思います。
InvalidateRect() の bErase パラメータに TRUE を指定していませんか?
蛇足かもしれませんが、ちらつきがなぜ発生するかというと、画面に表示するためのスクリーンのDBに対して、異なる内容の描画が複数回行われるためです。
たとえばなにかグラフのような物を描画するとした場合、「背景消去」→「枠描画」→「グリッド線描画」→「グラフ線描画」などの複数ステップで描画内容を構築すると思いますが、この処理の途中が画面上で目に見えるのがちらつきになります。
毎回、1回のBitBltだけを行って全面を上書き描画だけしていればちらつきは防げます。
ですので、描画画像とサイズが固定だとすれば、背景消去無しでこの例でいうhdc_mem1を直接Bltするだけでも事足ります。
ダブルバッファを利用する目的は、No.1にてmyuki1232 さんがすでに回答されている通りですが、WM_PAINの処理で1度だけBitBltを行うためです。
通常、たとえばユーザ操作などによって描画の内容が変化する場合にメモリDCへの描画を行ってInvalidateRect()を行い、
WM_PAINTでは描画済みのメモリDC内容をスクリーンDC(BeginPaintのDC)への転送のみを行います。
これにより、
・描画処理は必要な場合にメモリDCへ行うだけとなり、必要最低限の回数で済む。
・メモリDCからスクリーンDCへ転送するだけで済むので、WM_PAINTが高速になる。
・複数ステップの描画を画面上に現れないメモリDC上で済ませておくので(スクリーンへは上書き転送だけなので)ちらつきが抑止できる。
ということになるわけです。
さらに蛇足で、この質問の件とはあまり関係しないとは思いますが、ゲームや動画表示と言ったような高速で描画内容が変化する必要のあるアプリの場合には、このままの手法ではうまくいきませんし「ティアリング」といった別の問題も生じてきます。
それらについては、また必要となったときに調べてみてください。
No.1
- 回答日時:
気になった点としては、
> hdc = BeginPaint(hWnd, &ps);
>
> BitBlt(hdc_mem0, 0, 0, bmp_info1.bmWidth, bmp_info1.bmHeight, hdc_mem1, 0, 0, SRC
> COPY);
> BitBlt(hdc, 0, 0, bmp_info0.bmWidth, bmp_info0.bmHeight, hdc_mem0, 0, 0, SRCCOPY)
> ;
>
> EndPaint(hWnd, &ps);
BeginPaint と EndPaint の間には、1回の BitBlt 以外の処理を入れてはいけません。
BeginPaint と EndPaint の間の時間(できれば、WM_PAINT の応答時間全体)を短くするのがこの手法の目的だからです。
上のコードで言えば、1つ目の BitBlt(hdc_mem0, ...) は BeginPaint の後でやる必要がないので、前に移動すれば多少良くなるかもしれません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 飛行機・空港 ミルウォーキーツールHDC大阪から伊丹空港へ乗り換え無しで行く方法はありますか? できれば、空港直通 2 2023/05/12 06:44
- クレジットカード LINEによるVpassID連携サービス 危険でしょうか クレジットカード 1 2022/12/12 20:32
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- JavaScript セレクトボックスを2つ選択してメッセージなどを表示するには。~運賃検索プログラムを完成させたい~ 1 2022/07/22 11:10
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- JavaScript jsで、switch文で書かれた分をif文にできませんか。 1 2022/07/28 15:10
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
PCで「使用可能な場合はグラフ...
-
OneNote 2010 文字と描画がずれる
-
TextBoxに文字を書いても表示さ...
-
MFCでOnPaintのタイミング
-
VB6,リストボックスの特定行の...
-
NVIDIAのシェーダーキャッシュ
-
VBAにGDI+を参照させる方法
-
ビットマップを表示させる(MFC)
-
UpdateData( FALSE); による文...
-
フォームにビットマップを表示
-
エクセルでガンチャートを作成...
-
C#のタブコントロールについて...
-
コンボボックスの高さを変えたい
-
c++ ダブルバッファリング、以...
-
CDC(LineTo)で描画した線を透過...
-
MFC FormViewの背景色
-
(C# .Net) ToolStripのボタンの...
-
MFCタブコントロールのグラデー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
word
-
TextBoxに文字を書いても表示さ...
-
VB6,リストボックスの特定行の...
-
[VB.net] DataGridViewの列ヘッ...
-
MFCでOnPaintのタイミング
-
NVIDIAのシェーダーキャッシュ
-
C++にて、塗りつぶされた円を描...
-
UpdateData( FALSE); による文...
-
VC++プログラムをつかったBMP画...
-
MFCのタイマーのつかい方を教え...
-
CStaticコントロールの静的イメ...
-
画面全体を再描画させたい
-
OneNote 2010 文字と描画がずれる
-
VBAにGDI+を参照させる方法
-
Labelの文字をスクロールする際...
-
Form1 Load で実行されない。
-
InvalidateRectの使い方について
-
テクスチャに半透明ポリゴンを...
-
Windowのちらつき防止
おすすめ情報