使用缩放的GraphicsPath非常慢

时间:2013-04-04 12:30:59

标签: c# graphics gdi graphicspath

你知道Graphics对象如何使用资源吗?

我在Panel上绘制了数千个具有纬度经度坐标的GraphicsPath对象。最初那些Graphicspath必须进行缩放(转换 - 实际上是4个矩阵转换)。然后,用户可以移动地图,缩放,每次调用的操作都要重新绘制图形路径。

问题是当缩放级别大约为2000-10000时整个事物仍然响应,但是当它达到数十万(这是街道级别缩放)时,绘制时间太长并导致整个应用程序无响应。检查空闲内存,仍然有很多。 CPU使用率仍然可以。

为什么绘制相同的数千个图形路径,相同的4个矩阵变换在变焦系数增加时变得非常慢?处理具有大量数字的图形路径坐标时,System.Graphics本身是否存在问题?你们有没有遇到同样的问题?

  • 对不起好人,因为不包括代码:所以这里是“慢”代码的一部分:基本上是_paint方法的迭代部分。它运行超过30,000个图形路径,大多数是从esri shp文件中提取的折线。 x的坐标是+和y是 - 并且颠倒翻转,因此需要在面板上绘制所需的矩阵变换。问题在于低值变量zI,它比高值变量zI快得多。高值zi意味着大部分图形路径位于绘制区域之外。我尝试通过检查isVisible或通过交互矩形边界来减少zi的数量。但那仍然不够快。任何想法?

                foreach (GraphicsPath vectorDraw in currentShape.vectorPath)
                {
                    GraphicsPath paintPath = (GraphicsPath)vectorDraw.Clone();
    
    
                    OperationMatrix = new Matrix();
                    OperationMatrix.Translate(-DisplayPort.X, -DisplayPort.Y);
                    paintPath.Transform(OperationMatrix);
                    OperationMatrix = new Matrix();
                    OperationMatrix.Scale(zI, zI);
                    paintPath.Transform(OperationMatrix);
                    OperationMatrix = new Matrix(1, 0, 0, -1, 0, DisplaySize.Height);
                    paintPath.Transform(OperationMatrix);
    
                    OperationMatrix = new Matrix();
                    OperationMatrix.Translate(ClientGap.Width, -ClientGap.Height);
                    paintPath.Transform(OperationMatrix);
    
                    //if (WiredPort.IsVisible(paintPath.GetBounds())) //Futile attempt
                    //{
    
                    Pen LandBoundariesPen = new Pen(Color.FromArgb(255, 225, 219, 127));
    
                    GraphContext.DrawPath(LandBoundariesPen, paintPath); // this is the slowest part. When commented it goes faster.
    
                    pathCountX++;
                }
    

帮助......:)

1 个答案:

答案 0 :(得分:0)

对于高性能渲染,directX是通过WPF进行的。您还可以考虑在C#中使用opengl。

编辑:有关如何通过TAO框架在C#中使用Open GL的教程,请访问以下链接: http://xinyustudio.wordpress.com/2008/12/01/using-opengl-in-c-taoframework/