DOBON.NET DOBON.NETプログラミング掲示板過去ログ

PF使用量の増加

  • 題名: PF使用量の増加
  • 著者: みなこ
  • 日時: 2005/03/02 9:13:04
  • ID: 9442
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[環境(XP) 使用言語(C#)]
分類:[.NET]

皆さんまたお世話になります

2日程前からC#で作成したソフトをデバッグしてるのですがPF使用量が2づつ上がっています。
GCが動作してないんでしょうか?

仕様はある機器との通信用Form(親)
通信用のコマンドを書いてるコマンドクラス
通信用FormからShowで表示させてるForm1です。

通信用Formからタイマーで1秒毎にスレッドをお越し、通信をさせています。通信後、取得したデータを基にForm1でグラフィックを描画しています。
描画の後は必ずDisposeをしています。

スレッドだけでグラフィックを描画しない場合はPF使用量は上がらないです。

みなさん、解る範囲でよろしいので何か対策があれば教えて下さい。
よろしくお願いします。
おはようございます、じゃんぬねっと です。

■No9442に返信(みなこさんの記事)
> 描画の後は必ずDisposeをしています。

Dispose() したからって、すぐガベコレが回収してくれるとは限りません。
GC.Collect() だと、いかがでしょうか?
みなこです。
じゃんぬねっとさん。こんにちは。

> Dispose() したからって、すぐガベコレが回収してくれるとは限りません。
> GC.Collect() だと、いかがでしょうか?
本当にごめんなさい。書き忘れてました。
Dispose()した後にGC.Collect()もしています。

あとForm1での描画方法ですが、タイマーのデフォルト値で毎回、Invalidate()しています。

private void Form1_Paint(object sender, system.Windows.Forms.PaintEventArgs e)
{
Graphics G = e.Graphics;
RectangleF client_rect = G.VisibleClipBounds;
Image IMG = new Bitmap(1280, 1024, G);
Graphics BG_IMG = Graphics.FromImage(IMG);
GraphicsClass clGRP = new GraphicsClass();
clGRP.Draw_Graphics(BG_IMG, 0);
clGRP = null;
G.DrawImage(IMG, 0, 0);
IMG.Dispose();
BG_IMG.Dispose();
G.Dispose();
GC.Collect();
}
GraphicsClass clGRP = new GraphicsClass();
clGRP.Draw_Graphics(BG_IMG, 0);
clGRP = null;

ここみないと分かりません。
あと、Disposeするのであれば、usingを使って1つずつ囲まないとだめです。

using(Graphics G = e.Graphics)
{
RectangleF client_rect = G.VisibleClipBounds;
using(Image IMG = new Bitmap(1280, 1024, G))
{
using(Graphics BG_IMG = Graphics.FromImage(IMG))
{
GraphicsClass clGRP = new GraphicsClass();
clGRP.Draw_Graphics(BG_IMG, 0);
clGRP = null;
G.DrawImage(IMG, 0, 0);
}
}
}
GC.Collect();
みなこです。

中博俊さん、こんにちは。
お返事ありがとうございます。

> GraphicsClass clGRP = new GraphicsClass();
> clGRP.Draw_Graphics(BG_IMG, 0);
> clGRP = null;
> ここみないと分かりません。
下にclGRP.Draw_Graphics(BG_IMG, 0);の内容を記します。

> あと、Disposeするのであれば、usingを使って1つずつ囲まないとだめです。
usingを使って囲ってみます。
ありがとうございます。

public void Draw_Matrix(Graphics G, int FLG)
{
int NEW_BIT = 0;
SolidBrush SB_BLACK = new SolidBrush(Color.Black);
SolidBrush SB_BLUE1 = new SolidBrush(Color.FromArgb(0, 144, 255));
SolidBrush SB_BLUE2 = new SolidBrush(Color.FromArgb(0, 114, 225));
SolidBrush SB_BLUE3 = new SolidBrush(Color.FromArgb(0, 74, 205));
SolidBrush SB_BLUE4 = new SolidBrush(Color.Aqua);
SolidBrush SB_WHITE = new SolidBrush(Color.White);
SolidBrush SB_RED = new SolidBrush(Color.Red);
SolidBrush SB_YELLOW = new SolidBrush(Color.Yellow);
SolidBrush SB_LIME = new SolidBrush(Color.Lime);
Pen PN_BLUE1 = new Pen(Color.FromArgb(0, 144, 255), 1);
Pen PN_BLUE2 = new Pen(Color.FromArgb(0, 74, 205), 1);
Pen PN_WHITE = new Pen(Color.White, 2);
Pen PN_BLACK = new Pen(Color.Black, 2);
Font FONT14 = new Font("MS UI Gothic", 14, FontStyle.Bold);
Font FONT16 = new Font("MS UI Gothic", 16, FontStyle.Bold);

//背景色
G.FillRectangle(SB_BLACK,0,0,1280, 1024);

//CC
Point[] DM16_0_1 = {new Point(25, 315), new Point(25, 325), new Point(125, 325), new Point(125, 335), new Point(145, 335), new Point(145, 325), new Point(155, 325), new Point(155, 315)};
//ライン
Point[] DM16_0_2 = {new Point(130, 345), new Point(140, 345), new Point(140, 375), new Point(143, 375), new Point(135, 395), new Point(127, 375), new Point(130, 375)};
NEW_BIT = (通信用Form.DM16 >> 0)&0x01;
if (NEW_BIT == 1)
{
G.FillPolygon(SB_BLUE1, DM16_0_1);
G.FillPolygon(SB_BLUE1, DM16_0_2);
}
G.DrawPolygon(PN_WHITE, DM16_0_1);
G.DrawPolygon(PN_WHITE, DM16_0_2);

//後は上記と同様にラインを書いたり塗り潰したりしてます。

SB_BLACK.Dispose();
SB_BLUE1.Dispose();
SB_BLUE2.Dispose();
SB_BLUE3.Dispose();
SB_BLUE4.Dispose();
SB_WHITE.Dispose();
SB_RED.Dispose();
SB_YELLOW.Dispose();
SB_LIME.Dispose();
PN_BLUE1.Dispose();
PN_BLUE2.Dispose();
PN_WHITE.Dispose();
PN_BLACK.Dispose();
FONT14.Dispose();
FONT16.Dispose();
G.Dispose();
GC.Collect();
}
もちろん全部using必須ですが、その過程でDispose漏れが発覚しないですか?
また引数で貰っているGを中で勝手にDisposeしちゃダメです。

あとBrushとかは必要な場合にだけ作成するほうがパフォーマンス的には有利です。

GC.Collectもする必然性が無いと思うんですが、開放漏れはなさそうな感じ・・・
  • 題名: Re[6]: PF使用量の増加
  • 著者: みなこ
  • 日時: 2005/03/02 13:46:11
  • ID: 9470
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
> もちろん全部using必須ですが、その過程でDispose漏れが発覚しないですか?
何度も見直してるのでDispose漏れはないと思います

> また引数で貰っているGを中で勝手にDisposeしちゃダメです。
最初はPaintへ書いていて途中から変更したのでGを消し忘れてますね。
ミスを見つけて貰ってありがとうございます。

> あとBrushとかは必要な場合にだけ作成するほうがパフォーマンス的には有利です。
> GC.Collectもする必然性が無いと思うんですが、開放漏れはなさそうな感じ・・・
これから全部usingを付けてテストしてみたいと思います。
> あとBrushとかは必要な場合にだけ作成するほうがパフォーマンス的には有利です。

ちゃいます。

リソースに十分にゆとりがあるなら、一度作ったオブジェクトを使い回す方がパフォーマンス的には有利です。(作成、廃棄のコストが浮かせるので)
あ、もちろんそうですが、このように閉じた世界で、作成、廃棄しているのであれば、出来るだけ作成しない方向のほうが望ましいという意味です。(^^;;
みなこさん、皆さん、便乗させて下さい。

■No9465の中程に
Point[] DM16_0_1 = {new Point(25, 315), new Point(25, 325), new Point(125, 325), new Point(125, 335), new Point(145, 335), new Point(145, 325), new Point(155, 325), new Point(155, 315)};
ってありますがここはどうなるのですか?
これってGC.Collectで解放してくれるのですか?
> これってGC.Collectで解放してくれるのですか?
されません。
なぜなら構造体だから。

メソッドを抜けたときに自動的に消えます。
みなこです。
みなさん、ありがとうございます。

15時位からテストしてますが変化はありません。
1日2つづつPF使用量が増加なので明日までテストしてみます。
結果は明日にでも報告します。
> 1日2つづつPF使用量が増加なので明日までテストしてみます。
> 結果は明日にでも報告します。
それって変わってないって普通言いません?(^^;;;;;
みなこです。

> それって変わってないって普通言いません?(^^;;;;;
確かにそうですね。 ボケボケですね( ;^^)ヘ..

PF使用量で質問ですが、起動時とかFormを開いた時とかはメモリを使い
使用量も増えますよね。
描画後、using文で勝手にDispose()してくれるから使用したメモリを解放してくれてるのも解ります。
でも増加に対して起動後、30秒位でPF使用量が10位減るのはなぜなんでしょうか?

こんな事思うのは私だけですかね?(^^ゞ
こんにちは、じゃんぬ です。

■No9489に返信(みなこさんの記事)
> でも増加に対して起動後、30秒位でPF使用量が10位減るのはなぜなんでしょうか?

それ言ったら、アプリケーション終了時にも一気に使用量が増えますし、
再描画が必要な時も、増えますよね。(^-^;)

> こんな事思うのは私だけですかね?(^^ゞ

そんな研究員体質な方へのプレゼント 4 U
http://www.microsoft.com/japan/msdn/net/mag00/GCI.asp



---------------------------------
  じゃんぬねっと
  http://jeanne.wankuma.com/
  http://www.ailight.jp/blog/jeanne/
---------------------------------
  • 題名: Re[14]: PF使用量の増加
  • 著者: みなこ
  • 日時: 2005/03/03 8:52:30
  • ID: 9501
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
おはようございます。 みなこです。

結果ですが、PF使用量は増加してます。
usingを使用したのですが変化はありませんでした。

じゃんぬねっとさん、プレゼントありがとうございます。
まだ読めてないのですがこれからじっくり読ませて貰います。


> 再描画が必要な時も、増えますよね。(^-^;)
確かにそうですが、今回の場合タイマーのInterval値がデフォルトでInvalidateさせているのが増加の原因でしょうか?
最終的にはInterval値を1000位の予定です。

DOBON.NET | プログラミング道 | プログラミング掲示板