- PR -

コンテナ画像の手前のコントロール描画について

投稿者投稿内容
udon
会議室デビュー日: 2007/07/15
投稿数: 13
投稿日時: 2007-07-15 20:40
こんばんわ。

VS2005 VC.Net(.NetFramework2.0)での質問です。

新規にCLRアプリを作成して、新規FormにPanelを貼り、
デザイナ画面からPanelのプロパティでBackGroundImageにgifファイルを指定しました。
そのPanelをコンテナにして、Labelを10個ほど貼り付けた画面を作成しました。
Labelの位置にPanelの背景画像があります。

Windowsの設定で「画面のプロパティ」->デザインタブ->「効果」->「ドラッグ中にウィンドウの内容を表示する」
にチェックを入れます。

この状態で、作成した画面のLabelの手前を通るように、何か別なウィンドウをドラッグすると、
Labelが白表示になり、CPU使用率が一気に上がりました。
(ノートPCで開発しており、スペックの具体的な話と使用率は割愛します)

同じ状況のテストプロを作り直してみましたが、やはりLabelの手前に別ウィンドウで
ドラッグを繰り返してみると同じ現象が起きました。

プロパティはForm、Panel、Label、いずれも初期値のままです。
イベントハンドラは何も追加していない状態です。
何か問題があるのか、無いのかさえ検討がつきません。

何かご存知な方が居られましたら、ご教授の程お願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-07-15 23:16
引用:

udonさんの書き込み (2007-07-15 20:40) より:

Labelが白表示になり、CPU使用率が一気に上がりました。
(ノートPCで開発しており、スペックの具体的な話と使用率は割愛します)

プロパティはForm、Panel、Label、いずれも初期値のままです。
イベントハンドラは何も追加していない状態です。
何か問題があるのか、無いのかさえ検討がつきません。


描画でコストがかかっているのは確かなようですね。 "一気に上がり" がどの程度かはわかりませんが、描画はもともとコストが高いため読ませて頂いた限りでは問題があるようには感じませんでした。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
udon
会議室デビュー日: 2007/07/15
投稿数: 13
投稿日時: 2007-07-16 01:40
じゃんぬねっと さん、返信ありがとうございます。

"一気に上がり"は、開発に使用しているPCでは100%ですが、
PCの性能の話になると、問題の本質から逸れてしまいそうな気がして
伏せさせていたのですが、情報を遮断していました。申し訳ないです。

じゃんぬねっとさんの仰る、「描画にコストがかかる」の詳細についてですが、
表示処理時に、.NetFrameworkライブラリが、内部で「コストのかかる」
処理を行っていると解釈しました。ライブラリ内部の処理を軽減させる為に
何かアプリとして設定する内容は無いでしょうか。

最終的な目標としては、CPU使用率をできるだけ下げたいと考えています。
udon
会議室デビュー日: 2007/07/15
投稿数: 13
投稿日時: 2007-07-16 18:25
状況を更にお伝えします。

Labelのサイズは通常文字の高さで、幅は適当です。
このサイズのLabelを重ならないように、縦に10個程並べています。

Label群の手前を別なウィンドウが横切ると、途端にタスクマネージャのCPUが100%になり、
別ウィンドウが横切った後に再描画が走るようなのですが、
Labelの形に白く矩形が表示され、クリアしている様子がはっきり判り、そこから描画が行われます。
Label1つを横切っても同様の状態ですが、複数のLabelを横切ると顕著になります。

spy++でLabelへ送られるWindowメッセージを抜粋します。

<00013> 000B077A P WM_PAINT hdc:00000000 [wParam:00000000 lParam:00000000 time:1:40:23.140]
<00014> 000B077A S WM_GETTEXTLENGTH wParam:00000000 lParam:00000000
<00015> 000B077A R WM_GETTEXTLENGTH cch:6 [lResult:00000006]
<00016> 000B077A S WM_GETTEXT cchTextMax:28 lpszText:0012E4D8 [wParam:0000001C lParam:0012E4D8]
<00017> 000B077A R WM_GETTEXT cchCopied:6 lpszText:0012E4D8 ("l") [lResult:00000006]
<00018> 000B077A S WM_GETTEXTLENGTH wParam:00000000 lParam:00000000
<00019> 000B077A R WM_GETTEXTLENGTH cch:6 [lResult:00000006]
<00020> 000B077A S WM_GETTEXT cchTextMax:28 lpszText:0012E4D8 [wParam:0000001C lParam:0012E4D8]
<00021> 000B077A R WM_GETTEXT cchCopied:6 lpszText:0012E4D8 ("l") [lResult:00000006]
<00022> 000B077A S .WM_NCPAINT hrgn:4204109D [wParam:4204109D lParam:00000000]
<00023> 000B077A R .WM_NCPAINT lResult:00000000
<00024> 000B077A S .WM_ERASEBKGND hdc:740112BD [wParam:740112BD lParam:00000000]
<00025> 000B077A R .WM_ERASEBKGND fErased:True [lResult:00000001]

同様のアプリをVC6.0 MFCで作成しましたが、重くなりません。
送られるメッセージの違いは、MFCアプリにはGETTEXT、GETTEXTLENGTHが通知されない位です。

また、CLRアプリに、Labelの他にCheckBoxを貼ってみたところ、こちらも横切ると負荷が上がって一瞬、白表示になりました。テキスト描画を含む場合に、処理が重くなるようです。

これが問題なのだとすると、内容が単純なだけに、対処が思いつかずに困っています。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-07-17 04:18
引用:

表示処理時に、.NetFrameworkライブラリが、内部で「コストのかかる」
処理を行っていると解釈しました。



gifを貼り付けているなら、
勿論コストのかかる処理は行っているでしょう。
ノートPCならなおさらです。

引用:

同様のアプリをVC6.0 MFCで作成しましたが、重くなりません。



問題はこれですが。
本当に「同様のアプリ」でしょうか?
同じgifを読んでいますか?
  埋め込みリソースですか?外部ファイルですか?透明の処理はどうなってますか?
イメージの配置方法は同じですか?
  formはたぶん普通はTileですが、同じようにTilingしていますか?
メモリの使用量はどうですか?
  勿論、MFCのほうがメモリを使いません。.Netの方でページフォールトが多発していませんか?

引用:

何か問題があるのか、無いのかさえ検討がつきません。



引用:

ライブラリ内部の処理を軽減させる為に
何かアプリとして設定する内容は無いでしょうか。

最終的な目標としては、CPU使用率をできるだけ下げたいと考えています。



どういった状況なのかもっと詳しく聞かないと、
漠然としたことしか言えません。

CPU使用率が異常に増えると思っているのでしたら、
PCのスペックや使用率を明示すべきです。
そうすれば本当に異常なのか、ある程度判断ができます。

プログラムをなるべく軽くしたいだけなのでしたら、
そのように言い、
前提条件や現在の状況をより詳細に示してください。
どうすればより軽く作れるか、より適切なアドバイスができます。

現状では、できるアドバイスを列挙しても、

・早いPCを使う
・メモリを増やす
・Vistaを使う
・MFCを使う
・BackgroundImageを使わない
・Labelを上にはりつけない
・RemoteDesktop経由で実行する
・CPUの負荷を下げるツールを使う
・OnPaintでSleepする
・全部自分で描く
・Tilingしない
・gifをつかわずbmpにする
・透明を使わない。
・減色する。

のようになってしまい、
本末転倒気味なアドバイスしかできません。
udon
会議室デビュー日: 2007/07/15
投稿数: 13
投稿日時: 2007-07-17 19:35
れいさん、返信ありがとうございます。

引用:


引用:

同様のアプリをVC6.0 MFCで作成しましたが、重くなりません。



問題はこれですが。
本当に「同様のアプリ」でしょうか?
同じgifを読んでいますか?
  埋め込みリソースですか?外部ファイルですか?透明の処理はどうなってますか?
イメージの配置方法は同じですか?
  formはたぶん普通はTileですが、同じようにTilingしていますか?
メモリの使用量はどうですか?
  勿論、MFCのほうがメモリを使いません。.Netの方でページフォールトが多発していませんか?




申し訳ありませんが、MFCアプリについては、引き合いに出しただけの話なので
捨て置かせてください。

引用:


引用:

何か問題があるのか、無いのかさえ検討がつきません。

ライブラリ内部の処理を軽減させる為に
何かアプリとして設定する内容は無いでしょうか。

最終的な目標としては、CPU使用率をできるだけ下げたいと考えています。



どういった状況なのかもっと詳しく聞かないと、
漠然としたことしか言えません。

CPU使用率が異常に増えると思っているのでしたら、
PCのスペックや使用率を明示すべきです。
そうすれば本当に異常なのか、ある程度判断ができます。




じゃんぬさんの返信でも書きましたが、PCスペックの優劣の話にはしたくないと思っています。
低スペックCPUなら起きて当然、高スペックなら起きたらおかしい、という判断はなるべくしたくないのです。

引用:


プログラムをなるべく軽くしたいだけなのでしたら、
そのように言い、
前提条件や現在の状況をより詳細に示してください。
どうすればより軽く作れるか、より適切なアドバイスができます。




プログラムを軽くの対象が全体に及ぶのか判りませんが、
対象はあくまで「Labelの再描画で発生する高負荷を抑制したい」という事になります。

れいさんのアドバイスの「gif->bmpで表示」は試していませんでした。
確認してみます。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-07-17 21:07
引用:

udonさんの書き込み (2007-07-17 19:35) より:

じゃんぬさんの返信でも書きましたが、PCスペックの優劣の話にはしたくないと思っています。
低スペックCPUなら起きて当然、高スペックなら起きたらおかしい、という判断はなるべくしたくないのです。



あなたがどんな状況で開発をしていて何を問題にしているのかが
わからなければ回答できません。
「Labelが白表示になり、CPU使用率が一気に上が」ることを問題にしているなら
PCのスペック(OS、メモリ量、GPU)を参考に、
あなたの環境・問題を推測するのが普通でしょう。



>カスタードクリーム作ったんだけど甘くないんだ。何でかわかる?

<砂糖はどのくらい入れたの?

>カスタードクリームの甘さは砂糖だけからくるものじゃない。
>問題の本質からそれるから回答したくない。
>こうやって作ったんだ。まず卵黄を泡立ててね、(以下略

<いやだから、まず砂糖の量を基準に考えないと。
<バニラビーンズいれたら少し甘く感じるかもだけど。

>砂糖の量の問題にはしたくない。
>砂糖が多かったら甘い、少なかったら甘くないという判断はしたくない。

ダイエットフードだって、カロリーを明記します。
大雑把でも定量的な話をしなければわかりませんね。
udon
会議室デビュー日: 2007/07/15
投稿数: 13
投稿日時: 2007-07-17 21:51
れいさん、返信ありがとうございます。

私の認識が良くなかったようです。申し訳ないです。

具体的なPCは以下です。
ttp://dynabook.com/pc/catalog/support/search/user/cgi-bin/disp.cgi?pid=PPL101GL4HA3K

メモリを1GB増設しています。

作業場にある複数のPCで試しても負荷が上がるので、PCスペックには依存せず、
何かしら使用率の上がる要因が、.Netアプリにはあるのだと思っていました。

ここから何か推測できますでしょうか?

スキルアップ/キャリアアップ(JOB@IT)