cs_jacques13
Messages postés252Date d'inscriptionmardi 3 juin 2003StatutMembreDernière intervention29 juin 2013
-
14 janv. 2007 à 18:36
cs_jacques13
Messages postés252Date d'inscriptionmardi 3 juin 2003StatutMembreDernière intervention29 juin 2013
-
17 janv. 2007 à 19:42
Bonjour,
Je travaille sur une grosse application graphique qui exécute sur un PictureBox d'énormes quantités de tracés (lignes, polygones, polylines, images, textes droits et obliques, aplats de couleurs,...) le tout avec des zooms fréquents.
Au bout d'une certaine période, j'observe une certaine instabilité de l'affichage voire de l'appli elle-même.
Je cherche un moyen efficace pour purger la mémoire principale et la mémoire graphique.
Je ne suis pas sûr que cela soit possible...
Merci pour un coup de main!
Dolphin Boy
Messages postés630Date d'inscriptionvendredi 5 mai 2006StatutMembreDernière intervention17 février 2007 14 janv. 2007 à 19:02
Salut,
Tout dépend comment tu a construit ton appli.
Un exemple, si tu crées des objets dans le genre :
Set MonObjet = New ....
pense toujours à libérer la mémoire quand tu n'as plus besoin de cet objet avec un :
Set MonObjet = Nothing
Pour les pictureboxes, il faut penser aussi à les vider avec un :
MaPicture = LoadPicture()
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 14 janv. 2007 à 19:02
Lol, dit comme cà c'est sûr qu'on va pas pouvoir faire grand chose !
Une bonne conduite à garder : à chaque objet créer, le détruire !
Donc si tu utilise des pinceaux ou des crayons de l'api Windows par exemple, je jamais oublier de faire des DeleteObjects dessus dès que tu n'en as plus besoin, sinon c'est sûr que tu va encombrer très vite la mémoire pour rien !
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 14 janv. 2007 à 19:06
dolphin boy : comme je l'ai déjà dit aujourd'hui sur un autre poste : évitez de faire des loadpicture() pour vider un picturebox !!! Préférez un Set Picture1.Picture = Nothing
Vous n’avez pas trouvé la réponse que vous recherchez ?
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 14 janv. 2007 à 19:25
Qu'il pense également à vider le presse-papier, chaque fois que ce qu'il contient n'est plus nécessaire. Je dis celà car, comme il ne s'agit pas là d'une création d'objet, cet objet-là est souvent oublié dans son coin.
Pour les objets créés : + 1 avec ce qu'a exprimé DarkSidious.
Mais même en faisant tout celà, des lenteurs demeureuront. Elles sont dûes à une gestion imparfaite de la mémoire par Windows.
Il m'est ainsi fréquemment arrivé de constater (en dépit de toutes les précautions citées plus haut) le phénomène suivant :
1) chargement d'une petite image : temps de chargement = durée1
2) vidage de l'image (par = nothing)
3) chargement d'une très grosse image : temps de chargement = durée2
4) vidage de l'image (par = nothing)
5) chargement, à nouveau de la toute 1ère petite image : temps de chargement constaté durée3 > durée1 !
Je n'ai jamais réussi à palier cette difficulté là (et j'ai longuement cherché à le faire, il y a 5 ans).
Il semble pourtant que l'on puisse le faire puisque j'avais à l'époque trouvé un petit outil (dont j'ai oublié le nom) qui permettait d'optimiser, à la demande, la mémoire disponible.
cs_jacques13
Messages postés252Date d'inscriptionmardi 3 juin 2003StatutMembreDernière intervention29 juin 2013 14 janv. 2007 à 19:41
Le plus gros des dessins est réalisé par Polygon() ou Polyline() , fonctions du Gdi et, naturellement, il n'est pas question à l'issue du tracé de faire un LoadPicture() ni un Set Picture = nothing, j'aimerais plutôt faire une espèce de DeleteGraphics() tel que cette fonction existe dans GDI+
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 14 janv. 2007 à 19:49
Les fonctions que tu dénommes ici ne sont pas en elles-mêmes gourmandes en mémoire. Il te faut toutefois penser à zigouiller les éventuels RECT, etc... que tu aurais pu créer... dès le dessin fait (et après chaque dessin).
Si tes tracés sont faits sur une seule picturebox, ce seront les dimensions en pixels de cette picturebox qui détermineront le grignotage de ta mémoire. A multiplier, bien sur, par le nombre de pictureboxes si tu dessines dans des pictureboxes séparées...
Evite surtout de dessiner dans plusieurs pictureboxes si, au bout du compte, tu dois les insérer dans une seule ! Dessine directement là où il faut dans ta picturebox...
Enfin... je ne connais pas ton projet, alors... je ne sais pas...
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 14 janv. 2007 à 19:55
Polygone ou polyline utilise des crayons, donc vérifie bien qu'à chaque createPen tu as un DeleteObject associé !
Idem, n'oublie pas de récupèrer le handle retournée par SelectObject afin de le remettre dans le hDC une fois le crayon utilisé !
cs_jacques13
Messages postés252Date d'inscriptionmardi 3 juin 2003StatutMembreDernière intervention29 juin 2013 14 janv. 2007 à 20:45
Je n'utilise ni pen ni brush mais plutôt les propriétés ForeColor, FillStyle et FillColor; peut-être n'est-ce pas très malin?
Par ailleurs, je fais un grande quantité de dessins hors écran et j'ai remarqué que l'instabilité citée plus haut croissait en fonction du volume de ces tracés.
cs_jacques13
Messages postés252Date d'inscriptionmardi 3 juin 2003StatutMembreDernière intervention29 juin 2013 14 janv. 2007 à 21:46
Je travaille avec une seule PictureBox sur laquelle je dessine un plan. Naturellement, le plan dessiné déborde généralement de la PictureBox bien que j'essaye dans la mesure du possible de limiter les objets tracés.
Suis-je assez précis, Jacques?
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 14 janv. 2007 à 21:58
Oui, c'est maintenant clair.3
Dans de telles conditions, la consommation de mémoire sera essentiellement celle occasionnée par les dimensions (affichées ou non, de ta pictureBox, tout le reste n'étant que quantité négligeable, surtout si tu détruis les objets créés au fur et à mesure.
Cette consommation est normalement totalement indépendante du nombre de tracés sur ta picturebox ! Elle est proportionnelle au nombre de pixels (largeur X hauteur) et ne devrait donc pas varier au fur et à mesure de tes tracés !
Je ne suis plus, là, Jacques... Y aurait-il autre chose que tu n'aurais pas encore dit ?
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 15 janv. 2007 à 08:04
Bonjour,
Aucun autre (que je maitrise, comme je te l'ai dit plus haut) que ceux qui t'ont été signalés...
Or, tu dis les appliquer déjà.
Et tu nous dis par ailleurs n'avoir qu'une picturebox (de très grandes dimensions). Celle-ci mobilise la mémoire de façon proportionnelle au nombre de ses pixels. Quand on change l'image de cette picturebox, y compris si l'on prend la précaution de faire précéder ce changement par un picture1.picture = Nothing, Windows semble avoir des difficultés à libérer totalement sa mémoire de l'image concernée (relire la relation que j'ai faite plus haut de certaines constatations).
Elle est si énorme que celà, ta pictureBox ?
Es-tu certain de ce que, pour de simples tracés, tu ne pourrais pas te contenter de moins gourmand ?
cs_jacques13
Messages postés252Date d'inscriptionmardi 3 juin 2003StatutMembreDernière intervention29 juin 2013 15 janv. 2007 à 18:34
En fait, la PictureBox se dimensionne selon la totalité de l'écran moins 2 petites marges sur les cotés, un bandeau de menu graphique sur le haut et un bandeau d'info sur le bas. Pas question de la réduire car tous l'espace disponible est nécessaire.
L'appli fonctionne parfaitement avec les plans de petite et moyenne dimension; les choses se gâtent avec plans très grands, comme si la mémoire système n'arrivait plus à gérer cette masse d'information.