2013-01-07 55 views
0

我只是在c#中玩弄矩形數組,一切都很好,直到我想循環幾次到應用程序(Silverlight)變得非常緩慢之後,在矩形的「圖層」之間循環。生成矩形後,應用程序變得緩慢

我的代碼如下,是否有可能提供任何建議,可能會導致這種退化?

private int worldHeight = 20; 
    private int currentLayerNo = 0; 
    private int keypressCounter = 0; 
    public MainPage() 
    { 
     InitializeComponent(); 
     createGrid(); 
    } 
    private void createGrid() 
    { 
     blockCanvas.Children.Clear(); 
     int x = 0, y = 0; 
     Layer generateWorld = new Layer(); 
     generateWorld.z = worldHeight; 
     generateWorld.x = 50; 
     generateWorld.y = 50; 
     generateWorld.Gen(); 
     Rectangle[,] currentLayer = generateWorld.createLayer(currentLayerNo); 
     for (int a = 0; a < currentLayer.GetLength(0); a++) 
     { 
      for (int b = 0; b < currentLayer.GetLength(1); b++) 
      { 
       Rectangle currentBlock = new Rectangle(); 
       currentBlock = currentLayer[a, b]; 
       blockCanvas.Children.Add(currentBlock); 
       Canvas.SetTop(currentBlock, x); 
       Canvas.SetLeft(currentBlock, y); 
       y = y + 32; 
      } 
      x = x + 32; 
      y = 0; 
     } 
     currentLayer = null; 
     this.KeyDown += new KeyEventHandler(onKeyDown); 
    } 
    private void onKeyDown(object sender, KeyEventArgs e) 
    { 
       //Code here cycles between layers, each time calling the createGrid() method after altering currentLayerNo 
    } 
} 
+1

也許會不時繪製一些圈子,讓您的應用再次受到動力? (嚴肅地說:如何將真正長的源代碼分解到真正有趣的部分?) –

+0

我已經削減了一些代碼,對不起 - 關於這個 - 我想它有點多了:) – TimoneUK

回答

1

每次撥打電話createGrid()時,您還會打電話給this.KeyDown += new KeyEventHandler(onKeyDown);,它會添加一個新的事件偵聽器。

在以createGrid()第一個呼叫,這意味着在按下按鍵createGrid()會被調用一次,這將然後KeyDown重新註冊,意義將現在被調用兩次。在下一個KeyDown事件createGrid()被調用兩次,每次它將自己添加到KeyDown事件。

重複直到減速。

您可以將註冊放在MainPage構造函數中。

+0

現在看起來很明顯,謝謝史蒂夫! – TimoneUK

1

結算及增加孩子在畫布上是性能密集型操作。如果您想提高性能,請使用緩存。通過這個我的意思是,而不是重新創建所有這些矩形,只需重新使用它們。

重新定位你需要的那些,如果你需要一些或者隱藏在上一步中創建的,但是現在不需要的話,可以添加額外元素。

性能問題的另一個原因是,無論何時調用creategrid,您都會再次添加相同的事件處理程序並重復。這意味着當您第二次按下該鍵時,您將調用createGrid 2次。在每個後續按鍵上,您將調用createGrid的次數加倍。

嘗試首先刪除該行,看看是否需要使用緩存。我需要它在視覺上沉重的WPF應用程序,它像一個魅力。

+0

我會帶一個研究緩存Toni,同時將事件處理程序從generate方法移出現在解決了我的性能問題,我覺得緩存值得研究,以便從我的應用程序中獲得更多速度。謝謝! – TimoneUK

+0

沒問題。就像我所說的,如果你需要每秒渲染很多次,你必須使用緩存,因爲你需要避免測量和繪製佈局所帶來的所有壓力。 –