- - PR -
コンテナ画像の手前のコントロール描画について
投稿者 | 投稿内容 | ||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-07-19 18:54
れいさん、返信ありがとうございます。
確かに話が食い違っていますので、あらためてお伝えしますと、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では軽いと結論を出していました。 この一文がとても興味深いのですが、
これはどのように検証されたのでしょうか。 CLR Profilerというものでしょうか? ダウンロードして使用してみたのですが、結果のレポートの見かたが良く判らず断念した経緯があります。 また、
についてですが、先日教えていただいたダブルバッファリング以外に、Image描画を高速化する術は他にもあるのでしょうか? 同じく先日教えていただいた、ImageのTile指定ですが、既にTileをPanelに指定しておりました。 [ メッセージ編集済み 編集者: udon 編集日時 2007-07-19 18:59 ] | ||||||||||||||||||||||||||||||||||||||||||||||||
|
投稿日時: 2007-07-19 20:30
とりあえず、ラベルのAutoSizeだったかな?テキスト内容にあわせて大きさを変更するプロパティがあるので、そいつを false にしてみたら?
_________________ | ||||||||||||||||||||||||||||||||||||||||||||||||
|
投稿日時: 2007-07-20 02:06
忘れていません。 捨て置けといっていたので文字通り、その話は全部捨てておいただけです。
きちんと検証していたのですね。 あたりまえですが、.Netより軽いですね。 .Netは100%ということなので、どのくらい重くなっているかがわからないですが、 すくなくとも100/60=1.6倍ですか。 あくまでカンですが、ちょい重い気がします。
すみませんが、 この検証に用いた手法・ソフトに関しては諸事情により言えません。 CLR Profilerを使ったことはありませんが、 話を聞く限りではできるのではないでしょうか?
対応方法として「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 ] | ||||||||||||||||||||||||||||||||||||||||||||||||
|
投稿日時: 2007-07-20 07:52
途中でまとまらなくなったら失礼。
.NET アセンブリが、MFC で作ったものより重い。これは当たり前です。もしかしたら、.NET Framework でも、1.0,1.1,2.0とバージョンが上がるごとに重いかもしれません。 なぜ? やってくれる事が増えているからです。 いま、VC6 のコードをメンテしているのですが、この頃って、Form のリサイズに追従して大きさを調整してくれるコントロール(のプロパティ)って、ない?昔、ResizeKit とかいうコンポーネントがあったので、多分ないのでしょう。 しかし、.NET Framework には、Dock や Anker というプロパティがあって、これを設定すれば、いいようにやってくれます。 これは、開発者がコードを書かなくていいようにされているだけで、実際にはコードがあります。そして、設定していないコントロールであっても、メッセージをフックして何かしなければならないか判断はされます。 ということは、その分重くなっているでしょう。 この、便利にしてくれたぶんと、そのために犠牲になったものを比較する。これは大事なことだと思います。 だったら、もう一歩進めて、便利になった部分を無効にする方法はないか、調べてみてはどうでしょう? (ってことを聞きたいのではないか、という気がしてきた) 次、考えていることを書き出すと、乗り過ごしてしまいそうなのでここまで。 | ||||||||||||||||||||||||||||||||||||||||||||||||
|
投稿日時: 2007-07-20 16:08
れいさん、返信ありがとうございます。
残念です。
大変申し訳ありません。「既にNoneを指定してました」が正しいです。
仰るとおりです。「問題」という言葉の用い方が適切ではなかったですね。
その通りです。
この思考を私も考えており、悩み一つです。元々早く出来るのであれば、最初から早く動くであろう、と。 今回、こちらに投稿させて頂いたのは、そういったノウハウを皆様から伺いたかったからでもあります。
いろいろ状況をご提示いただき、ありがとうございます。 1つ1つ検証していきますので、時間をかけてみていきます。
この辺りは、恐らく私の表現によって基準が変わってしまいます。 何より、現象を目の当たりにすると、Label部分の再描画が異質な感じで極端に描画が遅れ、使用率が上がるという内容なので、私自身、何がよければ良いというものを明確に示せないかもしれません。 少なくとも基準として示せるのは使用率ですが、これもPCによって数値が変わってしまいますね。 動作をキャプチャしてどこかにUpして、画面を見てもらいたい気分です。 Jittaさん、返信ありがとうございます。
こちらはfalseでした。
便利になった部分=重い処理、というのが判断出来ない為、軽くする方法として
という表現をしていました。 これらが存在するのであれば、やってみたいところです。 どこかにこれらの資料などあるものでしょうか。 | ||||||||||||||||||||||||||||||||||||||||||||||||
|
投稿日時: 2007-07-20 16:51
私も残念です。時間が無くって(謎
再描画が異常なのはダブルバッファで治るはずです。(確認しています。 これで体感速度(?)があがります。 速度の方は DrawImageが遅いのかDrawTextExが遅いのかで対応が変わるかと。 MFCで軽いならDrawImageが重いのだと思います。 MFCではLoadBitmapとBitBltを使ってたと思うんで、 自分でPanelにBitBltしたらどうでしょう? gif使えないですが。 いつも言うたびに笑われるんですが、 再描画止めちゃうのはだめですか? 2回に1回くらい間引いても誰も気づきませんって。たぶん。 Idleになったときに再描画しておけば。
私は知りませんし、検索して出てこなかったんですよね? じゃあ今ここでその資料を自分で作ったらいいのではないですか? | ||||||||||||||||||||||||||||||||||||||||||||||||
|
投稿日時: 2007-07-20 19:49
大変重要なことを見落としていることに気がつきました。
試験方法と計測方法が明らかになっていません。これまでのことがすべて無駄になるかも知れませんが、この二つを、私が同じ計測ができるように、説明してください。 というか。 画面のあるアプリケーションをすべて終了し、Windows エクスプローラを一枚表示します。これをつかんで、マウスを左右に激しく振ると、簡単に CPU 使用率は 100% になります。 ということは、.NET Framework アプリケーションが悪いのではなく、そういう試験方法が悪いことになります。 .NET Framework アプリケーションが CPU を占有していることを、どの様に確認されたのでしょうか。 ↓投稿数増やすこともないので編集で失礼 仮想OSでやったので、簡単にCPU負荷が上がります ![]() フォーカスを持つアプリケーションは、優先順位がチョビット上がります。描画が必要なのは、非アクティブなアプリケーションではなく、アクティブなアプリケーションですから、ドラッグしているアプリケーションの負荷と、計測したいアプリケーションの負荷が明確に分けられる必要があると思います。 そこをどうやって分けたのかな?と見直してみましたが、書かれていないように思います。 [ メッセージ編集済み 編集者: Jitta 編集日時 2007-07-20 20:32 ] | ||||||||||||||||||||||||||||||||||||||||||||||||
|
投稿日時: 2007-07-20 20:18
Jittaさんと同じ条件で今試しましたが、 XPでもVistaでも、そう簡単に100%にはなりません。 XPは50%台、Vistaは20%台です。 私の振り方が遅いのかマウスが悪いのか。 デスクトップの背景画像かな? 私は真っ黒ですから。 >.NET Framework アプリケーションが CPU を占有していることを、どの様に確認されたのでしょうか。 MFCアプリとの違いはあるという話ですよね。 じゃあ多少なりとも.Netアプリに問題があると。 そーゆー論理展開かと。 |