ページ 1 / 1
BitBltは一回だけ?
Posted: 2010年7月15日(木) 21:55
by 爺プログラマー
ループ処理1回に付きBitBltは1回のみ呼び出すのでしょうか?
何回でもいいのでしょうか?
ボタンなどがありウィンドー全体を書き換えたくないのです。
実は、描画処理はボタンを挟んだ形になりボタンを避けて2、3箇所に描画する必要あります。
それとも透過を組み込む必要があるでしょうか?
お尋ねします。
Re:BitBltは一回だけ?
Posted: 2010年7月15日(木) 23:26
by ISLe
以前DIBでゲーム作ったときは1フレームあたり数百回BitBlt呼び出してましたけど。
ループ処理って何でしょう。
ふつうのウインドウズアプリにはありませんよね。
> ボタンなどがありウィンドー全体を書き換えたくないのです。
> 実は、描画処理はボタンを挟んだ形になりボタンを避けて2、3箇所に描画する必要あります。
複数回に分けてBitBltしたらチラつくかもしれませんね。
WS_CLIPCHILDRENスタイルがあれば全体に描画しても勝手にボタンとか避けてくれませんでしたっけ。
Re:BitBltは一回だけ?
Posted: 2010年7月16日(金) 00:52
by シエル
私は前にシューティングゲーム作ったときは、100回以上は呼び出してました。
バックバッファに100回以上転送して、メインバッファへは一回だけ呼び出してました。
ウィンドウ全体を書き換えたくない件については、
前にWS_CLIPCHILDRENスタイルを指定して、解決してませんでしたっけ?
Re:BitBltは一回だけ?
Posted: 2010年7月16日(金) 10:21
by 爺プログラマー
ISLe さん、回答ありがとうございます。
ループ処理とは1フレーム処理が1ループ処理に当たります。キャラクターの移動処理の一回分の処理が1ループになります。
WS_CLIPCHILDRENを選んでますので、さすがボタンやコンボボックスには上書きされないようです。
なので、今回は1ループ当たりBitBlt()は1回の呼び出しでOKとなりました。
お騒がせ致しました。
シエル さん、回答ありがとうございます。
前回WS_CLIPCHILDRENを設定したのは、別の問題でしたので気が付きませんでした。
1フレーム当たりBitBlt()は何回呼び出しても不具合はないようですね。
最終的に裏を表に切り替えるタイミングはEndPaint(hWnd, &ps);だと考えますが間違っているでしょうか?
大変お騒がせ致しました。
Re:BitBltは一回だけ?
Posted: 2010年7月16日(金) 10:48
by へろりくしょん
>最終的に裏を表に切り替えるタイミングはEndPaint(hWnd, &ps);だと考えますが間違っているでしょうか?
切り替えるというのは、具体的にどういう事なのか解りませんが、利用されるデバイスコンテキストを差し替えるなんて芸当は出来ないはずです。詳しくは知りません。
EndPaint()関数はBeginPaint()で用意した描画に必要なアレやコレの後始末をするための物です。
EndPaint()関数は、表も裏もありませんよ。
強いて言うなら、裏を表に切り替える?タイミングはBitBlt()関数等です。
メモリデバイスコンテキスト(正確には、に、割り付けられたビットマップ)にいろいろと描画した後、
ウィンドウのデバイスコンテキストにBitBlt()等で転送することで裏から表に描画出来ます。
ただ、0タイムで描画出来たとしても、BitBlt()関数には垂直同期を取るなんて機能はありませんので普通にちらつくとは思いますが。
Re:BitBltは一回だけ?
Posted: 2010年7月16日(金) 11:04
by シエル
>最終的に裏を表に切り替えるタイミングはEndPaint(hWnd, &ps);だと考えますが間違っているでしょうか?
これはWM_PAINTメッセージが発生したときのタイミングというふうに捉えていいでしょうか?
だとしたら問題ないと思います。
前にタイマーを使ったブロック崩しも作ったことがありましたが、
その場合はWM_TIMERメッセージが来たタイミングで、メモリデバイスコンテキストに描画し、
最後にInvalidateRect関数を呼び出し、WM_PAINTメッセージを発生させて
WM_PAINTのメッセージ処理内で、メモリデバイスコンテキストから、ウィンドウのデバイスコンテキストに
bitbltを使って描画してました。
別にこのやり方でも特に問題は出なかったです。
Re:BitBltは一回だけ?
Posted: 2010年7月16日(金) 22:34
by ISLe
> 最終的に裏を表に切り替えるタイミングはEndPaint(hWnd, &ps);だと考えますが間違っているでしょうか?
BeginPaintからEndPaintのあいだにもディスプレイに表示されている内容が逐次更新されることはあります。
そうでなければチラツキ防止のためにオフスクリーン作ってBitBlt一回にまとめたりする必要ないですから。
どの位の頻度で更新されるかはディスプレイデバイスドライバーの作りとか画面モード(リフレッシュレート)とかに影響されると思います。
Re:BitBltは一回だけ?
Posted: 2010年7月17日(土) 09:47
by 爺プログラマー
ISLe さんの回答のように、やはりBitBltはDirectXのFlipと同じ動作をすると考えた方がベターだと考えます。
BitBltは特別な事情が無い限り全画面一括処理向きだと思います。
1フレームで何回もBitBltを呼び出すのは敬遠したいです。BitBltを連発してチラツキが確認できなかったのは画像処理の順序若しくは同系統の色の塗り替え等よるものだと考えます。
みなさん、ご協力ありがとうございました。