Estoy ejecutando una animación en una aplicación de WinForms a 18.66666 ... fotogramas por segundo (está sincronizada con música a 140 BPM, por lo que la velocidad de fotogramas es extraña). Cada celda de la animación está precalculada, y la animación es impulsada por un temporizador multimedia de alta resolución. La animación en sí es fluida, pero estoy viendo una cantidad significativa de "desgarro", o artefactos que resultan de la captura de celdas a través de una actualización de pantalla.¿Cómo eliminar el desgarro de la animación?
Cuando tomo el conjunto de celdas renderizadas por mi programa y las escribo en un archivo AVI, y luego reproduzco el archivo AVI en Windows Media Player, no veo ninguna rotura en absoluto. Supongo que WMP reproduce el archivo sin problemas porque usa DirectX (u otra cosa) y puede sincronizar la representación con la actividad de actualización de la pantalla. No está cambiando la velocidad de cuadros, ya que la animación permanece sincronizada con el audio.
¿Es esta la razón por la que WMP puede renderizar la animación sin romperse, o me falta algo? ¿Hay alguna forma de que pueda usar DirectX (u otra cosa) para permitir que mi programa sepa dónde está la línea de exploración actual y, de ser así, hay alguna forma de que pueda usar esa información para eliminar el desgarro sin utilizar DirectX? para mostrar los cel? ¿O tengo que usar DirectX por completo para procesar este problema?
Actualización: se olvidó de un detalle. Mi aplicación representa cada celda en un PictureBox usando Graphics.DrawImage. ¿Es esto significativamente más lento que el uso de BitBlt, de modo que podría eliminar al menos parte del desgarro utilizando BitBlt?
Actualización 2: el efecto que estoy viendo definitivamente no es parpadeo (que es diferente de lagrimeo). Mi panel tiene doble amortiguación, establece los estilos de control para AllPaintingInWmPaint, UserPaint, OptimizedDoubleBuffer, etc., anula onPaintBackGround y así sucesivamente. Todos estos son necesarios para eliminar el parpadeo, pero el problema de lagrimeo permanece. Es especialmente pronunciado cuando la animación tiene objetos u objetos que se mueven muy rápido y cambian de claro a oscuro muy rápidamente. Cuando los objetos se mueven lentamente y no cambian de color rápidamente, el efecto de rasgado es mucho menos notorio (porque los cels consecutivos son siempre muy similares entre sí).
¿Está ejecutando la representación en un hilo separado? –
@Ardman: sí, el renderizado se realiza en un hilo separado (separado del hilo de UI). – MusiGenesis