Sto eseguendo un'animazione in un'app WinForms a 18.66666 ... fotogrammi al secondo (è sincronizzato con la musica a 140 BPM, motivo per cui il frame rate è strano). Ogni cel dell'animazione è precalcolata e l'animazione è gestita da un timer multimediale ad alta risoluzione. L'animazione è liscia, ma sto vedendo una quantità significativa di "strappi", o artefatti che derivano da celle che vengono catturate in parte attraverso un aggiornamento dello schermo.Come eliminare lo strappo dall'animazione?
Quando prendo l'insieme di cels resi dal mio programma e li scrivo in un file AVI, e poi riproduco il file AVI in Windows Media Player, non vedo alcuno strappo. Presumo che WMP riproduca il file senza problemi perché utilizza DirectX (o qualcos'altro) ed è in grado di sincronizzare il rendering con l'attività di aggiornamento dello schermo. Non sta cambiando la frequenza dei fotogrammi, poiché l'animazione rimane sincronizzata con l'audio.
È per questo che WMP è in grado di eseguire il rendering dell'animazione senza strappi o mi manca qualcosa? C'è un modo in cui posso usare DirectX (o qualcos'altro) per consentire al mio programma di essere a conoscenza di dove si trova la linea di scansione corrente, e se è così, c'è un modo in cui posso usare quella informazione per eliminare la lacerazione senza usare effettivamente DirectX per la visualizzazione dei Cels? O devo usare completamente DirectX per il rendering per far fronte a questo problema?
Aggiornamento: dimenticato un dettaglio. La mia app esegue il rendering di ogni cella su una PictureBox utilizzando Graphics.DrawImage. È molto più lento dell'utilizzo di BitBlt, in modo tale da eliminare almeno parte del problema con BitBlt?
Aggiornamento 2: l'effetto che sto vedendo non è sicuramente sfarfallio (che è diverso dallo strappo). Il mio pannello è a doppio buffer, imposta gli stili di controllo per AllPaintingInWmPaint, UserPaint, OptimizedDoubleBuffer ecc., Sovrascrive onPaintBackGround e così via. Tutti questi sono necessari per eliminare lo sfarfallio, ma il problema dello strappo rimane. È particolarmente pronunciato quando l'animazione ha oggetti o oggetti molto veloci che cambiano molto rapidamente dalla luce allo scuro. Quando gli oggetti si muovono lentamente e non cambiano rapidamente colore, l'effetto di strappo è molto meno evidente (perché i cicli consecutivi sono sempre molto simili tra loro).
Stai eseguendo il rendering su un thread separato? –
@Ardman: sì, il rendering viene eseguito su un thread separato (separato dal thread dell'interfaccia utente). – MusiGenesis