2009-08-24 4 views
2

J'essaye d'écrire une application (winforms) qui peut démontrer comment deux couleurs oscillantes résulteront en une troisième couleur. Pour cela, je dois pouvoir basculer entre deux couleurs très rapidement (à> 50 fps). J'espère vraiment faire ceci dans le code managé.Comment implémenter l'animation à haute vitesse?

En ce moment, je dessine deux petites images bitmap rectangulaires avec des couleurs unies les unes sur les autres. L'utilisation de GDI + DrawImage avec deux bitmaps en mémoire dans un contrôle activé par double tampon ne le coupe pas et entraîne des scintillements/déchirures à haute vitesse. Une minuterie connectée à un curseur déclenche la commutation.

  1. Est-ce une approche raisonnable?
  2. GDI et BitBLT seront-ils meilleurs?
  3. Est-ce que WPF fonctionne mieux?
  4. Qu'en est-il de DirectX ou d'autres technologies ?

J'apprécierais vraiment vos commentaires, TIA!

Répondre

2

Je n'ai jamais eu de chance avec GDI pour faire des graphismes à haute vitesse, donc j'ai utilisé DirectX, mais MS a abandonné le support pour Managed DirectX, donc vous devrez le faire en C++ non managé. Il suffit d'écrire votre contrôleur en C#, puis d'avoir une couche très fine de C++ géré qui appelle simplement la DLL C++ non managée qui a le support DirectX.

Vous aurez besoin d'obtenir le contrôle exclusif de l'ordinateur, de sorte qu'aucune autre application ne peut vraiment utiliser le processeur, sinon vous constaterez que votre framerate peut tomber, ou du moins ne pas être très cohérent. Si vous utilisez une ancienne version de DirectX, par exemple DirectX 9.0c, qui peut encore prendre en charge .NET, j'ai utilisé cette option pour obtenir un taux de framerate d'environ 70 images/seconde.

+0

Je n'ai pas écrit C++ au cours des années (depuis l'université en fait), mais si je peux sortir avec un minimum de code C++, ce serait génial. – chriscena

+0

Malheureusement, si vous utilisiez une version plus récente de DirectX, vous feriez beaucoup plus de C++, alors cherchez la version que j'ai mentionnée. –

+0

Commentaires en retard, mais de toute façon: Cela a fini comme la solution, en raison de certains problèmes d'arrachement je ne pouvais pas trouver une solution rapide pour SDL. Trouvé la version DirectX 9.0c, créé un contrôle Winform qui a fait la magie graphique.Pour éviter l'installation supplémentaire de DirectX, je viens de regrouper les DLL MDX nécessaires dans la solution de l'application. Merci. – chriscena

1

Flicker devrait être évités grâce à une approche à double tampon (et par ce que je ne pas signifie que la mise en propriété de contrôle de rendu DoubleBuffered True - ironiquement, cela n'a aucun effet sur le scintillement).

Le déchirement peut être traité via DirectX, mais uniquement si vous synchronisez votre fréquence d'images avec la fréquence de rafraîchissement de votre moniteur. Cela peut ne pas être possible, surtout si vous avez besoin d'atteindre une fréquence d'images spécifique (et cela ne correspond pas à la fréquence d'actualisation de votre moniteur). Je ne pense pas que WPF contourne le problème fondamental de déchirure (mais je peux me tromper).

+0

Merci pour vos commentaires. – chriscena

1

Cela fonctionnera avec GDI, mais vous ne pourrez pas contrôler le scintillement, c'est donc hors de question. Direct X peut être beaucoup de fluff supplémentaire juste pour montrer deux images non scintillantes. Peut-être que SDL fonctionnera assez bien? Il est multi-plateforme et vous pouvez littéralement coder cet effet dans moins de 30 lignes de code.

http://cs-sdl.sourceforge.net/index.php/SimpleExample

+0

J'avais oublié de SDL. Certainement aller tester cela, car il existe une bibliothèque .NET disponible. Cela pourrait juste être la solution. – chriscena

Questions connexes