【发布时间】:2019-09-28 23:07:45
【问题描述】:
我需要在给定的 X、Y 坐标处绘制小圆圈,但在窗口的面板上可能高达 6000 个圆圈。它非常慢,5000 圈大约需要 2 到 3 秒。 我怎样才能画得更快?
private void drawBGA_Pins(BGAmap PinCordinates, double ExternalZoomFactor, double ExternalOffset_X, double ExternalOffset_Y)
{
Graphics g = this.imgBox.CreateGraphics();
double zoomFactor = (Math.Min(Math.Abs((imgBox.Width) / PinCordinates.width), Math.Abs((imgBox.Height) / PinCordinates.height)))*92/100 * ExternalZoomFactor;
//g.Clear(Color.Transparent); //you can choose another color for your background here.
Pen pen = new Pen(Color.Yellow);
foreach (var p in PinCordinates.pkgCordinates)
{
try
{
g.DrawEllipse(pen, (float)(ExternalOffset_X + (p.X* zoomFactor)), (float)(ExternalOffset_Y + (p.Y* zoomFactor)), 10, 10);
}
catch
{
}
}
}
【问题讨论】:
-
这应该不会超过几分之一秒。请在
catch中添加一些内容,以确保 isn't 被调用。异常很很慢!不要在常规情况下抓住它们。 (而是测试避免!!) - 另外:您不应该使用control.CreateGraphics,因为这里已经解释了>10k 次!! - 此外,您正在泄漏 GDI 资源,如笔和 Graphics 对象(您不应该在第一个位置创建) - 仅在Paint事件中绘制或传递其e.Graphics对象! - 对于无闪烁绘图,必须对标记进行双重缓冲。默认情况下只有PictureBox。 -
不使用 control.CreateGraphics 的一个原因是持久性,但另一个原因是速度。在我的测试中,如果做得对,输出速度会提高约 100 倍!
标签: c# canvas drawellipse