Question

J'ai un problème pour dessiner rapidement quelque chose dans .NET. Je ne pense pas que quelque chose en particulier devrait prendre beaucoup de temps, mais sur chaque machine sur laquelle j'ai essayé, j'ai de sérieux problèmes. Ceci est implémenté dans vs2008 .NET, en utilisant C # (avec quelques éléments en C ++, mais aucun élément pertinent pour le dessin).

J'ai trois écrans et l'utilisateur devrait pouvoir basculer entre eux sans délai. Sur le premier écran, il y a quatre boutons, huit contrôles utilisateur comprenant deux boutons et 6 étiquettes chacun, un champ de texte et une liste déroulante. Je ne pense pas que cela soit beaucoup.

Sur le deuxième écran, j'ai quatre étiquettes, six boutons et deux contrôles comportant six boutons, un contexte de dessin OpenGL et environ dix étiquettes chacun.

Sur le troisième écran, j'ai un contexte OpenGL et 10 boutons.

Passer d’un écran à l’autre prend littéralement environ une seconde. Par exemple, si je bascule du deuxième écran au premier, l’application entière s’efface, montrant l’écran d’arrière-plan, puis le premier écran est dessiné. Plusieurs fois, un écran est dessiné au coup par coup, comme si la machine fabriquait délibérément à la main des lettres délicates et délicieuses dans une usine en Suède puis les envoyait individuellement sur mon écran. J'exagère, et je tiens à le préciser, car je ne pense pas que les Suédois sont aussi lents que cela se dessine.

Les premier et deuxième écrans sont dessinés en mémoire et y sont stockés avec juste un '.Hide ()' et un '.Show ()' pour les faire apparaître et disparaître. La double mise en mémoire tampon ne semble pas avoir d'importance. Le troisième écran est dessiné chaque fois à nouveau et semble prendre le même temps que les premier et second.

Des pensées? Que pourrait-il se passer? Comment puis-je le retrouver?

Merci!

Éditer: Je devrais ajouter que tout traitement C ++ et similaire se produit dans son propre thread. MethodInvoke permet parfois d’afficher les résultats de l’opération à l’écran, mais ce problème se produit sans aucune fonction, il suffit d’appuyer sur les boutons pour passer d’un écran à l’autre.

Était-ce utile?

La solution

Outre le profileur mentionné, vous pouvez également désactiver vos contextes OpenGL. Si vous remarquez une accélération, vous saurez que ce sont vos graphiques, et vous pouvez concentrer vos optimisations en conséquence.

Points attribués pour l'humour suédois.

Autres conseils

  

Comment puis-je le retrouver?

dotTrace - http://www.jetbrains.com/profiler/

Effectuez-vous un autre traitement au cours de la " retournement d’écran " un événement? autre que de simplement laisser le formulaire être redessiné? Si vous traitez quelque chose entre des retournements (peut-être votre addition à c ++?) Et que vous n'êtes pas multi-threading, vous obtenez cet effet de blanc. Le formulaire attend probablement que le temps CPU se redessine.

Je n'ai jamais utilisé OpenGL de cette manière, mais vous voudrez peut-être regarder de quelle manière les contextes OpenGL sont inversés. Lorsque vous passez d'une page à une autre, une réinitialisation de périphérique (au sens de DirectX) peut être à l'origine du retard.

Si possible, demandez à un périphérique de dessiner un fichier System.Drawing.Bitmap précédent et utilisez ce bitmap sur les écrans. Indiquez à votre code OpenGL la page en cours sur laquelle l'utilisateur se trouve et peut obtenir la vitesse de traitement souhaitée.

Pour tester cela avant d’apporter des modifications importantes, essayez de supprimer les écrans OpenGL de votre formulaire.

Tout cela est un caprice.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top