2010-02-18 6 views
5

Estoy experimentando con WPF y volviendo a implementar mi viejo protector de pantalla de laberinto.Suficiente para llamar a Children.Clear en un lienzo de WPF para deshacerse de los controles anteriores antes de agregar otros nuevos.

Mi código básicamente agrega un montón de imágenes al lienzo, construyendo una cuadrícula, imágenes de 64x64 píxeles una al lado de la otra, para cubrir todo el lienzo. Luego, "animaré" el movimiento en el laberinto, que se supone recorrerá el laberinto, ajustando una transformación de traducción e intercambiando las imágenes.

Sin embargo, parece que tengo una fuga de algún tipo. Cada vez que cambio el tamaño de la ventana, quiero volver a crear los componentes de la imagen para volver a cubrir el formulario, ya sea con más o menos imágenes.

Si arrastro la esquina inferior izquierda del formulario en círculos cerrados, la parte de reconstrucción se vuelve lenta y lenta.

Para eliminar los viejos controles simplemente me hizo esto:

_Canvas.Children.Clear(); 

es esto suficiente? Debido a la desaceleración, supongo que no es así.

Sin embargo, dado que el laberinto actualmente no es "descubierto" por el "avatar", las imágenes del laberinto se dibujan con un 25% de opacidad, y supongo que si no las eliminase, obtendría muchas imágenes en la parte superior el uno del otro, pero tampoco parece ser eso.

estoy almacenamiento en caché de las fuentes de imagen, los componentes de la imagen se crean de esta manera:

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

imágenes Después que están asignados a mostrar como esto:

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

¿Qué más debo buscar ? ¿Existe la necesidad de deshacerse de los componentes de la imagen de alguna manera?

Respuesta

6

Llamar a _Canvas.Children.Clear(); eliminará todas las referencias a las imágenes del árbol visual, por lo que no hay fugas allí. Es posible que desee comprobar las referencias de imágenes antiguas que se mantienen en _Images, o alguna otra colección que pueda estar manteniendo. Por ejemplo, dijiste que estabas almacenando en caché las fuentes de imagen, hacer esto de manera ineficiente o mantener una lista cada vez mayor de imágenes obsoletas definitivamente afectará tu sistema.

+0

El campo _Images es solo una matriz, se vuelve a crear cada vez que reconstruyo los controles, y las fuentes no se vuelven a cargar después de que el programa las cargó una vez, por lo que para mí no parece ser ninguna de las que podría ser el culpable Pero gracias por aclarar eso. Clear es suficiente para deshacerse de los viejos controles. No es esa parte al menos. –

Cuestiones relacionadas