应用程序在生成矩形后变得迟钝
本文关键字:应用程序 | 更新日期: 2023-09-27 17:50:59
我只是在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
}
}
每次调用createGrid()
时,您也调用this.KeyDown += new KeyEventHandler(onKeyDown);
,这将添加一个新的事件侦听器。
在第一次调用createGrid()
时,这意味着按下createGrid()
键将被调用一次,然后将再次为KeyDown
注册,这意味着现在将被调用两次。在下一个KeyDown
事件中,createGrid()
被调用两次,每次它都将自己添加到KeyDown
事件中。
重复,直到减速。
清除和添加Canvas上的子元素是性能密集型操作。如果您希望提高性能,请使用缓存。我的意思是,与其重新创建所有这些矩形,不如简单地重用它们。
重新定位你需要的,添加额外的,如果你需要一些或隐藏那些在上一步创建的,但现在不需要。
性能问题的另一个原因是,每当调用creategrid时,您都反复添加了相同的事件处理程序。这意味着当你第二次按下这个键时,你将调用createGrid 2次。在随后的每次按键中,您将调用createGrid的次数增加一倍。尝试先删除该行,看看是否需要使用缓存。我需要它在视觉上很重的WPF应用程序,它像一个魅力。