2008-11-26 7 views
1

J'ai une application C# .NET avec laquelle j'ai créé un contrôle d'affichage d'image personnalisé. Chaque affichage d'image représente son propre contexte d'affichage et dessine l'image à l'aide de glDrawPixels (Oui je sais qu'il vaudrait mieux utiliser des textures, j'envisage dans les futures mais cette application est déjà trop longue et mon temps est limité). J'essaie maintenant d'avoir les deux images pan simultanément. C'est-à-dire, lorsqu'une image est déplacée de dix pixels, la seconde image descend dix pixels. Comme si:Mises à jour simultanées sur deux contextes d'affichage dans openGL

imageOne.YPan -= 10; 
imageTwo.YPan -= 10; 
imageOne.Invalidate(); //This forces a redraw. 
imageTwo.Invalidate(); //This forces a redraw. 

D'accord, voici le problème que j'ai. Un seul des affichages d'images est en train de se redessiner. Si je place une pause entre les deux appels Invalider et que la durée de la pause est d'au moins 110 millisecondes, les deux seront redessinés, mais pas simultanément. Il semble donc que la deuxième image essaie toujours de rattraper la première. De plus, une pause de 110 millisecondes ralentit trop le mouvement.

J'ai essayé de placer la mise à jour et l'invalidation de chaque image dans son propre fil mais cela n'a pas aidé.

Au début du dessin, je mets le contexte approprié à jour, et à la fin j'appelle swapbuffers(). J'ai essayé d'ajouter un glfinin à la fin de la fonction de tirage, mais il n'y avait aucun changement.

Se pourrait-il que ce soit la carte graphique qui pose problème? Je suis coincé en utilisant un GPU intégré qui a seulement OpenGL 1.4.

J'espère avoir fourni suffisamment de détails pour pouvoir trouver la réponse à mon problème.

Répondre

1

Il est difficile de dire ce qui ne va pas avec ce que vous faites puisque vous donnez si peu de détails. Voici quelques conseils qui peuvent aider.
- avant de faire quelque chose dans un contexte, assurez-vous que vous en faites l'actuel. Si vous voulez faire un panoramique sur deux contextes, faites le premier courant, faites-le un panoramique, puis mettez le second à jour et faites-le pivoter. Ce n'est pas une vraie raison pour laquelle cela ne devrait pas fonctionner.
- S'il semble y avoir un problème de synchronisation, l'ajout de glFinish() à des endroits stratégiques peut aider à éliminer le problème
- Comme toujours, appelez glError() et vérifiez que tout s'est bien passé.
- Je ne sais pas comment cela se fait dans le cadre dont vous parlez, mais vous devez vous assurer que les deux contextes obtiennent un swapBuffers() appel pour chaque image.

0

Invalidate ne force pas un rafraîchissement immédiat. Il marque la fenêtre invalide, et lorsque la file d'attente de messages est à court d'autres messages, un message de peinture sera créé et traité. Mais cela ne se produira pas tant que vous n'aurez pas fini de traiter le message en cours et que vous ne retournerez pas à la boucle du message principal, et que cela pourrait être retardé encore plus que cela.

Généralement l'animation OpenGL est une exception à la règle consistant à faire tous les dessins à l'intérieur de Control.OnPaint (ou dans un gestionnaire pour l'événement Control.Paint).

Questions connexes