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
    }
}
4

2 回答 2

1

在 Canvas 上清除和添加子项是性能密集型操作。如果要提高性能,请使用缓存。我的意思是不要重新创建所有这些矩形,而是简单地重用它们。

重新定位你需要的那些,如果你需要一些添加额外的,或者隐藏在上一步中创建的那些,但现在不需要了。

性能问题的另一个原因是您在调用 creategrid 时一遍又一遍地添加相同的事件处理程序。这意味着当您第二次按下该键时,您将调用 createGrid 2 次。在随后的每一次按键操作中,对 createGrid 的调用次数都会增加一倍。

尝试先删除该行,看看是否需要使用缓存。我在视觉上很重的 WPF 应用程序中需要它,它就像一个魅力。

于 2013-01-07T21:24:55.773 回答
1

每次您调用时,createGrid()您也会调用this.KeyDown += new KeyEventHandler(onKeyDown);它添加一个新的事件侦听器。

第一次调用createGrid()this 意味着 on key downcreateGrid()将被调用一次,然后将再次注册KeyDown,这意味着现在将被调用两次。在下一个KeyDown事件createGrid()被调用两次,每次它都将自己添加到KeyDown事件中。

重复直到放慢速度。

您可以将注册放在 MainPage 构造函数中。

于 2013-01-07T21:27:19.277 回答