趣味でC#を使ってWindows Forms Applicationでツールを制作している者です。
Windows10環境でVisual Studio2019を使用しています。
今制作しているツールでは、デスクトップをキャプチャしてForm上のPictureBoxに表示し、マウスドラッグで選択範囲(ラバーバンド)を描画してトリミングする機能を実装しました。
しかしPictureBoxに表示した画像サイズが大きいと描画処理が非常に重くなりカクカクになります。
これは、Graphicsオブジェクトに背景画像を描画してラバーバンドのためにラインを4回描画して合成してPictureBoxに表示する‥ということを毎フレームCPUで行っているからでしょうか?
試しに、最初にGraphicsオブジェクトに背景画像を描画する部分を省くと非常に快適になりますが、引いたラインが残って多重に重なっていってしまうため、やはり毎フレームラインを引く前の状態に戻す必要はあると思っています。
その場合なるべく易しい(本職がプログラマでも無い私でも対処可能な)解決法は無いでしょうか?
GeForce GTX970が入ったマシンで使う想定なので、OpenCLでGPUに処理させれば良いのでしょうか。
ツール制作スキルとしてはよくある実装をDobon.Netにお世話になりながら実装ができる程度のレベルですが、何かライブラリを入れて関数を利用すれば良いくらいなら何とかできそうには思います。
よろしくお願いします。m(_ _)m
No.1ベストアンサー
- 回答日時:
深く考えていません(単なる思い付きです)
一から描画するのではなく、一度PictureBoxの範囲を保存しておいて、それを上書きとかできないんでしょうか?
速いかどうか私にはわかりませんが。
それともラバーバンドを引く前にその部分の背景を保存して置き、ラバーバンドが移動すれば、保存しておいた背景部分(ラバーバンドのあった部分だけのデータ)を上書きするとか。
kihonkanaさんご回答ありがとうございます!
それぞれのご提案、とても参考になりました。
>一から描画するのではなく、一度PictureBoxの範囲を保存しておいて、それを上書きとかできないんでしょうか?
>速いかどうか私にはわかりませんが。
こちらPictureBoxを2枚重ねてフォームに配置しておいて、背景画像用とラバーバンド描画用に分けてマウスドラッグ中はラバーバンドの描画のみ行うようにしたら、1920*1080の画像でもかなり軽くなりました!
>それともラバーバンドを引く前にその部分の背景を保存して置き、ラバーバンドが移動すれば、保存しておいた背景部分(ラバーバンドのあった部分だけのデータ)を上書きするとか。
大きな範囲でラバーバンドを作成した際には効果が薄いかな?と最初は思ったのですが、ラバーバンドの上下左右のライン4つの矩形部分のみ描画して合成する形にすることでかなり処理速度が上がりそうに思いました‥!
現状で厳しくなった場合にぜひ試してみたいと思います。
No.2
- 回答日時:
Windows Formなのが原因かと思います。
Windows Formは元々Delphiに由来しWindows 98等まだまだグラフィックボードと言えばただビットマップに変換しているだけの時代のライブラリです。
ところが現在のWindowsは殆どの画面表示をDirect X経由でGPUが行う構成になっています。
そのためラバーバンドしようとするとGPUがウィンドウをレンダリング→CPUへもってきて加工→GPUが再度ウィンドウをレンダリングという流れになります。
加えてWindows FormはレンダリングのGPU化が不完全でGPUが再度ウィンドウをレンダリングする時にCPU側からかなりの支援を行っています。
解決策としてはWPFを使うというのが手軽だと思います。
WPFはDirect Xにウィンドウやフォントのサイズなどパラメータだけ送ってレンダリングもアンチエイリアシングも全てGPUにお任せです。
加えてラバーバンドもGPUがレンダリングした結果から切り出してそのまま表示先にGPU上ではめ込み合成されます。
izayoimizukiさんご回答ありがとうございます!
なるほど‥とても分かりやすい解説で納得しました。
確かに色々とツールを作るにつれ、限界を感じる場面が増えてきました。
GPUを活かしてくれないのもそうですし、標準のコントロールで可能なカスタマイズの範囲も狭く、特にUIの見た目のプロパティが少なすぎて‥
書籍やネットの情報の少なさからWPFに手を出すかどうかずっと悩んでいたのですが、これを機に勉強を始めてみたいと思います‥!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
秘密基地、どこに作った?
小さい頃、1度は誰もが作ったであろう秘密基地。 大人の今だからこそ言える、あなたの秘密基地の場所を教えてください!
-
「これはヤバかったな」という遅刻エピソード
寝坊だったり、不測の事態だったり、いずれにしても遅刻の思い出はいつ思い出しても冷や汗をかいてしまいますよね。
-
許せない心理テスト
私は「あなたの目の前にケーキがあります。ろうそくは何本刺さっていますか」と言われ「12本」と答えたら「ろうそくの数はあなたが好きな人の数です」と言われ浮気者扱いされたことをいまだに根に持っています。
-
好きな和訳タイトルを教えてください
洋書・洋画の素敵な和訳タイトルをたくさん知りたいです!【例】 『Wuthering Heights』→『嵐が丘』
-
C# Picturebox 縮小・拡大時の表示方法
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MFCタブコントロールのグラデー...
-
描画を透明にする方法
-
word
-
VC++2010(MFC)での描画
-
TextBoxに文字を書いても表示さ...
-
MFC FormViewの背景色
-
NVIDIAのシェーダーキャッシュ
-
ClistBoxでオーナードローがよ...
-
GetGlyphOutline() ご利用経験...
-
OnDrawが呼び出されません
-
ダイアログベースの再描画について
-
【VC++】コントロールの上に描画
-
VB.netでのライン描画方法がわ...
-
(C# .Net) ToolStripのボタンの...
-
楕円を描くプログラミング
-
FlexGridの一部のみ表示を更新...
-
InvalidateRectの使い方について
-
Minecraft 統合版(PC)の描画距...
-
VB6,リストボックスの特定行の...
-
エクセルで作った新しいウイン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
word
-
TextBoxに文字を書いても表示さ...
-
VB6,リストボックスの特定行の...
-
[VB.net] DataGridViewの列ヘッ...
-
MFCでOnPaintのタイミング
-
NVIDIAのシェーダーキャッシュ
-
C++にて、塗りつぶされた円を描...
-
UpdateData( FALSE); による文...
-
VC++プログラムをつかったBMP画...
-
MFCのタイマーのつかい方を教え...
-
CStaticコントロールの静的イメ...
-
画面全体を再描画させたい
-
OneNote 2010 文字と描画がずれる
-
VBAにGDI+を参照させる方法
-
Labelの文字をスクロールする際...
-
Form1 Load で実行されない。
-
Windowのちらつき防止
-
InvalidateRectの使い方について
-
テクスチャに半透明ポリゴンを...
おすすめ情報