Estoy midiendo el tiempo entre fotogramas en una simple animación WPF. Perforator dice que la aplicación funciona a ~ 60 fps, por lo que esperaba que el tiempo entre fotogramas fuera ~ 16,6 m con poca desviación.¿Por qué la velocidad de fotogramas en WPF es irregular y no está limitada a la actualización del monitor?
public MainWindow()
{
...
CompositionTarget.Rendering += Rendering;
}
List<long> FrameDurations = new List<long>();
private long PreviousFrameTime = 0;
private void Rendering(object o, EventArgs args)
{
FrameDurations.Add(DateTime.Now.Ticks - PreviousFrameTime);
PreviousFrameTime = DateTime.Now.Ticks;
}
Dos cosas me sorprendieron:
- tiempo entre cuadros es bastante irregular
- tiempo entre tramas es ~ 8 ms. Esperaba que la frecuencia de actualización del monitor estableciera un límite inferior de tiempo entre fotogramas (es decir, 60Hz = 16.6ms entre cada fotograma, y cualquier cosa más rápida no tiene sentido).
Y - Tiempo entre tramas en las garrapatas (10.000 registros = 1ms)
X - Frame recuento
posibles factores de confusión
- temporizador inexactitud
- Si CompositionTarget .Rendering en realidad no se correlaciona con el dibujo de un solo cuadro
El proyecto que estoy usando: SimpleWindow.zip
=== Editar
Markus señaló que podría estar utilizando RenderingEventArgs.RenderingTime.Ticks en lugar de DateTime.Now.Ticks. Repetí la carrera y obtuve resultados muy diferentes. La única diferencia es el tiempo método:
DateTime.Now.Ticks
RenderingEventArgs.RenderingTime.Ticks
datos de RenderingEventArgs producido datos mucho más cerca el esperado 16.6ms/frame, y es consistente.
- No estoy seguro de por qué DateTime.Now y RenderingEventArgs producirían datos tan diferentes.
- Suponiendo que RenderingEventArgs está produciendo los tiempos correctos, todavía es un poco desconcertante que esos tiempos no sean los 16.6ms esperados.
Si la pantalla se actualiza cada 16.6ms y WPF se actualiza cada 14.9ms, podemos esperar una condición de carrera que provoque la rotura. Es decir, aproximadamente cada décimo marco WPF intentará escribir su imagen mientras la pantalla intenta leer la imagen.
La clase cronómetro es el camino a seguir para evitar temporizador inexactitud –
esto 'podría' ser útiles : http://rhnatiuk.wordpress.com/2008/12/21/wpf-video-playback-problems/ - No estoy seguro de cuán relevante es este problema, pero creo que todavía existe en la actualidad. –
@Tristan @Martin ¡no es necesario medir el tiempo! puede [lanzar EventArgs a RenderingEventArgs para obtener el RenderTime] (http://msdn.microsoft.com/en-us/library/system.windows.media.compositiontarget.rendering (VS.95) .aspx) –