C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: pictureboxへの描画処理速度について


(過去ログ 23 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■9900 / inTopicNo.1)  pictureboxへの描画処理速度について
  
□投稿者/ トップオブツヨシ (3回)-(2007/11/06(Tue) 20:15:37)

分類:[VB.NET/VB2005] 

pictureboxに描画を行っているのですが、処理速度の向上について検討しています。良い案が浮かびません。
どなたか良い案をご存知の方がいればお願い致します。

<実現内容>
1項目に対して、1件ずつある条件で色を変化させた線(最大1000件分の集合)を描画する。

<処理内容>
・幅3000ピクセルのpictureboxを用意します。
※高さは特に指定しません。

(1)幅3000ピクセルを1000件で割ります。→ 1件当たりの幅を求めます。
(2)その1件に対して線を描画します(1件当たりの幅分だけ、また平行線)。 → ここである条件で求めた色を付け、描画する。
(3)上記を1000回繰り返します。

(1),(2),(3)の一連の流れを1項目分とします。

これを200項目分行います。
1つの項目に対して、1000回ループを行い描画し、それを×200回行います。

このような処理をしているのですが、処理速度が遅すぎです。。
すいませんがよろしくお願い致します。





引用返信 編集キー/
■9902 / inTopicNo.2)  Re[1]: pictureboxへの描画処理速度について
□投稿者/ Tom Yama (23回)-(2007/11/06(Tue) 20:40:22)
No9900 (トップオブツヨシ さん) に返信
> pictureboxに描画を行っているのですが、処理速度の向上について検討しています。良い案が浮かびません。
> どなたか良い案をご存知の方がいればお願い致します。
>
> <実現内容>
> 1項目に対して、1件ずつある条件で色を変化させた線(最大1000件分の集合)を描画する。
>
> <処理内容>
> ・幅3000ピクセルのpictureboxを用意します。
> ※高さは特に指定しません。
>
> (1)幅3000ピクセルを1000件で割ります。→ 1件当たりの幅を求めます。
> (2)その1件に対して線を描画します(1件当たりの幅分だけ、また平行線)。 → ここである条件で求めた色を付け、描画する。
> (3)上記を1000回繰り返します。
>
> (1),(2),(3)の一連の流れを1項目分とします。
>
> これを200項目分行います。
> 1つの項目に対して、1000回ループを行い描画し、それを×200回行います。
>
> このような処理をしているのですが、処理速度が遅すぎです。。
> すいませんがよろしくお願い致します。
・要するに、毎回、20万本、線を引いている。ということでしょうか?
・1項目、1pictureboxですか?
・幅3000ピクセルの項目が、全部で200あるんですよね?ということは、画面に表示されているのは、その一部ですよね?
フォームの位置を動かすなどして、ほんの一部しか表示されなくしても、やっぱり、遅いですか?
# あっ、もしかして、ダブルバッファリングしている?
引用返信 編集キー/
■9903 / inTopicNo.3)  Re[2]: pictureboxへの描画処理速度について
□投稿者/ トップオブツヨシ (4回)-(2007/11/06(Tue) 21:11:28)
No9902 (Tom Yama さん) に返信
> ・要するに、毎回、20万本、線を引いている。ということでしょうか?
そういうことなんです。。

> ・1項目、1pictureboxですか?
1pictureboxに200項目です。
1項目づつ縦方向にセットしています。

> ・幅3000ピクセルの項目が、全部で200あるんですよね?ということは、画面に表示されているのは、その一部ですよね?
> フォームの位置を動かすなどして、ほんの一部しか表示されなくしても、やっぱり、遅いですか?
縦スクロールバーを使用しています。
但し、横はスクロールバーなしです。画面表示としては、つぶれています。


> # あっ、もしかして、ダブルバッファリングしている?
使用していないです。
すいません、意味がわかりません

引用返信 編集キー/
■9904 / inTopicNo.4)  Re[3]: pictureboxへの描画処理速度について
□投稿者/ Tom Yama (24回)-(2007/11/06(Tue) 21:49:45)
No9903 (トップオブツヨシ さん) に返信
私が昔、試した限りでは、
・「何回、描画メソッドを呼んだか」よりも、
・「画面に描かれた線は、何本か」の方が、実際の描画速度に関連していました。
ので、20万本描いても、その殆どが画面をはみ出しているなら、そんなに遅くはならないはず、、、なんだが。
# というか、20万本程度で、気になるほど遅いというのも、、、ありえない気が。。

とりあえず、実際に描いている部分が遅いのか、それとも他の部分
> (2)その1件に対して線を描画します(1件当たりの幅分だけ、また平行線)。 → ここである条件で求めた色を付け、描画する。
※といった処理をしているところ
が、遅いのか、切り分けしてみませんか?

pictureboxに単に20万本の線を描く、最短のコードを書いてみて、それの速度を測ってみるとか?
引用返信 編集キー/
■9905 / inTopicNo.5)  Re[4]: pictureboxへの描画処理速度について
□投稿者/ トップオブツヨシ (5回)-(2007/11/06(Tue) 22:43:29)
No9904 (Tom Yama さん) に返信
> 私が昔、試した限りでは、
> ・「何回、描画メソッドを呼んだか」よりも、
> ・「画面に描かれた線は、何本か」の方が、実際の描画速度に関連していました。
> ので、20万本描いても、その殆どが画面をはみ出しているなら、そんなに遅くはならないはず、、、なんだが。
> # というか、20万本程度で、気になるほど遅いというのも、、、ありえない気が。。

う〜ん、20万本なら、そんなに遅くならないものなのですか。。


> pictureboxに単に20万本の線を描く、最短のコードを書いてみて、それの速度を測ってみるとか?

少し、切り分けてみました。
<まず、1項目分のみ(1000本分)線を描画しました。>
→完了までに約2秒かかりました。
 尚、平行な直線のみ(X座標のみ変化)描画しています。

 単純に2秒×200項目=400秒(約6分30秒ぐらい)
 1000回のループにかかる時間は1秒もかからない程度と考えると、限界なのでしょうか?


引用返信 編集キー/
■9909 / inTopicNo.6)  Re[5]: pictureboxへの描画処理速度について
□投稿者/ れい (168回)-(2007/11/07(Wed) 01:52:27)
No9903 (トップオブツヨシ さん) に返信
> 但し、横はスクロールバーなしです。画面表示としては、つぶれています。

はみ出てるわけではなく、
縮小して潰れてるのですよね?
なら描くとき重くなりますので

No9905 (トップオブツヨシ さん) に返信
> <まず、1項目分のみ(1000本分)線を描画しました。>
> →完了までに約2秒かかりました。

普通のPictureBoxに普通のDrawLineでかいてたらそんなものでしょう。

そもそも、そんなにたくさんのものをPictureBoxで書くのが変ですね。

高速化にもいろいろあります。
他の部分を変更せずに、ある処理だけを高速化できることもありますが、
普通、アルゴリズムの変更やGUIの変更も行って、
早くしたり早く見えるようにします。

もっと具体的にどういう状況で何をしたいのか、
説明があればいい手があるかもしれません。
引用返信 編集キー/
■9926 / inTopicNo.7)  Re[6]: pictureboxへの描画処理速度について
□投稿者/ Tom Yama (25回)-(2007/11/07(Wed) 16:17:16)
No9909 (れい さん) に返信
> 普通のPictureBoxに普通のDrawLineでかいてたらそんなものでしょう。
そうなんですか?
まあ、私が以前やったテストは、GDI+こそ使っていたものの、PictureBoxはおろか、.Netですらなかったのですが、
そのときは、実際に画面に描画する部分に、殆どの時間を使っていました。

なんで、
> <まず、1項目分のみ(1000本分)線を描画しました。>
> →完了までに約2秒かかりました。
ということは、それ以外の部分に時間がかかりすぎているのだと思うのです。
それが、.Net(or PictureBox)のせいなのか、トップオブツヨシさんのコードのせいなのかは、判りかねますがね。

引用返信 編集キー/
■9929 / inTopicNo.8)  Re[7]: pictureboxへの描画処理速度について
□投稿者/ れい (169回)-(2007/11/07(Wed) 16:43:46)
No9926 (Tom Yama さん) に返信
> ■No9909 (れい さん) に返信
>>普通のPictureBoxに普通のDrawLineでかいてたらそんなものでしょう。
> そうなんですか?
> まあ、私が以前やったテストは、GDI+こそ使っていたものの、PictureBoxはおろか、.Netですらなかったのですが、
> そのときは、実際に画面に描画する部分に、殆どの時間を使っていました。

はい。実際に描画する部分のコストがかなりを占めるでしょう。

> ■No9903 (トップオブツヨシ さん) に返信
>>但し、横はスクロールバーなしです。画面表示としては、つぶれています。
> はみ出てるわけではなく、
> 縮小して潰れてるのですよね?

今回は縮小してるらしいので、全部クリッピングされていません。
つまり、20万本全部描いてるのですよね。

それなら遅くて当たり前かと。
引用返信 編集キー/
■9931 / inTopicNo.9)  Re[8]: pictureboxへの描画処理速度について
□投稿者/ chamaro (1回)-(2007/11/07(Wed) 16:51:14)
>(1)幅3000ピクセルを1000件で割ります。→ 1件当たりの幅を求めます。
>(2)その1件に対して線を描画します(1件当たりの幅分だけ、また平行線)。 → ここである条件で求めた色を付け、描画する。
幅30で塗りつぶせば単純計算で30倍速くなるのは気のせいですか?
引用返信 編集キー/
■10059 / inTopicNo.10)  Re[6]: pictureboxへの描画処理速度について
□投稿者/ トップオブツヨシ (6回)-(2007/11/10(Sat) 15:58:56)
No9909 (れい さん) に返信
> はみ出てるわけではなく、
> 縮小して潰れてるのですよね?
> なら描くとき重くなりますので

線は、潰れて描画されています。
それでは、描画している意味はないと思いますが、とりあえずそれでもOKなのです。


> 普通のPictureBoxに普通のDrawLineでかいてたらそんなものでしょう。
>
> そもそも、そんなにたくさんのものをPictureBoxで書くのが変ですね。
>
> 高速化にもいろいろあります。
> 他の部分を変更せずに、ある処理だけを高速化できることもありますが、
> 普通、アルゴリズムの変更やGUIの変更も行って、
> 早くしたり早く見えるようにします。
>
> もっと具体的にどういう状況で何をしたいのか、
> 説明があればいい手があるかもしれません。

状況としては、
・まず、1項目に対して1000回の描画を行う→その都度、線の色を変える為、1000回の描画は必要です。
・1回あたりの描画線の幅Xは、PictureBoxの幅に対して1000で割った値です。
・幅Xは固定で、DrawLineを行う。→X座標に幅Xを足していき、線を引くイメージです。

こんな説明(状況)とですが。。。
やはり不足でしょうか?


引用返信 編集キー/
■10061 / inTopicNo.11)  Re[7]: pictureboxへの描画処理速度について
□投稿者/ 774RR (61回)-(2007/11/10(Sat) 16:37:25)
うーん、正直なところ何がしたいのかさーっぱりわからんのだが・・・
・その処理が必要なら(省略できないのなら)やるしかないぢゃん。
 遅いのはマシンスペックでカバーしてもらうとか
・「真にやりたいこと」が自分でもよくわかってないのか?
 そりゃ自分で解決してよ
・「真にやりたいこと」を実現する代案を考えてほしいのか?
 そのためには「真にやりたいこと」の提案が不十分だと思うが

「真にやりたいこと」は
線が引きたいの?
グラデーションな描画がしたい?
それ以外の何か?

毎回20万本も線を引いたら遅いに決まってる。
> 描画は必要です
この辺に何か固定観念というか、仕様書の文言に縛られているというか、頭の固さを感じる。
3Dゲームだって全ポリゴンを全描画サイクルで描画なんかしてない。
そんなことしたら遅いマシンではゲーム自体が成立しない。
適切に手抜きをする手段を考えるのもプログラミングのうちだと思うが・・・
引用返信 編集キー/
■10066 / inTopicNo.12)  Re[7]: pictureboxへの描画処理速度について
□投稿者/ れい (184回)-(2007/11/10(Sat) 23:26:27)
No10059 (トップオブツヨシ さん) に返信
> 状況としては、
> ・まず、1項目に対して1000回の描画を行う→その都度、線の色を変える為、1000回の描画は必要です。
> ・1回あたりの描画線の幅Xは、PictureBoxの幅に対して1000で割った値です。
> ・幅Xは固定で、DrawLineを行う。→X座標に幅Xを足していき、線を引くイメージです。
>
> こんな説明(状況)とですが。。。
> やはり不足でしょうか?

不足です。
同じことを2度説明しなくてもわかります。
違うことを説明しなければいけません。

そもそも、それは状況説明ではありません。
それは、やってることの説明です。

行う処理がすべて決定してるなら、
高速化する余地は殆どありません。

その説明だけなら、高速化する方法はCで書くことくらいですね。
ほんのわずかだけ早くなると思いますよ。

> ■No9909 (れい さん) に返信
>>はみ出てるわけではなく、
>>縮小して潰れてるのですよね?
>>なら描くとき重くなりますので
>
> 線は、潰れて描画されています。
> それでは、描画している意味はないと思いますが、とりあえずそれでもOKなのです。

この辺、きちんと説明が必要です。
早くしたいなら、意味が無いことをしてはいけません。

引用返信 編集キー/
■10078 / inTopicNo.13)  Re[3]: pictureboxへの描画処理速度について
□投稿者/ カンタービレ (35回)-(2007/11/11(Sun) 05:55:36)
No9903 (トップオブツヨシ さん) に返信
>># あっ、もしかして、ダブルバッファリングしている?
> 使用していないです。
> すいません、意味がわかりません
>
PictureBoxにDoubleBufferdプロパティというのがあると思いマス。
要は描画してる間は見えないとこで描いて、描き終わったらバンと見せちゃうっていうものデスよ。チラリ☆

回答されている皆サマも、したいこと(目的)の意味がよく分からないと言ってマス。
> <実現内容>
> 1項目に対して、1件ずつある条件で色を変化させた線(最大1000件分の集合)を描画する。
まず、ある条件って何かスレ主サマ以外誰も分からないデスよね?

結果として最終的に全部が塗りつぶされてるようになってるんでしょうケド
本当にDrawLineで塗りつぶさなきゃ出来ないのかが疑問なわけデス。
例えばSystem.Drawing.Drawing2Dには色々な描画用のクラスが用意されてるし
その「ある条件」で一生懸命に線を引いてることが実は簡単に塗りつぶし出来るかも知れないのに
線で面を描くのは大変デス、線で面を早く描くのはどうしたらいいってだけ聞かれても
スペック上げろだとか、まとめて描けとか、そうなっちゃいマスよ。

どういう面を描くために線でなきゃいけないのかを説明しないと答え出ないでしょうね。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -