2010-12-29 14 views
10

¿Cómo puedo suspender y reanudar el diseño en WPF? Escuché que esto no es necesario. ¡Pero esto es extremadamente necesario!¿Cómo puedo suspender y reanudar el diseño en WPF?

Proceso una gran cantidad de posiciones de cambio, y si se representan una por una, crea un efecto de retardo.

Éstos son algunos código:

 

CompositionTarget.Rendering += new EventHandler(Draw); 
void Draw(object sender, EventArgs e) 
{ 
    //Clean screen 
    for (int i = mainCanvas.Children.Count - 1; i > -1; i--) 
    { 
    if (mainCanvas.Children[i] is PlayerUserControl || mainCanvas.Children[i] is Image) 
    { 
      mainCanvas.Children.Remove(mainCanvas.Children[i]); 
    } 
    } 
    //DRAW FLOOR AROUND 
    FloorService.FloorEntity[] floorsAround = floorService.selectFloorsAround(Player.id); 
    for... 
    { 
     Image image = new Image(); 
     image.Source = new BitmapImage(new Uri("/" + floorsAround[i].ImageSource, UriKind.Relative)); 
     mainCanvas.Children.Add(image); 
    } 

    //DRAW PLAYERS AROUND 
    //Its similar as draw floors around. 
    ... 
} 
 
+3

@ Alan, antes de buscar cazadores de recompensas, dedique algo de tiempo a agregar más información a su pregunta. Alguien podría encontrar una mejor solución. ¡Tendrás que agregarlo incluso para cazarrecompensas! :) – decyclone

+4

@ Alan Su problema no es la falta de recompensa, es la falta de detalles en la pregunta. Mi impresión es que su solución (suspender el diseño) no es lo que realmente desea, por lo que las personas necesitan más detalles para encontrar la raíz de su problema. – CodesInChaos

+0

Es tan simple que ya lo describí. Para los jugadores esto es aún más simple. – Seva

Respuesta

7

No ha dado suficiente información excepto para decir que su "procesar una gran cantidad de cambios". Pero si haces todos esos cambios:

  • secuencialmente
  • desde el subproceso de interfaz de usuario
  • sin llamar UpdateLayout y
  • sin volver

entonces no se produce ninguna disposición en bewteen esos cambios . Por lo tanto, no hay nada que suspender o reanudar porque el diseño siempre se difiere hasta después de que regrese de realizar este tipo de cambios.

Por lo tanto, si experimenta retrasos, entonces no se debe a que su lote no está en proceso de cambio de sus diseños a WinForms. Como resultado, la única forma de reducir la demora, si es que se debe a la disposición, es evitar nuevos cálculos innecesarios. De nuevo, sin saber lo que estás haciendo, es imposible sugerir algo concreto. Pero hay muchas propiedades que puede evitar para desencadenar un pase de diseño recursivo. Ver Consideraciones de rendimiento Disposición en este artículo:

+0

Agregué el código ahora. Si pudieras ver, gracias. – Seva

+0

Puede obtener un buen rendimiento con elementos WPF como sprites, e incluso puede cambiar su posición en cada renderizado para obtener la velocidad de cuadro más rápida posible. Solo necesita volver a utilizar los elementos de marco a marco y ajustar su ubicación cambiando los campos de una transformación de renderizado, no recreándolos desde cero cada ciclo. –

+0

En el desarrollo del juego, no usamos esta técnica, porque es difícil saber qué objeto desapareció de la ventana. – Seva

13

WPF es un motor de retenido composición. Lo que significa es que no tiene que hacer el renderizado conectando el evento Rendering, sino que compone una imagen usando nodos que pondrá en un árbol. Consulte aquí para obtener detalles sobre la arquitectura de WPF: WPF Architecture. Puedo asegurarle que si comprende perfectamente este documento, así como el enlace del Sistema de diseño enviado por Rick Sladkey, también debe entender por qué debería cambiar su código si desea continuar con WPF.

Si juegas bien con WPF (es decir: usa propiedades de dependencia, reemplaza Medida & Organiza métodos por ejemplo), verás que es un motor muy poderoso capaz de mostrar miles de nodos en el árbol gráfico. Sugiero otra lectura útil: ZoomableApplication2: A Million Items

0

¿Ha considerado eliminar primero el lienzo de la ventana que lo escondería, luego borrar y volver a agregar todos sus elementos al lienzo, y luego volver a agregar el lienzo a la ventana?

+0

Lo intenté, no funcionó demasiado. – Seva

Cuestiones relacionadas