AFFICHER UN TEXTE OU DES RECTANGLES, ELLIPSES, POLYGONES, ETC... INCLINÉS EN VB

Messages postés
162
Date d'inscription
jeudi 22 janvier 2004
Statut
Membre
Dernière intervention
20 juillet 2013
- - Dernière réponse : benji2000
Messages postés
78
Date d'inscription
samedi 26 août 2006
Statut
Membre
Dernière intervention
25 novembre 2016
- 13 nov. 2010 à 15:25
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/51583-afficher-un-texte-ou-des-rectangles-ellipses-polygones-etc-inclines-en-vb-2008-2-methodes-possibles

Afficher la suite 
cs_bigboss9
Messages postés
162
Date d'inscription
jeudi 22 janvier 2004
Statut
Membre
Dernière intervention
20 juillet 2013
-
C'est bien et ca fait plaisir. Par contre :

- N'utilise pas New Pen(Color.Blue, 3) dans une instruction car tu ne peux plus libérer ton objet ensuite. A chaque fois que ta form est redessinée, il en créee un nouveau ! 1ère fuite de mémoire.

- Idem pour New Rectangle(), New Point(), etc...
- Pour des raisons d'optimisation, déclare le plus tes variables en dehors des procédures. Sinon, chaque fois que ta form est redessinée, tu réutilise de la mémoire pour rien.
- Ne fais pas de procédures qui dessinent. Utilise plutot une fonction qui te retourne ton GraphicPath. Cela te permet de séparer les actions, mieux évaluer le code et faciliter sa mise à jour et son élimination des bugs.

Concernant laquelle de ces deux méthodes choisir, on dira que cela dépends de leur rapidité. Il faudrait mesurer. De plus, les calculs ne sont pas le fort du .Net. L'utilisation d'une DLL écrite en C++ serait fort appréciable pour avoir de meilleures performances.

Et dire que je suis tyranique ... %)
cs_bigboss9
Messages postés
162
Date d'inscription
jeudi 22 janvier 2004
Statut
Membre
Dernière intervention
20 juillet 2013
-
Pour info :

A partir du Framework 3.0 je crois, on peut utiliser :

Using TempBrush as New LoineaGradientBrush(Me.ClientRectangle, Color.Red,Color.Blue,Gradient.Vertical)

'instructions
e.graphic.FillRectangle(Me.ClientRectangle, TempBrush

End Using

Au moment du End Using, il libère la ressource automatiquement.
Mais dans tous les cas et pour avoir testé, cela ne vaut pas la déclaration de tes variables en dehors des procédures/fonctions. En effet, le temps de libérer la mémoire, cela ralenti le processus de dessin.

A noter que cette méthode n'est valable que pour les objets disposants de l'interface IDisposable, c'est à dire comprenant la méthode Dispose().
Adn56
Messages postés
1220
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1 -
comme le dit bigboss, y'a du flick ^^
essaye déja (gourmand mais bon) de placer ta form en doublebuffer=true,
cela évitera le clignotement de ta rotation ! dés plus désagréable à voir.
sinon bien vu les fonctions. Sauf pour animation() il doit y avoir mieux qu'un doevent non ?
bon j'suis pas pro, mais au pif...un timer ? un tread ?
@ suivre donc...et merci pour l'exemple.
kbalist
Messages postés
36
Date d'inscription
jeudi 28 janvier 2010
Statut
Membre
Dernière intervention
6 février 2011
-
merci de vos remarques qui me font progresser les gars...

pour BIGBOSS9 :
- j'ai rectifié le source pour tenir compte de ta remarque sur les fuites de mémoire avec des New dans les paramètres des fonctions. ça m'évoque 2 questions :

*comment vérifier qu'il n'y a pas de fuite de mémoire ? (le gestionnaire de programmes montre une mémoire très variable avec ou sans programme qui tourne)

*y a-t-il d'autres erreurs du même genre à ne pas faire ?

- j'ai plus de mal avec ta remarque :
"Pour des raisons d'optimisation, déclare le plus tes variables en dehors des procédures. Sinon, chaque fois que ta form est redessinée, tu réutilise de la mémoire pour rien."
faut-il comprendre que si j'utilise dans la routine DrawRotatedString un centre de rotation, il vaut mieux le déclarer et le définir dans la routine qui appelle DrawRotatedString (Form1_Paint dans mon exemple) et le passer en paramètre à DrawRotatedString , plutôt que de le définir dans DrawRotatedString elle-même ? ou le déclarer en global si c'est toujours le même ?

- pour résumer si j'ai bien compris : il vaudrait mieux déclarer le point-origine courant comme une variable globale avec

Dim Origine As PointF = New PointF(x1, y1)

et, après calculs, modifier Origine.x et Origine.y à chaque pas dans la routine Animation pour utiliser cette variable globale dans Form1_Paint ?

cela me gênait à priori car on m'a dit qu'il valait mieux utiliser des variables locales que globales.
de plus je voulais faire un exemple facile à réutiliser (copier-coller) par d'autres.

pour ADN56 : bonne remarque pour le double-buffer, j'oublie toujours !
c'est vrai que je ne pensais pas vraiment à l'aspect animation, j'ai fait celle-ci juste pour montrer comment utiliser les routines d'affichage du texte et de l'ellipse.

désolé si je suis trop long et si je pose trop de questions, mais je pense que cela peut permettre à d'autres autodidactes comme moi de faire des progrès sans perdre de temps à "réinventer la roue" ;-)

encore merci pour vos réponses et vos remarques constructives
Adn56
Messages postés
1220
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1 -
Tes questions sont bonnes et tres justifiées !
J'ai essayé sur une source de base d'une horloge le changement conseillé par bigboss (car je pense comme toi au niveau des variables)
le résultat ?
ben mitigé, la source de base bouff 11Mo pour juste afficher une horloge analogique et augmente de 40Ko/sec.
Aprés avoir déclarer toutes mes variables dans le module de la form (comme le conseil bigboss) je ne bouff que 10MO et une augmentation que de 20Ko/sec !
donc à priori cela fontionne bien comme bigboss l'indique.
Seulement aprés 30minutes de marche de mes deux sources lancées simultannément, l'une atteind 15MO et continue d'augmenter et l'autre se stabilise à 13Mo !
Je vous laisse deviner celle qui se stabilise ^^
Celle qui utilise les variables dans les fonctions et qui les disposes à la fin. c'est pas trés clair pour moi.
Je ne suis pas assez 'pro' pour tout piger, mais si besoin je post les deux sources pour que vous puissiez y jeter un coup d'oeil. Je trouve tout de même assez lourd 14Mo de ressource, juste pour afficher une horloge ! non ?
++