Достаточно позвонить Детям. Ясный на холсте 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;
}

Что еще я должен искать? Существует ли потребность избавиться от компонентов изображения всегда?

5
задан Dave Clemmer 26 September 2011 в 17:32
поделиться

1 ответ

Вызов _Canvas.Children.Clear(); удалит все ссылки на изображения из визуального дерева, так что утечек не будет. Возможно, вы захотите проверить, не хранятся ли старые ссылки на изображения в _Images или в какой-либо другой коллекции, которую вы можете поддерживать. Например, вы сказали, что кэшируете источники изображений - если вы делаете это неэффективно или поддерживаете постоянно растущий список устаревших изображений, это определенно повлияет на вашу систему.

6
ответ дан 14 December 2019 в 13:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: