- - PR -
LockBitsの処理が重い(C#)
投稿者 | 投稿内容 | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-10-18 19:03
まず何が遅くしている主犯なのかを突き止めるのが先決じゃない?
| ||||||||||||||||||||||||
|
投稿日時: 2007-10-18 19:06
BBコードをご存知ないのでしょう メモ帳にコピペしたらインデントされていたりしませんか? 私は、今携帯電話なので試しません(だから余計にコードは見難い) あと、モノクロって、明度持ってます?0と1しかないんじゃないかなぁ?グレースケールの間違いですかねぇ? それで、明度が同じならコピーってのも、なんだか?全部コピーしているのと変わらないような? あるいは、0だけコピーしなければ、256回のループが1回になるような? 意図が読めないので、どうだかわかりませんが | ||||||||||||||||||||||||
|
投稿日時: 2007-10-18 19:22
Jitta さんも書かれていますが、BBコードというものがあります。
投稿する際に「この投稿で BBコード を使わない」というチェックボックスが ありますが、その「BBコード」という部分のリンクをクリックすると説明が 見れると思います。 その中で「codeタグ」というものを使うと、インデントされたソースが入力 できるはずです。またコードを入力する機会があればそれを使ってみてください。
例えば、コードが書かれている記事を「引用」で編集画面にリンクすると テキストボックスの中はインデントされた状態のコードが入っているはず (投稿者がインデント込みで入力していればですが)なので、そこから コピーしてたぐっていく…というのはどうでしょう?(僕はたまにやります)。 ただ、本質的には Jitta さんも書かれてますが、読む側のことを考えて 投稿してもらうのが一番楽ではあります。 もちろん強制ではないですが、こういうのも人と人との<del>ヒットビット</del> コミュニケーションなので「こんなんじゃオレ答えるのや〜んぴ!」という 私のような方もいらっしゃるのかなと。 なので、自分でわかる範囲、自分にしかわからない範囲はできるだけ細かく 説明するようにすると回答もつきやすいかもしれません。 なんだかれいさんへの返答と満月さんへの返答がごっちゃになってしまいました orz ところで、Pixcel って Pixel のことでしょうか。 _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||||||||||||||||||||||
|
投稿日時: 2007-10-18 19:50
ソース上にもわからんことは多数残ってるんですが...
誰も指摘していないので...とりあえず最低限の修正で若干でも効果が見込める部分だけ。 DoEvents(); Invalidate(); ではなく、 Refresh(); に変えてみてください。 それと、Refresh()するコントロールは、画像を表示しているコントロールそのものを対象にしてみてください。 これだけでも大分状況が変わるはずです。 それでも満足できないのなら、次は再描画のタイミングをもうちょっと減らす (たとえば、256回もやるのではなくて、16回にするとかw) ということを検討してはいかがでしょう? _________________ // とっちゃん(高萩 俊行)@わんくま同盟 // とっちゃん’Blog // MS-MVP for Developer Tools - Visual C++ // WindowsInstallerの話題はhttp://www.freeml.com/msiまで | ||||||||||||||||||||||||
|
投稿日時: 2007-10-18 23:30
ご指摘のとおり、まったく読みづらいものに対して答えて下って本当にありがとうございます。
なるほど、勉強になります。できないか考えてみます。
すみません、モノクロではなくグレースケールの間違いですね。 256色のグレースケールです。 BBコードは、すみません知らなかったです。使い方は理解できましたので次回から気をつけます。 Jittaさん、ぽぴ王子(本物)さん、ありがとうございました。
お答えいただいてありがとうございます! 変えてみた結果、遅くなってしまったので、なにか他にないか探してみます。 コード、張りなおしておきます。 このプログラムでやりたいことは、 カラー・グレースケール(256色)・透明の3枚の画像を使用して。 グレースケール画像の色を見て、黒(0)→白(255)の順にカラー画像を透明画像に移(表示)していくというものです。(256枚のパラパラアニメのような感じでしょうか) 例えば、グレースケール上では明度が5の所をカラー画像の同じところにある色を透明画像に描画し、次は明度6の所…といった風に
[ メッセージ編集済み 編集者: 満月 編集日時 2007-10-19 00:13 ] | ||||||||||||||||||||||||
|
投稿日時: 2007-10-18 23:54
なんと!ぱらぱらアニメなのか! 無駄だらけだと思ったらそういうことでしたか。 それはJittaさんのいうとおり、 言葉で説明がないと全然わかりませんでした。 そうすると、最初に思いつくのは、 全部作っておくことですね。 表示の前に256個分全部作る。 色数が少なくていいならインデックスなBMPを使うというのもあります。 これが一番速いかな。 あと、無駄なsleepは要らない。 sleepしてる間に次のコマを作るべき。 ticktimeとかで時間を取得して、 時間が余っていたらそのとき初めてsleepすべき。 メモリを使いたくないとかで、 コマをリアルタイムで作りつつ表示したいなら、 ループの一番内側を何とかします。 つまりここ。
とりあえず、byteを4つばらばらにコピーするのは無駄ですね。 byte配列でなく、integer配列にすれば、一回で全部できますよ。 あと、256段階全部表示するのをやめて間引くとか。 10msecで1回、256段階の一つを表示しても 見えないと思うので、半分くらいにしても問題ないのではないですか? あとマルチスレッドなCPUなら、 別スレッドで別のBitmapオブジェクトに作らせておくと 早くできる場合もあります。 排他処理とかいろいろやらなきゃいけないのでめんどくさいし 効果が出ない場合もあるのでお勧めしませんが。 まぁそんなところを適当に組み合わせて 対応したらどうでしょう? いまのPCなら、そこそこ実用的なぱらぱらアニメができるんじゃないでしょうか。 [ メッセージ編集済み 編集者: れい 編集日時 2007-10-19 00:36 ] | ||||||||||||||||||||||||
|
投稿日時: 2007-10-19 00:59
何度もすみません、ありがとうございます。 integer配列にすれば、一回で全部というのは、 integerってintのことですよね? int配列で一回で出来るんですか? ジャグ配列のことでしょうか。 勉強不足で申し訳ありません、もう少し詳しく教えていただいていいでしょうか。 | ||||||||||||||||||||||||
|
投稿日時: 2007-10-19 02:02
うげ。混乱を招く書き方はよくないですね。 Int32、C#ならint、VBならIntegerのことです。
PixelFormat.Format32bppArgbなので、 1ピクセル -> 32 bit -> 4 byte -> 1 Int32 ですね。
ptrからbytesだけbyte配列rgbVluesにコピーしてるわけですが、 ここで、bytes = w * h * 4で、4バイトを単位で確保してますよね。 1ピクセル=32bitだから当然ですが。 つぎにrgbVluesを使うところでは、
いつも必ず連続して4バイト、コピーしてますよね。 これも1ピクセル=32bitなので当然ですが。 なら、確保もコピーも32bit=1 UInt32単位でやったらどうですか? ということです。
[ メッセージ編集済み 編集者: れい 編集日時 2007-10-19 02:04 ] |