C# GDI+内存使用太大

itneste 2010-08-23 03:25:28
源代码如下,不停的在窗体上绘制一条曲线,没绘制一次内存使用大概增多10K,有没有优化的办法啊?
gdi绘图中必须有事件paint吗?如果没有该事件那如何把bmp上的东西绘制到用户界面上呢?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CurveDemo
{
public partial class Demo : Form
{
private Color gridColor = Color.DarkGreen;
private int gridWidth = 10;
private int gridHeight = 10;
private Pen gridPen;
Bitmap bmp = null;
Point[] points;
public Demo()
{
SetStyle(ControlStyles.DoubleBuffer, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.UserPaint, true);
InitializeComponent();
}


private void Demo_Load(object sender, EventArgs e)
{
gridPen = new Pen(gridColor);
bmp = new Bitmap(this.Width, this.Height);
Graphics g = Graphics.FromImage(bmp);

for (float i = this.Height; i > 0; i = i - gridHeight)
{
g.DrawLine(gridPen, 0, i, this.Width, i);
}
for (float j = this.Width; j > 0; j = j - gridWidth)
{
g.DrawLine(gridPen, j, 0, j, this.Height);
}
int ii = 2;
Point p1 = new Point(5 + ii, 5 * ii);
Point p2 = new Point(10 * ii, 0);
Point p3 = new Point(15 * ii, 15 * ii);
Point p4 = new Point(20 * ii, 0);
Point p5 = new Point(25 * ii, 25 * ii);
points = new Point[] { p1, p2, p3, p4, p5 };
g.DrawCurve(Pens.Red, points);

gridPen.Dispose();
g.Dispose();
}

private void Demo_Paint(object sender, PaintEventArgs e)
{

Graphics dc = e.Graphics;
dc.FillRectangle(Brushes.Black, this.ClientRectangle);
if (bmp != null)
{
dc.DrawImage(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
}
}
int i = 0;
private void timer1_Tick(object sender, EventArgs e)
{

i++;
Point p1 = new Point(5+i, 5*i);
Point p2 = new Point(10*i, 0);
Point p3 = new Point(15*i, 15*i);
Point p4 = new Point(20*i, 0);
Point p5 = new Point(25*i, 25*i);
points = new Point[] { p1, p2, p3, p4, p5 };
draw();
Refresh();
}
private void draw()
{
Graphics g = Graphics.FromImage(bmp);
g.DrawCurve(Pens.Red,points);
g.Dispose();

}

}
}

...全文
253 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
itneste 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 kongdelu2008 的回复:]

Paint事件只会在界面重绘的时候才会触发,刚开始的时候设备并不会关心是否存在Paint事件。
[/Quote]
学习了,谢谢,不过这次没有分了,呵呵 下次昂
kongdelu2008 2010-08-23
  • 打赏
  • 举报
回复
Paint事件只会在界面重绘的时候才会触发,刚开始的时候设备并不会关心是否存在Paint事件。
itneste 2010-08-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wuyazhe 的回复:]

不知道是不是重写了OnPaint实现的。


Point,每次new并不是大问题。毕竟是值类型的。变量的生命周期短,创建速度快(在栈上分配)。
[/Quote]
恩 多谢指点。谢谢。
兔子-顾问 2010-08-23
  • 打赏
  • 举报
回复
不知道是不是重写了OnPaint实现的。


Point,每次new并不是大问题。毕竟是值类型的。变量的生命周期短,创建速度快(在栈上分配)。
itneste 2010-08-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 shefei121 的回复:]

在Timer_tick里面Point 不要每次都去new,用属性来修改
[/Quote]
恩 good idea,谢谢提醒。
夜空皓月 2010-08-23
  • 打赏
  • 举报
回复
说错了,不是属性,是索引,points数组不要每次都new
夜空皓月 2010-08-23
  • 打赏
  • 举报
回复
在Timer_tick里面Point 不要每次都去new,用属性来修改
itneste 2010-08-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wuyazhe 的回复:]

吧你的代码贴了做例子。到6M就没涨了。
[/Quote]
谢谢您,真的很感谢,我测试的时候没有测试到内存使用达到6M的情况,呵呵,谢谢您,我想再请教您个问题:
平时我们在绘图的时候都是在Paint事件中进行绘图的(也就是进行一系列的绘图操作),即使不在paint事件中绘图也是在一个绘图面上把所有的绘图操作完成之后再在paint中把绘制好的绘图面利用paint中的Graphics dc=e.Graphics;中的dc来绘制到用户界面上(dc.DrawImage(bmp)),类似于我上面提问的那个问题中那样,但在ZedGraph中包括在使用该控件时根本没有 paint事件,那绘图面是如何画到用户界面上的呢?
兔子-顾问 2010-08-23
  • 打赏
  • 举报
回复
吧你的代码贴了做例子。到6M就没涨了。
itneste 2010-08-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyazhe 的回复:]

没什么问题。内存会不停涨么?
[/Quote]
恩 是啊 运行起来之后这个进程对应的内存会一直涨~~
兔子-顾问 2010-08-23
  • 打赏
  • 举报
回复
没什么问题。内存会不停涨么?

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧