• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:win32api 画面のちらつき)

win32api 画面のちらつき

このQ&Aのポイント
  • ビットマップを描画したとき、タイマーで少しずつ動かしているのですが、画面がかなりちらつきます。イマイチわからなくてどうすればいいかわかりません。わかりやすく教えていただきたいです。
  • タイマーをセットするときは、右キーで右に移動、左キーで左に移動、上キーで上に移動、下キーで下に移動します。タイマーを切るときは、対応するキーを離します。
  • win32apiを使用してビットマップを描画しており、タイマーを使用して少しずつ動かしています。しかし、画面がちらつく問題が発生しており、解決方法がわかりません。どなたか教えていただけますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • axsies
  • ベストアンサー率64% (38/59)
回答No.2

ちらつきが発生する原因は主に2種類です。 一つは、GetDC()で取得したデバイスコンテキストに直接描画している場合で、描画過程が見えているために発生するちらつきです。 これはダブルバッファリングという方法を使えば解決できます。 画面構築用のビットマップ(バックバッファやオフスクリーンバッファと呼ばれます)を確保してそこに描画し、完成した画面をウィンドウに一気に描画します。 ダブルバッファリングはググれば解説が沢山見つかります。 もう一つはティアリングと呼ばれるものです。 これは文字で説明するより実際に見てもらった方がわかりやすいと思うので参考URLを参照してください。 http://d4.princess.ne.jp/multimedia/ntsc/tearing.html スクロール等で特に目立ちます。 ティアリングによるちらつきはGDIでは解決できません。 DirectXを使って垂直同期を取る必要があります。

crashbeen
質問者

補足

回答ありがとうございます。 ダブルバッファリング、調べてみましたが、よくわかりません。(すいません   できれば、わかりやすく教えていただきたいのですが・・・

その他の回答 (1)

回答No.1

InvalidateRectの第3引数にTRUEを指定した場合の意味はご存知? 意味は「矩形領域が無効になったから、一旦、ウィンドゥの背景色を描画してね」です。 つまり「一旦、ウィンドゥの背景色を描画してから、ビットマップを描画してね」って事。 動作は ウィンドゥの背景色を描画 ↓ ビットマップを描画 ↓ ウィンドゥの背景色を描画 ↓ ビットマップを描画 ↓ の繰り返しになるから、チラつくのは当たり前。つか、プログラムで「チラつかせろ」ってやってるに等しい。 チラつきを抑えるなら ・InvalidateRectの第3引数にFALSEを指定し、動く前のビットマップが消えずに残るから、動く前の場所だけ自前で消す ・InvalidateRectを一切使わず、ウィンドゥ全体を自前で再描画し、ウィンドゥの背景ブラシをNULL_BRUSHにしておく などの方法を取りましょう。

crashbeen
質問者

補足

回答ありがとうございます。   FALSEにしてもちらつきました。 なぜ?   他にわるいとこがあるかもですので、確認してみます。

関連するQ&A