Pregunta

Estoy creando y la aplicación que necesita agregar y eliminar mucho UIElement a un Canvas. Básicamente un Canvas contiene una colección de UIElement y automáticamente lo actualiza/actualiza en la pantalla dependiendo de lo que contenga.

Para evitar tener toneladas de UIElements quienes se superponen en la pantalla, prefiero agregarlos todos en una secundaria Canvas Luego crea un Image de eso (gracias a WritableBitmap). Finalmente agrego esto Image En mi actual Canvas. Al permitir tener solo unas pocas imágenes en mi lienzo, espero tener un mejor rendimiento. Desafortunadamente parece que no puedo eliminar por completo el WritableBitmap, incluso si lo configuro en null.

El siguiente código lo ilustra:

//My constructor
public  WP8Graphics() 
{
    //Here my collection DataBinded with the Canvas from the Mainpage
    this.UIElements = new ObservableCollection<UIElement>();
    //The secondary Canvas
    GraphicCanvas = new Canvas();
    GraphicCanvas.Height = MainPage.CurrentCanvasHeight;
    GraphicCanvas.Width = MainPage.CurrentCanvasWidth;
}


///This method can be hit thousand times, it basically create a rectangle 
public void fillRect(int x, int y, int width, int height)
{

// some code
// CREATE THE RECTANGLE rect

   GraphicCanvas.Children.Add(rect); // My secondary Canvas



   WriteableBitmap wb1 = new WriteableBitmap(GraphicCanvas, null);
   wb1.Invalidate();

   WriteableBitmap wb2 = new WriteableBitmap((int)MainPage.CurrentCanvasWidth, (int)MainPage.CurrentCanvasHeight);

  for (int i = 0; i < wb2.Pixels.Length; i++)
  {
       wb2.Pixels[i] = wb1.Pixels[i];
  }
  wb2.Invalidate();

  wb1 = null;

  Image thumbnail = new Image();
  thumbnail.Height = MainPage.CurrentCanvasHeight;
  thumbnail.Width = MainPage.CurrentCanvasWidth;
  thumbnail.Source = wb2;



  this.UIElements.Add(thumbnail);

}

Después de algo como 24 WriteableBitmap creo un OutOfMemoryException aparece. Leí muchos artículos sobre este problema y en mi caso parece el WriteableBitmap depende de mi Gráfico y permanece porque todavía tiene una referencia a ello. No puedo eliminar mi lienzo gráfico ni establecido Mi imagen Fuente de NULL.

Tengo 2 preguntas:

  • ¿Hay otra forma de crear una imagen de lienzo o una colección de uielements?
  • ¿Es posible eliminar la referencia que mantiene viva ese mapbitmap?

Espero ser lo suficientemente claro y fácil de leer.

Gracias por leer.

Editado con sugerencia de Atomaras, pero sigue siendo el mismo problema

WriteableBitmap wb1 = new WriteableBitmap(GraphicCanvas, null);Esta línea todavía arroja OffMemoryException.

¿Fue útil?

Solución

Debe copiar los píxeles del WriteableBitMap original (que se aferrará a GraphicScanvas) a un nuevo WriteableBitMap.

Echa un vistazo a esta gran publicación http://www.wintellect.com/blogs/jprosise/silverlight-s-big-image-problem-and-what-you-can-do-bout-it

Además, ¿por qué mantienes todos los Maps de escritura en la colección Uielements? ¿No sería suficiente el último? ¿No puedes borrar la colección de Uielements justo antes de agregar el último/nuevo mapa de bits?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top