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

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

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

GDIの使い方に関して

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

■92681 / inTopicNo.1)  GDIの使い方に関して
  
□投稿者/ 明太子 (1回)-(2019/10/19(Sat) 13:08:09)

分類:[.NET 全般] 

https://hack.jp/?p=1057

このページによると
Windows10環境ではDWMが有効になっているため、
GDI+を使うと描画速度が遅くなるそうです。

代わりに、GDIを使うか、ダブルバッファリングを使うと速くなるそうです。

それで、GDIを使うことを検討しているのですが、
デメリットはコーディングが古くさくなることだけでしょうか?

https://qiita.com/Zuishin/items/b16ac64fa6e414005e96

テキストの出力方法は
TextRenderer.DrawText(graphics, text, Font, new Point(50, 50), ForeColor);

であることが分かったのですが、
ラインや四角形などはどのようにしたら良いですか?

どこかにGDIの使い方をまとめているサイトはございますでしょうか?


引用返信 編集キー/
■92682 / inTopicNo.2)  Re[1]: GDIの使い方に関して
□投稿者/ イカ二貫 (1回)-(2019/10/19(Sat) 15:03:26)
ダブルバッファリングは使わないのでしょうか?
何に対して描画を行おうとしていますか?
また、描画時間を気にされているようですが、
せいぜい、数百ms程度であれば気にならないように思います。
そんなに描画時間のかかるようなものを扱っているのでしょうか?
引用返信 編集キー/
■92686 / inTopicNo.3)  Re[2]: GDIの使い方に関して
□投稿者/ 明太子 (2回)-(2019/10/19(Sat) 16:31:11)

> そんなに描画時間のかかるようなものを扱っているのでしょうか?

そうです。かなり複雑のものを扱っています。




> 何に対して描画を行おうとしていますか?

PictureBoxとChartです。


> ダブルバッファリングは使わないのでしょうか?


https://social.msdn.microsoft.com/Forums/ja-JP/9119bf4d-f07d-4a61-8290-e6d10cfe3680/windows-1012398display2617838291123643693312356?forum=csharpgeneralja

このページを見ると
一旦
bitmap上にラインなどを描画してから
最後に
pictureBox1.Image = bitmap;
で、Pictureboxに渡すと書かれてあるので、
面倒だと思いました。

https://oshiete.goo.ne.jp/qa/6479974.html

こちらのページを参照すると
単に
Formの DoubleBuffered プロパティを Trueにすれば可能と
書かれていますが、
どちらが正しいですか?
Formの DoubleBuffered プロパティを Trueにすれば
PictureBoxだけでなくChartでもダブルバッファリングが有効になりますか?

もし、それならデフォルトで無効になっているのはなぜでしょうか?


引用返信 編集キー/
■92689 / inTopicNo.4)  Re[3]: GDIの使い方に関して
□投稿者/ Azulean (1089回)-(2019/10/20(Sun) 07:47:57)
No92686 (明太子 さん) に返信
>> そんなに描画時間のかかるようなものを扱っているのでしょうか?
> そうです。かなり複雑のものを扱っています。

複雑がどの程度のもの(量的・質的)かわかりませんが、究極的には「どんな方法を使って毎回描くのでは遅い」という結論になる可能性はあります。
毎回描くといっても、同じものを描くことがほとんどなのであれば「描いた結果をキャッシュする」という戦略も考えた方が良さそうです。


> PictureBoxとChartです。

これらの 2 つのコントロールはすでにダブルバッファを有効にしています。
このため、これらのコントロールの Paint イベント内で描画はダブルバッファが効いているはずです。

> bitmap上にラインなどを描画してから
> 最後に
> pictureBox1.Image = bitmap;
> で、Pictureboxに渡すと書かれてあるので、
> 面倒だと思いました。

実際のところ、GDI でいろいろと描こうとする方が「もっと面倒」です。
Win32API をたくさん呼ぶことになり、それらの定義を自分で書くか、いろいろなサイトから持ってくるか、誰かのライブラリを使うかになります。
https://stackoverflow.com/a/26371072

今時、GDI の関数の使い方を説明したページを探すのも難しいと思いますし、新たに学ぶのも大変だと思います。
(文字列だけは描画の互換性の問題から、GDI をラップしたクラスが標準でありますけれども、あくまで文字列だけのはずです)

> こちらのページを参照すると
> 単に
> Formの DoubleBuffered プロパティを Trueにすれば可能と
> 書かれていますが、
> どちらが正しいですか?

「ダブルバッファ」は概念ですので、実現するためのコードは何通りも存在します。

・自分のコードで一度ビットマップに描いてからコントロールに転送する
・DoubleBuffered プロパティを true に設定し、コントロール内部でビットマップのようなものに描いてから転送するモードにすること

どちらも「ダブルバッファ」(2 つのバッファ = 画像を描く場所を使う、「メモリ」上に描いてから「画面」に描く・転送する)です。


> Formの DoubleBuffered プロパティを Trueにすれば
> PictureBoxだけでなくChartでもダブルバッファリングが有効になりますか?

Paint イベントを使うコントロールの DoubleBuffered プロパティの状態に左右されます。
なので、親のコントロール・フォームの DoubleBuffered プロパティでは効果がありません。

ただ、PictureBox も Chart も前述したとおり、最初からダブルバッファが有効に設定されています。
引用返信 編集キー/
■92692 / inTopicNo.5)  Re[4]: GDIの使い方に関して
□投稿者/ 明太子 (3回)-(2019/10/20(Sun) 18:04:01)
ありがとうございます。

そういうことでしたか。
GDIをラップした関数は文字列しかないのですね。

> これらの 2 つのコントロールはすでにダブルバッファを有効にしています。
> このため、これらのコントロールの Paint イベント内で描画はダブルバッファが効いているはずです。
> ただ、PictureBox も Chart も前述したとおり、最初からダブルバッファが有効に設定されています。

そうなのですか?

https://qiita.com/Zuishin/items/b16ac64fa6e414005e96
https://social.msdn.microsoft.com/Forums/ja-JP/9119bf4d-f07d-4a61-8290-e6d10cfe3680/windows-1012398display2617838291123643693312356?forum=csharpgeneralja

それでは、これらのページで、
GDI+が遅いと説明しているのは一体なぜなのですか?
2017年の記事なので、古いバージョンを使っているというわけではなさそうです。

protected override void OnPaint(PaintEventArgs e)

としか書かれておらず
何のコントロールなのか分かりませんが
PictureBox や Chart 以外のコントロールの話なのでしょうか?

引用返信 編集キー/
■92693 / inTopicNo.6)  Re[5]: GDIの使い方に関して
□投稿者/ Hongliang (905回)-(2019/10/20(Sun) 18:16:48)
2019/10/20(Sun) 20:06:10 編集(投稿者)

qiita.comの記事はGDIの方が文字が美しくレンダリングされているという主張で、速度については言及していませんよね?
遅いと説明しているのは後者のsocial.mscn.microsoft.comのリンク先のみで、こちらは逆にGDIについては触れていません。なので描画速度についてGDIは議論の俎上に上がっていない状態です。
// 私自身は速度にこだわるコードを必要としたことがないので何とも言えません。

で、そう説明している人のコードを見ると、CreateGraphicsを使ってGraphicsオブジェクトを取得しています。
Azuleanさんが
> このため、これらのコントロールの Paint イベント内で描画はダブルバッファが効いているはずです。
と書いている前提を満たしていません。
引用返信 編集キー/
■92694 / inTopicNo.7)  Re[1]: GDIの使い方に関して
□投稿者/ Azulean (1090回)-(2019/10/20(Sun) 18:47:53)
最初の質問文に立ち返りますが…。

No92681 (明太子 さん) に返信
> このページによると
> Windows10環境ではDWMが有効になっているため、
> GDI+を使うと描画速度が遅くなるそうです。
>
> 代わりに、GDIを使うか、ダブルバッファリングを使うと速くなるそうです。


当初から「そうです」と伝聞調です。
実際、測定されましたか?

伝聞ベースで議論しても有益な結果にならないので、具体的な実例や測定結果を示してみてください。
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ