2011-09-09 10 views
3

J'ai développé une application dans wxWidgets dans laquelle j'utilise le bitmap pour dessiner. Donc, la première fois que mon application se lance, elle lit les coordonnées à partir du fichier et dessine les lignes en conséquence. L'application reçoit également des paquets UDP du réseau, les paquets UDP contiennent également des informations de coordonnées xy qui doivent être dessinées sur l'écran, donc quand le paquet est reçu je redessine l'image bitmap, et affiche sur l'écran, j'ai aussi besoin de rafraîchir le bitmap lors d'un mouvement de souris, car il y a un nouveau dessin que je dois dessiner à l'écran. Tout cela augmente le coût d'exploitation et ralentit mon interface utilisateur graphique. Alors, suggérez-moi une approche de dessin alternative qui, selon vous, pourrait être efficace dans cette situation.Meilleure approche de dessin

J'ai fait une recherche sur Google et j'ai eu l'option d'OpenGL, mais en raison du manque de temps je ne veux pas utiliser OpenGL, parce que je n'ai aucune expérience d'OpenGL.

+4

Vous avez obtenu 1337 points. Je n'aime pas ça. Upvoted: P – Flavius

+1

Ne pouvez-vous pas enregistrer une instance de bitmap en mémoire et y puiser de nouvelles informations, sans redessiner le tout? Et étirer-blit le bitmap à l'écran ... – Lucian

+0

@freerider, je dessine quelques informations spécifiques sur la mémoire, mais quand je dois enlever les lignes existantes de bitmap et dessiner de nouvelles lignes, dans cette situation je dois redessiner le bitmap entier . – Siddiqui

Répondre

0

Enregistrer les données à dessiner au lieu de toujours actualiser l'image bitmap et demander à la boucle principale de rafraîchir le bitmap de temps à autre.

De cette façon, vous pouvez faire en sorte que le programme ne s'emballe jamais. L'envers est bien sûr que la réactivité sera plus faible (c'est-à-dire quand les données arrivent, elles ne seront pas vues à l'écran pendant 20 millisecondes au lieu de tout de suite).

1

Il semble que votre problème soit que votre interface graphique ne réponde pas à l'entrée utilisateur car l'application est en train de redessiner l'affichage. Il y a quelques solutions générales à ce genre de problème. Dessinez le bitmap en mémoire à l'aide d'un thread de travail.

  1. Dessinez le bitmap en mémoire. Pendant que cela se passe, le thread principal peut continuer à interagir avec l'utilisateur. Une fois que le bitmap a été redessiné, le thread de travail signale le thread principal, et le thread principal a ensuite copié le bitmap terminé sur l'écran - ce qui est extrêmement rapide. Utilisez le thread principal pour dessiner le bitmap directement à l'écran, mais saupoudrer le code de dessin avec des appels à wxApp :: Yield(). Cela permettra à l'interface graphique de rester sensible à l'utilisateur pendant un long processus de dessin.

Option 1 est le « meilleur », en particulier lors de l'exécution sur les machines multi-cœurs, mais il est difficile de garder les deux fils synchronisés et empêcher discorde entre eux, sauf si vous avez une expérience significative avec la conception de multithreading. L'option 2 est beaucoup plus simple, mais vous devez toujours faire attention à ce que l'interaction de l'utilisateur ne démarre pas un autre processus de dessin avant la fin du premier.

+0

Cela ne changera rien, "dessiner en mémoire" est un non sens (où dessineriez-vous autrement?). Utiliser 2 threads, un pour le dessin et un pour le code d'exécution n'est pas un mauvais ides mais vous devez les relier entre eux (c'est-à-dire pas de calculs en dessin et pas de dessin en calcul ce qui signifie des bénéfices faibles). OP veut une solution simple (ou pas trop compliquée) à son problème et la solution est "Ne pas mettre à jour l'interface graphique à chaque image car cela prend du temps". Que vous l'aimiez ou non :-) – Valmond

Questions connexes