Я экспериментирую с 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;
}
Что еще я должен искать? Существует ли потребность избавиться от компонентов изображения всегда?
Вызов _Canvas.Children.Clear();
удалит все ссылки на изображения из визуального дерева, так что утечек не будет. Возможно, вы захотите проверить, не хранятся ли старые ссылки на изображения в _Images
или в какой-либо другой коллекции, которую вы можете поддерживать. Например, вы сказали, что кэшируете источники изображений - если вы делаете это неэффективно или поддерживаете постоянно растущий список устаревших изображений, это определенно повлияет на вашу систему.