C# 绘制中的FillPolygon事件是否缓慢?
Winform的绘制事件中的FillPolygon速度慢有什么原因吗?这是因为它计算了三角形内部应该绘制的所有px吗 这是使用整个应用程序大部分时间来绘制的部分。因此,我想优化它C# 绘制中的FillPolygon事件是否缓慢?,c#,winforms,C#,Winforms,Winform的绘制事件中的FillPolygon速度慢有什么原因吗?这是因为它计算了三角形内部应该绘制的所有px吗 这是使用整个应用程序大部分时间来绘制的部分。因此,我想优化它 SolidBrush myBrush = new SolidBrush(Color.Black); MatrixCellZoom zoom = rectangle.CellZoom; List<Point> points = new List<Point>(); points.Add(zoom.
SolidBrush myBrush = new SolidBrush(Color.Black);
MatrixCellZoom zoom = rectangle.CellZoom;
List<Point> points = new List<Point>();
points.Add(zoom.pont1.ToPoint());
points.Add(zoom.pont2.ToPoint());
points.Add(zoom.pont3.ToPoint());
graphics.FillPolygon(myBrush, points.ToArray()); /* the show part */
SolidBrush myBrush=新的SolidBrush(颜色为黑色);
MatrixCellZoom zoom=rectangle.CellZoom;
列表点=新列表();
添加(zoom.pont1.ToPoint());
添加(zoom.pont2.ToPoint());
添加(zoom.pont3.ToPoint());
graphics.FillPolygon(myBrush,points.ToArray());/*表演部分*/
修改后的答案-它与.FillRectangle一样快。至少对于一个三角形
int incr=1000000;
使用(var bmp=新位图(200500))
使用(var gr=Graphics.FromImage(bmp))
{
DateTime timeBeforeFillRectangle=DateTime.Now;
对于(int i=0;i
thx,如果我必须用RGBA颜色(不透明度)填充三角形,也是这样吗?或者如何解决这个问题?创建一个不透明度为-brush b=new SolidBrush(Color.FromArgb(10,Color.Red))的笔刷;那有10%的红色。修正,可能不是10%。我认为alpha是一个从0到255的数字。但是你明白了:)是的,但问题是速度,你自己一个接一个地填满它会更快吗?:)我不确定,但在处理区域时,GDI会创建一个矩形数组来覆盖该区域。如果它在这里也这样做,它将做一些数学运算并执行一系列填充矩形。您是否有证据支持您的假设,即我们可以比系统更快地完成此任务还有:一朵花,一个漩涡,你似乎把圆角多边形和圆角曲线搞混了。一个像素一个像素地画可能也会很慢。另一种可能的解决方案是使用.FillPolygon作为三角形的小表示,然后拉伸图像。我认为三角形可以在不损失分辨率的情况下调整大小,但如果这不起作用,这里有一个例子:什么是MatrixCellZoom
?zoom.pont1.ToPoint()执行什么操作?首先,什么是图形
?您是否使用GraphicsPath
?+您没有处理画笔
。使用三个固定点测试三角形的绘制,FillPolygon
只需不到一毫秒即可完成。MatrixCellZoom只是一个具有类似System.Drawing.Point的点的类。ToPoint()是图形的扩展功能,用于将图形转换为winforms项目中的System.Drawing.Point。我有一个用于平台间所有逻辑的通用库。缩放是三角形的一个点。右。现在,再次阅读所有评论,仔细阅读1)我的第一条评论,关于FillPolygon
,2)MatrixCellZoom只是一个具有类似System.drawing.Point的点的类。ToPoint()是一个扩展功能。3) 我有一个用于平台间所有逻辑的通用库。zoom是三角形4)(…)的一个点,在这里我调用一个调用其他扩展函数的扩展函数。=>你从中得到了什么?我猜FillPolygon
与缓慢的结果(未定义)无关。所有这些都是在缓慢(未定义)之前出现的。你能给我们展示一下你正在尝试做的更有意义的例子吗?画一个三角形显然不是问题,一点也不慢。继续,不要解决你们并没有的问题。(参见:过早优化)
int incr = 1000000;
using (var bmp = new Bitmap(200, 500))
using (var gr = Graphics.FromImage(bmp))
{
DateTime timeBeforeFillRectangle = DateTime.Now;
for (int i = 0; i < incr; i++)
{
gr.FillRectangle(Brushes.Orange, new Rectangle(0, 0, 100, 300));
}
Point[] points = new Point[] { new Point(10, 100), new Point(190, 200), new Point(80, 400) };
DateTime timeBeforeFillPolygon = DateTime.Now;
for (int i = 0; i < incr; i++)
{
gr.FillPolygon(Brushes.Orange, points);
}
TimeSpan ts1 = timeBeforeFillPolygon.Subtract(timeBeforeFillRectangle);
TimeSpan ts2 = DateTime.Now.Subtract(timeBeforeFillPolygon);
Console.WriteLine("FillRectangle seconds: " + ts1.TotalSeconds.ToString());
Console.WriteLine("FillPolygon seconds: " + ts2.TotalSeconds.ToString());
}
}