- PR -

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

投稿者投稿内容
udon
会議室デビュー日: 2007/07/15
投稿数: 13
投稿日時: 2007-07-19 18:54
れいさん、返信ありがとうございます。

引用:

れいさんの書き込み (2007-07-19 10:59) より:
引用:

udonさんの書き込み (2007-07-19 10:45) より:
実際に重いからです。



話が通じていないようですね。
実際に重いということを否定してはいません。
問題の切り分けの話をしているのです。
ライブラリ内部が重いのか、ライブラリの外が重いのかを
私は問題にしているのです。

ですから、できればMFCも使わないで調査すると良いでしょう。



確かに話が食い違っていますので、あらためてお伝えしますと、MFC(VC6、VS.2005)での確認は済んでいます。
「MFCのどのような画面で確認したのか?」という質問を、私がさておいて話を変えた為、忘れられているかもしれません。

作成した手順とソース抜粋をすると、
1:VS.2005でMFC ダイアログベースを新規作成。
2:リソースにbmpを追加(.Netで使用したもの)
3:PictureBoxをダイアログに貼り付け、2で追加したリソースIDをプロパティで指定。
4:.hに以下を追加。
  CStatic m_wndText[10];
5:.cppのOnInitDialogに以下を追加。
 // TODO: 初期化をここに追加します。
 int i;
 for( i = 0 ; i < 10 ; i++ )
 {
  CRect rect;
  rect.left = 40;
  rect.top = 20 + (20 * i);
  rect.right = 100;
  rect.bottom = rect.top + 18;
  // VC.Netでのコンテナを再現する為に、親にPictureBoxを指定する。
  // 設定styleは最低限にする。
  // 配置はVC.NetアプリのLabel配置に似せる。
  m_wndText[i].Create(
   _T("AAA"), WS_CHILD|WS_VISIBLE|SS_SIMPLE|SS_GRAYRECT , rect, GetDlgItem(IDC_BMP), 200+i );
  // Staticの解放は・・・面倒なので無し!
 }

上記テストアプリで、がんばってウィンドウをドラッグしても上限は60%ほどで、その使用率の7割ほどがカーネル(タスクマネージャで赤線表示)でした。

上記理由により、MFCでは軽いと結論を出していました。



この一文がとても興味深いのですが、
引用:

私の環境の場合DrawImageで9割以上の時間が過ぎています。



これはどのように検証されたのでしょうか。
CLR Profilerというものでしょうか?
ダウンロードして使用してみたのですが、結果のレポートの見かたが良く判らず断念した経緯があります。

また、
引用:

つまり、これ以上早くするにはDrawImage部分を高速化しなければどうしようもありません。


についてですが、先日教えていただいたダブルバッファリング以外に、Image描画を高速化する術は他にもあるのでしょうか?

同じく先日教えていただいた、ImageのTile指定ですが、既にTileをPanelに指定しておりました。

[ メッセージ編集済み 編集者: udon 編集日時 2007-07-19 18:59 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-07-19 20:30
とりあえず、ラベルのAutoSizeだったかな?テキスト内容にあわせて大きさを変更するプロパティがあるので、そいつを false にしてみたら?
_________________
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-07-20 02:06
引用:

udonさんの書き込み (2007-07-19 18:54) より:
「MFCのどのような画面で確認したのか?」という質問を、私がさておいて話を変えた為、忘れられているかもしれません。



忘れていません。
捨て置けといっていたので文字通り、その話は全部捨てておいただけです。

引用:

上記テストアプリで、がんばってウィンドウをドラッグしても上限は60%ほどで、その使用率の7割ほどがカーネル(タスクマネージャで赤線表示)でした。
上記理由により、MFCでは軽いと結論を出していました。



きちんと検証していたのですね。
あたりまえですが、.Netより軽いですね。
.Netは100%ということなので、どのくらい重くなっているかがわからないですが、
すくなくとも100/60=1.6倍ですか。
あくまでカンですが、ちょい重い気がします。

引用:

この一文がとても興味深いのですが、
引用:

私の環境の場合DrawImageで9割以上の時間が過ぎています。


これはどのように検証されたのでしょうか。



すみませんが、
この検証に用いた手法・ソフトに関しては諸事情により言えません。

CLR Profilerを使ったことはありませんが、
話を聞く限りではできるのではないでしょうか?

引用:

先日教えていただいたダブルバッファリング以外に、Image描画を高速化する術は他にもあるのでしょうか?
同じく先日教えていただいた、ImageのTile指定ですが、既にTileをPanelに指定しておりました。



対応方法として「Tilingしない」と私は書いています。Tileする、ではありません。
おそらくAutoScaleが一番重く、Noneが一番軽いと思います。
(自明すぎて検証してませんが。)

度々の確認になりますが、
udonさんの質問は、
1「.Netの振る舞いが異常である」
ではなく、
2「.Netが遅いのでなんとかしたい」
ということでしょうか?
それとも、
3「.Netが悪いのかなにかよくわからないがとにかく少しでも軽くしたい」
でしょうか?

udonさんの最初の投稿内容や「問題」という言葉を聞くと、
私には「.Netが異常な振る舞いをしているからなんとかしたい」に聞えたのですが、
(じゃんぬねっとさんもかな?)
それは違ったようですね。

確かにudonさんの言うように重いこと自体問題ですが、
重さに制約を課せられていることが話者の共通認識でない場合、
「問題」という表現は使いませんし、
そのあと詳細にWindowメッセージのログを出すところをみたら、
「Frameworkにバグがある」という風にとれてしまいます。

1なのか、2なのか、3なのかによって、
回答する側も対応を変えないといけないので、明確に教えてください。

1の場合、問題発生状況を聞くだけで、検証することができます。

2の場合ならTips的なことはすぐに言えますが、
対応策というのは一般には利点も欠点もありますので、
より状況を詳しく聞かなければ適切な対応方法は言えません。

3の場合は何がどう問題で、どう解決したいのか、
プログラミングのスキルやPC環境、政治的事情など、
様々な環境を詳細に聞かなければいけません。
PCに問題がある場合もあれば、簡単な方法で解決できる場合もあり、
なんともいいようがありません。

たぶん2を言いたいのだろうと思っているのですが、
udonさんはText描画を問題にしていますし、
どうも私の持ってるDynabookと比べても重すぎる気がしますので、
PCに問題がある可能性もあると思っています。

Imageのレンダリングを軽くする方法はいろいろあります。
更新部分だけ書き直すとか、その更新部分を自分で決定するとか、
2回に1回描かない(!)とか、…。
軽くなる程度も、プログラミングのコストも、様々ですが、
汎用の方法はありません。(あったらもう採用されているので。)
ですので、ただ「軽くしたい」では、なかなか回答できません。

頭の中にある情報を全部列挙するのはなかなか大変です。
私はそもそも全部思い出せません。

もっといろいろな状況で検証してみて、
どの程度だったら満足できるのか、
どういう状況だと我慢できないくらい重くなるのかを、
たくさん事例を挙げてください。

たとえば、
「Panelに画像」だけだと重いですか?
「Formに画像」ではどうですか?
「FormにLabel」や「FormにPanel」、「Formだけ」ではどうですか?
「Panelに画像+Panelに画像」はどうですか?
画像のSizeModeをautoscaleにしたり、
FormにPanelをDockingさせたりしたら、
表示はどう変わり、重さはどのくらい変わりますか?
それはどのくらい不満足ですか?

勿論「Formだけ」で重いと思うのでしたらどうにもなりません。
軽くする方法はあるでしょうが、もう.Netを使う意味がありませんし。

いろいろ聞けば、なにか答えられるかもしれません。
私は答えられないかもしれませんが、誰か答えてくれるかもしれません。

ただTip的なことが聞きたいだけでしたら
「表示を軽くするKnowHowを教えて」と質問すれば
きっとみんないろいろ教えてくれるでしょう。

そんなKnowHowは私も知りたいですね。
みなさんどうしてますか?


[ メッセージ編集済み 編集者: れい 編集日時 2007-07-20 04:10 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-07-20 07:52
途中でまとまらなくなったら失礼。


.NET アセンブリが、MFC で作ったものより重い。これは当たり前です。もしかしたら、.NET Framework でも、1.0,1.1,2.0とバージョンが上がるごとに重いかもしれません。
なぜ?
やってくれる事が増えているからです。

いま、VC6 のコードをメンテしているのですが、この頃って、Form のリサイズに追従して大きさを調整してくれるコントロール(のプロパティ)って、ない?昔、ResizeKit とかいうコンポーネントがあったので、多分ないのでしょう。
しかし、.NET Framework には、Dock や Anker というプロパティがあって、これを設定すれば、いいようにやってくれます。
これは、開発者がコードを書かなくていいようにされているだけで、実際にはコードがあります。そして、設定していないコントロールであっても、メッセージをフックして何かしなければならないか判断はされます。
ということは、その分重くなっているでしょう。

この、便利にしてくれたぶんと、そのために犠牲になったものを比較する。これは大事なことだと思います。
だったら、もう一歩進めて、便利になった部分を無効にする方法はないか、調べてみてはどうでしょう?
(ってことを聞きたいのではないか、という気がしてきた)

次、考えていることを書き出すと、乗り過ごしてしまいそうなのでここまで。
udon
会議室デビュー日: 2007/07/15
投稿数: 13
投稿日時: 2007-07-20 16:08
れいさん、返信ありがとうございます。

引用:

これはどのように検証されたのでしょうか。
引用:

すみませんが、
この検証に用いた手法・ソフトに関しては諸事情により言えません。





残念です。

引用:

先日教えていただいたダブルバッファリング以外に、Image描画を高速化する術は他にもあるのでしょうか?
同じく先日教えていただいた、ImageのTile指定ですが、既にTileをPanelに指定しておりました。

引用:

対応方法として「Tilingしない」と私は書いています。Tileする、ではありません。
おそらくAutoScaleが一番重く、Noneが一番軽いと思います。
(自明すぎて検証してませんが。)





大変申し訳ありません。「既にNoneを指定してました」が正しいです。

引用:

udonさんの最初の投稿内容や「問題」という言葉を聞くと、
私には「.Netが異常な振る舞いをしているからなんとかしたい」に聞えたのですが、
(じゃんぬねっとさんもかな?)
それは違ったようですね。

確かにudonさんの言うように重いこと自体問題ですが、
重さに制約を課せられていることが話者の共通認識でない場合、
「問題」という表現は使いませんし、
そのあと詳細にWindowメッセージのログを出すところをみたら、
「Frameworkにバグがある」という風にとれてしまいます。



仰るとおりです。「問題」という言葉の用い方が適切ではなかったですね。


引用:

たぶん2を言いたいのだろうと思っているのですが、


その通りです。


引用:

汎用の方法はありません。(あったらもう採用されているので。)


この思考を私も考えており、悩み一つです。元々早く出来るのであれば、最初から早く動くであろう、と。
今回、こちらに投稿させて頂いたのは、そういったノウハウを皆様から伺いたかったからでもあります。

引用:

「Panelに画像」だけだと重いですか?
「Formに画像」ではどうですか?
「FormにLabel」や「FormにPanel」、「Formだけ」ではどうですか?
「Panelに画像+Panelに画像」はどうですか?
画像のSizeModeをautoscaleにしたり、 FormにPanelをDockingさせたりしたら、 表示はどう変わり、重さはどのくらい変わりますか?
それはどのくらい不満足ですか?


いろいろ状況をご提示いただき、ありがとうございます。
1つ1つ検証していきますので、時間をかけてみていきます。

引用:

もっといろいろな状況で検証してみて、 どの程度だったら満足できるのか、
どういう状況だと我慢できないくらい重くなるのかを、 たくさん事例を挙げてください。


この辺りは、恐らく私の表現によって基準が変わってしまいます。
何より、現象を目の当たりにすると、Label部分の再描画が異質な感じで極端に描画が遅れ、使用率が上がるという内容なので、私自身、何がよければ良いというものを明確に示せないかもしれません。
少なくとも基準として示せるのは使用率ですが、これもPCによって数値が変わってしまいますね。
動作をキャプチャしてどこかにUpして、画面を見てもらいたい気分です。



Jittaさん、返信ありがとうございます。

引用:

とりあえず、ラベルのAutoSizeを false にしてみたら?


こちらはfalseでした。

引用:

だったら、もう一歩進めて、便利になった部分を無効にする方法はないか、調べてみてはどうでしょう?
(ってことを聞きたいのではないか、という気がしてきた)



便利になった部分=重い処理、というのが判断出来ない為、軽くする方法として
引用:

おまじない的な設定やコードを入れる事で改善されるのであれば、積極的に試したいと思っています。


という表現をしていました。

これらが存在するのであれば、やってみたいところです。
どこかにこれらの資料などあるものでしょうか。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-07-20 16:51
引用:

udonさんの書き込み (2007-07-20 16:08) より:
引用:

これはどのように検証されたのでしょうか。
引用:

すみませんが、
この検証に用いた手法・ソフトに関しては諸事情により言えません。




残念です。


私も残念です。時間が無くって(謎

引用:

何より、現象を目の当たりにすると、Label部分の再描画が異質な感じで極端に描画が遅れ、使用率が上がるという内容なので、私自身、何がよければ良いというものを明確に示せないかもしれません。



再描画が異常なのはダブルバッファで治るはずです。(確認しています。
これで体感速度(?)があがります。

速度の方は
DrawImageが遅いのかDrawTextExが遅いのかで対応が変わるかと。
MFCで軽いならDrawImageが重いのだと思います。

MFCではLoadBitmapとBitBltを使ってたと思うんで、
自分でPanelにBitBltしたらどうでしょう?
gif使えないですが。

いつも言うたびに笑われるんですが、
再描画止めちゃうのはだめですか?
2回に1回くらい間引いても誰も気づきませんって。たぶん。
Idleになったときに再描画しておけば。

引用:

これらが存在するのであれば、やってみたいところです。
どこかにこれらの資料などあるものでしょうか。



私は知りませんし、検索して出てこなかったんですよね?
じゃあ今ここでその資料を自分で作ったらいいのではないですか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-07-20 19:49
大変重要なことを見落としていることに気がつきました。

試験方法と計測方法が明らかになっていません。これまでのことがすべて無駄になるかも知れませんが、この二つを、私が同じ計測ができるように、説明してください。



というか。

画面のあるアプリケーションをすべて終了し、Windows エクスプローラを一枚表示します。これをつかんで、マウスを左右に激しく振ると、簡単に CPU 使用率は 100% になります。
ということは、.NET Framework アプリケーションが悪いのではなく、そういう試験方法が悪いことになります。


.NET Framework アプリケーションが CPU を占有していることを、どの様に確認されたのでしょうか。



↓投稿数増やすこともないので編集で失礼
仮想OSでやったので、簡単にCPU負荷が上がります当然、ゲストを観測していますよ。
フォーカスを持つアプリケーションは、優先順位がチョビット上がります。描画が必要なのは、非アクティブなアプリケーションではなく、アクティブなアプリケーションですから、ドラッグしているアプリケーションの負荷と、計測したいアプリケーションの負荷が明確に分けられる必要があると思います。
そこをどうやって分けたのかな?と見直してみましたが、書かれていないように思います。

[ メッセージ編集済み 編集者: Jitta 編集日時 2007-07-20 20:32 ]
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-07-20 20:18
引用:

Jittaさんの書き込み (2007-07-20 19:49) より:
画面のあるアプリケーションをすべて終了し、Windows エクスプローラを一枚表示します。これをつかんで、マウスを左右に激しく振ると、簡単に CPU 使用率は 100% になります。



Jittaさんと同じ条件で今試しましたが、
XPでもVistaでも、そう簡単に100%にはなりません。
XPは50%台、Vistaは20%台です。

私の振り方が遅いのかマウスが悪いのか。

デスクトップの背景画像かな?
私は真っ黒ですから。

>.NET Framework アプリケーションが CPU を占有していることを、どの様に確認されたのでしょうか。

MFCアプリとの違いはあるという話ですよね。
じゃあ多少なりとも.Netアプリに問題があると。
そーゆー論理展開かと。

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