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)にした。