2009-11-23 9 views

Respuesta

34

Después de haber ganado un poco más de experiencia en este campo, ya que he hecho la pregunta, voy a responder yo mismo. Mi experiencia viene de trabajar en la aplicación de mapas mentales WPF NovaMind - Hemos hecho un montón de animaciones últimamente para nuestro Presenter feature en NovaMind Platinum :-)

La sección de MSDN en optimizar el rendimiento de aplicaciones WPF tiene alguna información útil acerca de las consideraciones generales al escribir aplicaciones WPF:

http://msdn.microsoft.com/en-us/library/aa970683.aspx

Aquí están algunos bits que he encontrado especialmente útiles y están relacionados con la animación:

  • El evento CompositionTarget.Rendering hace que WPF se active continuamente. Si usa este evento, sepárelo en cada oportunidad.

  • Cuando utiliza un Pincel para establecer el Relleno o el trazo de un elemento, es mejor establecer el valor Brush.Opacity en lugar de establecer la propiedad Opacity del elemento. La modificación de la propiedad de Opacidad de un elemento puede hacer que WPF cree una superficie temporal.

  • Puede actualizar una Transformación en lugar de reemplazarla por el valor de una propiedad RenderTransform. Esto es particularmente cierto en escenarios que involucran animación. Al actualizar una transformación existente, evita iniciar un cálculo de diseño innecesario.

Aquí es lo que he aprendido a través de ensayo y error:

  1. Diga, usted tiene un par de elementos con un efecto tal como se aplica la BlurEffect. Es manera más rápido para aplicar el efecto al contenedor de estos elementos en lugar de los elementos en sí mismos. A pesar de que el efecto es hardware acelerado, WPF no parece ser bueno en el manejo de una serie de elementos pequeños con efectos. - Si no quiere el mismo radio de desenfoque y no puede agruparlos en un contenedor con el efecto aplicado, en realidad es más rápido renderizar el elemento en un mapa de bits (en el software) y luego animar el mapa de bits (si es posible) . Tener efectos (u opacidad para el caso) en objetos mata rápidamente el rendimiento al animar.
  2. Establecer la opacidad en el pincel en lugar del elemento (como se menciona más arriba) hace una enorme diferencia de rendimiento al animar objetos.
  3. Mantenga baja la cantidad de visualizaciones. Animar una gran cantidad de partículas es difícil, incluso con los consejos anteriores. En este caso, es posible que deba volver a WriteableBitmap en su lugar.

También he oído que es más rápido renderizar muchos objetos pequeños anulando OnRender en el contenedor y luego representándolos usando el drawingContext en lugar de agregarlos al árbol visual directamente. En la práctica esto no hizo ninguna diferencia en mi escenario (cuando se renderizan alrededor de 300 geometrías de elipse) pero podría ser útil en algunos escenarios. La teoría suena sólida.

Finalmente, encontré que las clases de animación integradas en WPF eran demasiado engorrosas y me divertí mucho más y tuve éxito al utilizar las bibliotecas de animación de los favoritos: Artefact Animator. En serio, pruébalo.(también está disponible para Silverlight) Es lo que debería ser la animación (en código).

Sin embargo, no todo son arcoíris y unicornios. Todavía me resulta imposible crear animaciones verdaderamente fluidas cuando se ejecuta a pantalla completa en resoluciones más altas. Más sobre eso en mi pregunta How to know why an animation stutters? - Agradecería cualquier aporte sobre eso.

aplausos, buena suerte y si tiene algo genial para mostrar, hágamelo saber :)