WPF Choppy Animation
performance windows-xp-sp3 (4)
¿Tienes algún navegador de Internet abierto? Tuve un problema similar en una animación que estaba ejecutando donde estaba entrecortada ... nada realmente terrible, solo era notable y molesto, como si fuera un micro-tartamudeo cada medio segundo más o menos ...
Por un presentimiento cerré Google Chrome que tenía abierto y el tartamudeo se resolvió por completo. Si tiene algún navegador web abierto mientras lo ejecuta, intente cerrarlo y ver si ayuda, funcionó para mí.
WPF Windows XP SP3
Estoy teniendo un problema con una simple animación WPF.
Uso el siguiente código Xaml (en XamlPad y también en un proyecto WPF):
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<Border Name="MyBorder" BorderThickness="10" BorderBrush="Blue" CornerRadius="10" Background="DarkRed" >
<Rectangle Name="MyRectangle" Margin="10" StrokeDashArray="2.0,1.0" StrokeThickness="10" RadiusX="10" RadiusY="10" Stroke="Black" StrokeDashOffset="0">
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Rectangle.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="MyRectangle" Storyboard.TargetProperty="StrokeDashOffset" From="0.0" To="3.0" Duration="0:0:1" RepeatBehavior="Forever" Timeline.DesiredFrameRate="30" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
</Border>
</Page>
Tiene el efecto de hacer que el borde se anime alrededor del rectángulo. Después de un nuevo reinicio de la máquina, esta animación es agradable y sin problemas. Sin embargo, tiendo a dejar mi máquina encendida todo el tiempo y después de un período de tiempo (no sé por cuánto tiempo), la animación comienza a tartamudear y se vuelve entrecortada.
Pensé que podría tratarse de problemas de memoria o recursos, pero después de cerrar todas las demás aplicaciones y cualquier servicio que parezca innecesario, la tartamudez continúa. Sin embargo, después de reiniciar el sistema, ¡la animación vuelve a ser suave!
Obtengo los mismos síntomas en una aplicación de WPF o en XamlPad. En el caso de la aplicación, no parece haber ninguna diferencia si ejecuto el depurador o si ejecuto el ejecutable directamente.
Apliqué el parche en este enlace: http://support.microsoft.com/kb/981741 y pensé que se había solucionado el problema, pero parece que no.
He visto algunas publicaciones que podrían indicar que el uso de la transparencia podría afectar la animación, pero como puede ver, mi xaml no usa transparencia.
¿Alguien puede darme algunas sugerencias sobre cómo determinar cuál es el problema? ¿Hay alguna herramienta de diagnóstico de WPF que pueda ayudar?
ACTUALIZACIÓN: he comprobado mis controladores de video y son la última versión. (nVidia GeForce 8400 GS)
Creo que con WPF te encontrarás con máquinas que no rinden muy bien. Intenté esto en mi computadora portátil y estuvo bien.
Dejé que la animación funcionara durante más de 30 horas y no se ha ralentizado ni se ha vuelto agitada, pero estoy ejecutando Win 7. También lo dejo correr en una máquina virtual XP durante varias horas y funciona bien.
Mi mejor estimación: Video Driver
Justificación: el controlador de video es el controlador más complejo de su sistema y tiene mucho que ver con el rendimiento general de su computadora. Si bien es posible que el temporizador de envío de animación se esté rezagando, a menos que esté usando una gran cantidad de CPU, es poco probable.
Sugerencias:
- Compruebe si hay una actualización del controlador
- Pruebe con una tarjeta de video diferente (si es posible)
- Abre Crack PerfMon abierto y toma cada contador WPF y DirectX posible y monitorea con el tiempo
Después de ejecutar tu animación por un poco más de un día, no veo nada realmente horrible, aunque el uso de la memoria ha aumentado un poco.
Lo que terminé haciendo fue ejecutar tu ejemplo en XP SP3 en kaxaml, y luego hice una comprobación de rendimiento de algún hombre pobre usando perfmon.
Si no ha utilizado perfmon anteriormente, simplemente ejecute Run -> perfmon desde el menú de inicio. Es probable que se le ocurran algunos contadores que ya están en la lista, pero puede hacer clic en cada uno y eliminarlos si no desea monitorear esos valores. No creo que el uso de CPU en su caso sea el problema, pero puede mantenerlo allí por si acaso.
Haga clic con el botón derecho en cualquier lugar y elija "Agregar contadores", luego en "Objeto de rendimiento", seleccione "Memoria CLR .NET". A la derecha, selecciona el ejecutable de interés (en mi caso, es "Kaxaml"). En el lado izquierdo, selecciona "# Bytes en todos los montones". También cambiaría la frecuencia de muestreo a algo más grande, como 300 segundos, para que pueda tener una mejor idea de la tasa de cambio durante el período de tiempo que está experimentando la desaceleración.
Puede que esto no ayude a encontrar la desaceleración, pero es un primer paso razonable. Quizás también deba descargar la versión de prueba de ANTS 5 profiler para ver si capta algo raro.