【发布时间】:2013-01-13 12:20:56
【问题描述】:
我有一个WinForm 应用程序'Bouncing Balls',我需要给球上色
在bitmap 上并在此表单上显示位图。
我有一个添加新球的plusButton,我将每个新球保存在一个列表中。
现在,Form_Paint 方法告诉每个球自己画,效果很好
直到有很多球并且所有应用程序变得非常缓慢..
这是我的代码:
表单代码的paint方法:
private void Form1_Paint(object sender, PaintEventArgs e)
{
ballsArray.drawImage(bmp,e, ClientRectangle);
}
注意: ballsArray 来自 AllBalls 类型,这是一个包装球方法的类,在他的 c'tor 中,我正在创建一个保存每个球的列表。 bmp,在表单加载时创建 - 在 Form_Load() 方法上。
ballsArray代码的drawImage:
public void drawImage(Bitmap bmp,PaintEventArgs e, Rectangle r)
{
foreach (Ball b in allBalls)
{
b.drawImage(bmp,e, r);
}
}
鲍尔代码drawImage:
public void drawImage(Bitmap bmp, PaintEventArgs e, Rectangle r)
{
using (Graphics g = Graphics.FromImage(bmp))
{
e.Graphics.FillEllipse(brush, ballLocation);
g.DrawImage(bmp, 0, 0);
}
}
注意:ballLocation 是一个矩形,表示每个球的位置
移动的步骤..
那么我做错了什么?是什么导致应用程序运行缓慢?
我必须在位图上绘制所有内容并将其呈现在表单上。 我还传递了加载表单时创建的位图,因为我需要在其上绘制每个位图。
【问题讨论】:
-
通过将
Form1_Paint事件的Graphics对象传递给drawImage方法并直接在其上绘制椭圆,而不是为每个对象创建新的Graphics,您将获得更好的性能球。 -
@Rotem,好吧,你的意思是我应该将 Graphics g = Graphics.FromImage(bmp) 移动到 Form1_Paint 并发送这个对象drawImage 方法?
-
不完全是。再次查看您的代码,我不确定您为什么要在位图上而不是直接在
Graphics对象上绘画。 -
@Rotem 这是一个家庭任务,它的一个限制是使用位图来绘制所有的球..所以我所做的是上面的代码,但是当我开始的时候它变得很慢添加很多球..
-
这对我来说毫无意义,你只是在自己绘制位图。
标签: c# .net winforms bitmap paintevent