CreateCompatibleDCやCreateCompatibleBitmapについて – 固定ページ 2 – プログラミング – Home

通知
すべてクリア

[解決済] CreateCompatibleDCやCreateCompatibleBitmapについて

固定ページ 2 / 2

aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

やってはいけないということはありません。
すでに書いたように、異なる色深度を持つモニタ間での描画の差異は、システムがうま
いこと吸収してくれます。
ただし、それではクオリティやパフォーマンスに満足が行かない場合には、最適化すべ
きということです。
#「システムが面倒見てくれる」のがどの程度の精度なのかわかりませんが…

> 画面のプロパティが変わったりモニタ位置が変わったりするたびに
> ビットマップも作り直してセットするということなのでしょうか?

そうですね。
その際には WM_DISPLAYCHANGE メッセージが飛んできますから、必要とあらば適切に処
理してください。

http://msdn2.microsoft.com/en-US/library/ms534847.aspx


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

どこで読んだのかまでは覚えていないのですが、
基本的に色深度が違うBitmap通しで転送するとパフォーマンスは
明らかに落ちます。但し、処理に失敗すると言うわけではないので
パフォーマンスに対してシビアなシステムでなければ、
大抵は気にしなくても良さそうです。
組み込み系やCPUの処理能力がプアな環境だと結構効いてくるので
意識する必要がありますけれど。

起動中にモニタの色深度が変わったとかウインドウをセカンダリモニタに
移動してそのモニタの色深度がプライマリと違っていたとか考え出すと
結構面倒ですが、拘るならそこまでやるしか無いという事になりますかねぇ。
まぁ、マルチモニタ環境に対して何処まで真面目に対応するかとか
そういう問題なのでこの辺はある程度は折衷案で行くしかないかと。

色数が違っていてもパレットの設定がうまいとある程度は緩和できるみたいですが、
減色時にパレット上にその色が存在しなければ、システムが判断した近い色が
採用されるはずなのでその結果は神のみぞ知るですかねぇ。
もっともフルカラーの写真を256色に減色するような事をしなければ、
見るも耐えない画像にはならないと思いますけれど。
結局は求めるクオリティによってとるべき方法が決まるので
一概には言えないです。
その判断はシステムの要件をわかっている人間がするしかないと思います。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

あうあう。

誤)
基本的に色深度が違うBitmap通しで転送するとパフォーマンスは

正)
基本的に色深度が違うBitmap同士で転送するとパフォーマンスは

です。


返信引用
亀山
 亀山
(@亀山)
ゲスト
結合: 18年前
投稿: 133
Topic starter  

解説ありがとうございます。
ということは、自分なりに以下のように解釈しましたが、
これで間違っていないでしょうか。

「済」マークを付けさせていただきますが、
もし勘違いしていたら、指摘していただけると嬉しいです。
ありがとうございました。

1.
画面のプロパティやマルチモニタ内の位置が変わることを本格的に考慮すると、
描画のたびに描画対象ウィンドウのDCを持ってきて、
そこから毎回CreateCompatibleDCやCreateCompatibleBitmapをコールして、
メモリビットマップを描き直さなければいけない

2.
逆にそこまでの完璧な対応はとりあえず必要無いと思うときは、
メモリDCやメモリビットマップは一度作ったものを持ち続けてしまってもよいし、
この場合は、作るときにCreateCompatibleDCやCreateCompatibleBitmapに渡すDCは、
厳密に対象ウィンドウから持ってこなくても構わないはず
(CClientDC(NULL)で持ってきても問題無いはず)

3.
メモリDCに、同時に持てる個数制限は無い(メモリサイズなどの制限はあるが)


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

> 1.
> 画面のプロパティやマルチモニタ内の位置が変わることを本格的に考慮すると、
> 描画のたびに描画対象ウィンドウのDCを持ってきて、
> そこから毎回CreateCompatibleDCやCreateCompatibleBitmapをコールして、
> メモリビットマップを描き直さなければいけない

No.
まず、前回描画時から、そのウィンドウがあるモニタが変わっていなければ、
DCやBitmapを作り直す必要は無いということ。
そして、複数のモニタにまたがっているウィンドウがあったら、
ウィンドウ全体ではなく、各モニタに映っている部分ごとに描画しなければならないで
あろうということ。

> 2.
> 3.

Yes.


返信引用
亀山
 亀山
(@亀山)
ゲスト
結合: 18年前
投稿: 133
Topic starter  

> まず、前回描画時から、そのウィンドウがあるモニタが変わっていなければ、
> DCやBitmapを作り直す必要は無いということ。

そうか、毎回作り直すのではなく、
まず「前の状態からモニタの表示条件が変わっているかどうか」を見て、
変わっていたら初めてメモリビットマップを作り直すことになるのですね…。

> そして、複数のモニタにまたがっているウィンドウがあったら、
> ウィンドウ全体ではなく、各モニタに映っている部分ごとに
> 描画しなければならないであろうということ。

こっちはさらに気が遠くなりそうな処理ですね…。

2~3の理解が間違っていないことがわかり安心しました。
「マルチモニタ間で色数が違う」とか
「実行中に色数を変えられる」とかをレアケースと考えると、
どの程度パフォーマンスが落ちるのかは気になりますが、
2の方法でもとりあえずは問題無いのではと思いますね…(逃げ?)。


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました