2013-04-04 33 views
0

你有什么想法Graphics对象如何使用资源?使用缩放的GraphicsPath非常慢

我画几千GraphicsPath中与经纬度坐标的对象在面板上。最初那些图形路径必须被缩放(实际上变换 - 4矩阵变换)。然后用户可以移动地图,缩放,每个动作都需要重新绘制图形路径。

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

怎么会吸取同一数千图形路径,同为4矩阵变换每个变得非常缓慢,当变焦系数分别提高? System.Graphics本身处理图形路径坐标时是否存在大数目的问题?你们有没有遇到同样的问题?

  • 对不起好人,因为不包括代码:所以这里是“慢”代码块:basicaly _paint方法的迭代部分。它运行了30,000多条图形路径,大多数是从esri shp文件中提取的多段线。 x的坐标是+和y是 - 并且翻转倒置,因此需要在面板上绘制矩阵变换。问题在于低值变量zI,它比hi值变量zI快得多。 Hi-value 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++; 
          } 
    

帮助.... :)

+0

你应该告诉我们你的代码,如果你想要,我们可以帮你 – 2013-04-04 12:48:24

+2

需要任何绘画代码渲染数十万条路径将会变得缓慢。没有魔法修复,你需要重新考虑你的设计。从谷歌地图等提示,并注意如何在缩小时开始放弃细节。 – 2013-04-04 13:46:34

回答