2010-06-09 20 views
6

Intentando crear un control de marquesina con una animación de texto suave. Los esfuerzos actuales incluyen:Animación de texto suave (Marquee) con WPF

  • Usando traducir transformar
  • El uso de la animación en las propiedades de dependencia de mano (izquierda, derecha)
  • El uso de la animación en la propiedad de dependencia a medida (punto) y el uso de elementos visuales de dibujo (FormattedText)
  • Uso CompositionTarget.Rendering

Pero la animación sigue siendo agitada y requiere muchos recursos (2-10% de CPU).

Código de ensayo utilizado en defecto WPF ventana que supongo debe producir una animación suave:

<TextBlock x:Name="_box" FontSize="64" CacheMode="BitmapCache" Text="lorem ipsum"> 
     <TextBlock.RenderTransform> 
      <TranslateTransform x:Name="AnimatedTranslateTransform" X="0" Y="0" /> 
     </TextBlock.RenderTransform> 
     <TextBlock.Triggers> 
      <EventTrigger RoutedEvent="TextBlock.Loaded"> 
       <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimation 
        Storyboard.TargetName="AnimatedTranslateTransform" 
        Storyboard.TargetProperty="X" 
        From="-300" To="300" Duration="0:0:5" 
        AutoReverse="True" RepeatBehavior="Forever" /> 
       </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger> 
      </TextBlock.Triggers> 
    </TextBlock> 

Lista de comprobación:

  • confirmado que no hay representación del software se lleva a cabo (herramienta de rendimiento ms y comprobar RenderCapability. Nivel)
  • Llamada congelar en cualquier objeto imaginable
  • Habilitado cualquier efecto de mapa de bits y transparencia
  • comprobado todos los controles de marquesina hacia fuera allí (mismas cuestiones)

analizadas en:

  • CPU: Intell núcleo 2 Duo (T6600) @ 2.2Ghz
  • RAM: 4 GB
  • GPU : NVidia GeForce 9600M GS (controladores más recientes)
  • OS: Windows 7 (64 bits)

¿Alguna idea (o mejor aún ejemplo de código)?

De las respuestas parece que este no es un problema de wpf (otros controles de marquesina funcionan bien para otros pero no para mí), estoy recibiendo los mismos problemas en cada máquina que probé esto.

+0

Parece que hay un problema con algunas de las computadoras en las que se probó. También construir una versión de lanzamiento ayuda mucho. – Goran

Respuesta

1

Hope esto le puede ayudar - http://jobijoy.blogspot.com/2008/08/silverlight-marquee-control.html

Y la versión de WPF también puede ser encontrado here

+0

Sí, es uno de los controles que examiné (incluida la versión de wpf), no es sencillo y requiere una gran cantidad de recursos para una tarea tan simple. – Goran

+0

Probé las versiones de Silverlight y WPF de la aplicación de ejemplo de Jobi Joy en algunos hardware anticuados. Ambos se animaron sin problemas y utilizaron muy pocos recursos, a pesar de que animaban mucho más que una simple marquesina. Creo que debe haber algo especial acerca de su hardware o entorno que causa el problema. Quizás debas agregar especificaciones detalladas de hardware, SO, NET Framework y de uso de recursos a tu pregunta para que otros puedan intentar duplicar tu problema. –

+0

Esto es realmente extraño: cada máquina que he probado esto en el texto y la imagen se agitan cada 2 a 5 segundos. He actualizado mi pregunta. – Goran

4

La animación será manejado por completo en la capa MilCore si:

  1. Su TranslateTransform es una RenderTransform (no un LayoutTransform) y
  2. Utiliza una animación simple como una doble animación y
  3. Su objeto no tiene recorte o la opacidad cálculos

Trate de usar un TranslateTransform de animación por DoubleAnimation para un RenderTransform en un TextBlock que es un hijo directo de una ventana con la configuración predeterminada.

  • Si esto sigue siendo lento, hay algo lento en cuanto a su sistema de Direct3D porque el código administrado no está involucrado en absoluto y llamadas de MilCore son muy simples, pero

  • Si funciona sin problemas y eficientemente, de forma incremental cámbielo a su código de bajo rendimiento para ver qué cambio causa la desaceleración.

Teniendo en cuenta su respuesta a la respuesta de la alegría Jobi Sospecharía el problema está en algún lugar en su configuración de hardware o Direct3D, pero la única manera de averiguarlo es para probarlo.

+1

Lo he intentado (vea la pregunta actualizada): sigo teniendo los mismos problemas. ¿Algún diagnóstico que pueda pensar para identificar si hay un problema con las máquinas con las que estoy tratando? – Goran

3

Si está utilizando WPF 4.0, intente configurar el CacheMode="BitmapCache" (en el XAML) en el elemento que está animando, en este caso, probablemente un TextBlock.

+0

Buena idea, pero no resuelve mi problema. Parece que la falla está en mi máquina (OS o HW) pero no se me ocurre nada. – Goran

+2

¡Santa vaca! Tuve un problema con una animación que involucraba unos cincuenta elementos de la interfaz de usuario. Esto me atormentó por varias semanas, pero fue aclarado con este atributo. Arg, ¿por qué me tomó tanto tiempo encontrar esto? – Jeb

Cuestiones relacionadas