C# 绘制中的FillPolygon事件是否缓慢?

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.

Winform的绘制事件中的FillPolygon速度慢有什么原因吗?这是因为它计算了三角形内部应该绘制的所有px吗

这是使用整个应用程序大部分时间来绘制的部分。因此,我想优化它

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());
        }
    }