2010-02-18 6 views
5

Sto sperimentando con WPF e re-implementando il mio vecchio salvaschermo di labirinto.Abbastanza per chiamare Children.Clear su una tela WPF per sbarazzarsi di vecchi controlli prima di aggiungerne di nuovi?

Il mio codice aggiunge fondamentalmente un mucchio di immagini alla tela, creando una griglia, immagini 64x64 pixel l'una accanto all'altra, per coprire l'intera tela. Quindi "animo" il movimento nel labirinto, che dovrebbe far scorrere il labirinto in giro, regolando una trasformazione di traduzione e scambiando le immagini.

Tuttavia, sembra che io abbia una perdita di qualche tipo. Ogni volta che ridimensiono la finestra, voglio ricostruire i componenti dell'immagine per coprire di nuovo il modulo, con più o meno immagini.

Se trascino l'angolo in basso a sinistra del modulo in cerchi stretti, la parte di ricostruzione diventa più lenta e più lenta.

per rimuovere il vecchio controlli ho semplicemente fatto questo:

_Canvas.Children.Clear(); 

basta questo? A causa del rallentamento, presumo che non lo sia.

Tuttavia, poiché il labirinto non è attualmente "scoperto" dall'avatar, le immagini del labirinto sono disegnate con il 25% di opacità e presumo che se non riuscissi a rimuoverle, otterrei molte immagini sopra l'uno dall'altro, ma non sembra neanche questo.

sto caching le fonti di immagine, i componenti dell'immagine vengono creati in questo modo:

_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; 
    } 
} 

immagini Successivamente sono assegnati per mostrare come questo:

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; 
} 

Che altro devo cercare ? È necessario smaltire i componenti dell'immagine in alcun modo?

risposta

6

La chiamata a _Canvas.Children.Clear(); rimuoverà tutti i riferimenti alle immagini dall'albero visivo, quindi non ci sono perdite. Si consiglia di verificare la presenza di riferimenti alle immagini precedenti in _Images o in un'altra raccolta che si potrebbe mantenere. Ad esempio, hai detto che stavi memorizzando nella cache le fonti di immagini - in questo modo in modo inefficiente, o il mantenimento di un elenco sempre crescente di immagini obsolete avrà sicuramente un impatto sul tuo sistema.

+0

Il campo _Images è solo un array, ricreato ogni volta che ricostruisco i controlli e le origini non vengono ricaricate dopo che il programma le ha caricate una volta, quindi a me non sembra che sia una di quelle che potrebbe essere il colpevole Ma grazie per chiarire questo. Chiaro è davvero sufficiente per sbarazzarsi dei vecchi controlli. Almeno non è quella parte. –

Problemi correlati