不可逆な毎日ブログ

2度と過ごすことのない毎日をつらつらと・・・

BitBltで描画処理

先輩に教えてもらった「BitBlt」を検索してみたら、いろいろ引っかかり、どうも
これで処理するのが一般的だと言うことは分かった。

推薦有害図書館:BitBlt問題 解決 - livedoor Blog(ブログ)
推薦有害図書館:DrawImageとBitBlt速度比較(適当) - livedoor Blog(ブログ)
BitBlt : Windows API « Windows « C# / C Sharp
BitBlt 関数
これらのサイトの内容を参考にしながら、自分のプログラムを修正。


BitBltで隠れたイメージの画像を表示出来る様にするには
特に、このサイトには、サンプルソースがあり、とても助かった。


まず、Paintイベント以外で処理していたものを、ダブルバッファが効く、
Paintイベント内に持ってきて、ImageDrawで処理するように変更した。
次に、BitBltで処理するように変更。こちらのほうが速いとのこともあり、こちらを選択。

手順は、

  • ソース元のGDI Bitmap Objectを作成
  • ソース元のデバイスコンテキストハンドルを取得
  • 現在の状態を待避
  • ターゲット先のデバイスコンテキストハンドルを取得
  • BitBlt処理
  • 後始末
  • ターゲット先のデバイスコンテキストハンドルをリリース


しかし、問題はまだあって、CPU負荷率がなかなか下がらない。
どうも、タイマが負荷をかけているようだ。


System.Timers.Timer を利用しているが、なにか負荷を軽減させる方法がないだろうか。
インターバルが、1000/60 msec なのが厳しいようだ。
なめらかに見せるために、ここの値は、変更しながら探すしかないのかな。
とりあえず、1000f / 30f にした。

【追記:20091020】
参考
楽天が運営するポータルサイト : 【インフォシーク】Infoseek
GetDeviceCaps 関数

結局、インターバルは、17msecにし、ラスタオペレーションコードを0x00660046 (SRCINVERT)にした。