Достаточно ли вызвать Children.Clear на холсте WPF, чтобы избавиться от старых элементов управления, прежде чем добавлять новые?
Я экспериментирую с WPF и заново внедряю свой старый скринсейвер.
Мой код в основном добавляет кучу изображений на холст, создавая сетку, 64x64 пикселей изображения рядом, чтобы покрыть весь холст. Затем я "оживляю" движение в лабиринте, который должен прокручивать лабиринт, настраивая преобразование перевода и меняя изображения.
Однако, похоже, у меня какая-то утечка. Всякий раз, когда я изменяю размер окна, я хочу перестроить компоненты изображения, чтобы снова покрыть форму, с большим или меньшим количеством изображений.
Если я перетаскиваю нижний левый угол формы узкими кругами, восстановленная часть становится все медленнее и медленнее.
Чтобы удалить старые элементы управления, я просто сделал это:
_Canvas.Children.Clear();
этого достаточно? Из-за замедления я предполагаю, что это не так.
Однако, поскольку лабиринт в настоящее время не "обнаружен" "аватаром", изображения лабиринта нарисованы с непрозрачностью 25%, и я предположил бы, что, если мне не удастся удалить их, я получу много изображений поверх друг друга, но, похоже, это тоже не так.
Я кеширую источники изображений, компоненты изображений создаются так:
_Images = new Image[(int)width, (int)height];
for (int x = -1; x < width - 1; x++)
{
for (int y = -1; y < height - 1; y++)
{
Image i = new Image();
i.Width = 64;
i.Height = 64;
i.Source = _Outside;
Canvas.SetLeft(i, x * 64);
Canvas.SetTop(i, y * 64);
_Canvas.Children.Add(i);
_Images[x + 1, y + 1] = i;
}
}
После этого им присваивают изображения, которые будут отображаться так:
Maze.Square sq = _Maze[_TopLeftMazeX + x, _TopLeftMazeY + y];
Image img = _Images[x + 1, y + 1];
if (sq.Seen)
img.Opacity = 1.0;
else
img.Opacity = 0.25;
switch (sq.Type)
{
case Maze.SquareType.Hallway:
img.Source = _Hallway;
break;
case Maze.SquareType.Wall:
img.Source = _Wall;
break;
case Maze.SquareType.Outside:
img.Source = _Outside;
break;
}
Что еще я должен искать? Есть ли необходимость утилизировать компоненты изображения каким-либо образом?
1 ответ
Призвание _Canvas.Children.Clear();
удалит все ссылки на изображения из визуального дерева, поэтому там нет утечек. Вы можете проверить наличие старых ссылок на изображения в _Images
или какую-то другую коллекцию, которую вы можете хранить. Например, вы сказали, что кэшируете источники изображений - делая это неэффективно или поддерживая постоянно растущий список устаревших изображений, определенно повлияет на вашу систему.