2010-02-18 5 views
5

Я экспериментирую с WPF и повторно реализую свою старую заставку.Достаточно позвонить Children.Clear на холсте 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; 
} 

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

ответ

6

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

+0

Поле _Images - это просто массив, созданный каждый раз при восстановлении элементов управления, а источники не перезагружаются после того, как программа загрузила их один раз, поэтому для меня это не похоже ни на один из тех, которые может быть виновником. Но спасибо за прояснение этого. Ясно, что этого достаточно, чтобы избавиться от старых элементов управления. По крайней мере, это не та часть. –

 Смежные вопросы

  • Нет связанных вопросов^_^