Je fais tourner une animation dans une application WinForms à 18.66666... images par seconde (elle est synchronisée avec une musique à 140 BPM, ce qui explique le taux d'images bizarre). Chaque cellule de l'animation est précalculée, et l'animation est pilotée par un minuteur multimédia haute résolution. L'animation elle-même est fluide, mais je constate une quantité importante de "déchirures", c'est-à-dire d'artefacts résultant de la capture de cels à mi-chemin d'un rafraîchissement d'écran.
Lorsque je prends l'ensemble des images rendues par mon programme et que je les écris dans un fichier AVI, puis que je lis ce fichier AVI dans Windows Media Player, je ne vois aucun déchirement. Je suppose que WMP lit le fichier sans problème parce qu'il utilise DirectX (ou autre) et est capable de synchroniser le rendu avec l'activité de rafraîchissement de l'écran. Il ne modifie pas la fréquence d'images, car l'animation reste synchronisée avec l'audio.
Est-ce la raison pour laquelle WMP est capable d'effectuer le rendu de l'animation sans déchirure, ou est-ce que je rate quelque chose ? Existe-t-il un moyen d'utiliser DirectX (ou quelque chose d'autre) pour permettre à mon programme de savoir où se trouve la ligne de balayage actuelle, et si oui, existe-t-il un moyen d'utiliser cette information pour éliminer le déchirement sans utiliser DirectX pour l'affichage des images ? Ou dois-je utiliser pleinement DirectX pour le rendu afin de résoudre ce problème ?
Mise à jour J'ai oublié un détail. Mon application rend chaque cellule sur une PictureBox en utilisant Graphics.DrawImage. Est-ce que cela est beaucoup plus lent que l'utilisation de BitBlt, au point que je pourrais éliminer au moins une partie du déchirement en utilisant BitBlt ?
Mise à jour 2 L'effet que je vois n'est certainement pas du scintillement (qui est différent du déchirement). Mon panneau est à double tampon, il définit les styles de contrôle pour AllPaintingInWmPaint, UserPaint, OptimizedDoubleBuffer, etc. et surcharge onPaintBackGround, etc. Toutes ces mesures sont nécessaires pour éliminer le scintillement, mais le problème du déchirement demeure. Il est particulièrement prononcé lorsque l'animation comporte des objets qui se déplacent très rapidement ou des objets qui passent du clair au foncé très rapidement. Lorsque les objets se déplacent lentement et ne changent pas de couleur rapidement, l'effet de déchirement est beaucoup moins perceptible (parce que les cels consécutifs sont toujours très similaires les uns aux autres).