2013-04-04 55 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

回答