OVH Cloud OVH Cloud

Invalidate(void) ou Invalidate(Rectangle) ?

3 réponses
Avatar
Boris Sargos
Salut à tous,

dans le cadre d'optimisation du dessin d'un contrôle, je me demande comment
le GDI procède lorsqu'on appelle la fonction :

Colntrol.Invalidate(void)

Redessine-t-il tout le contrôle ? Où sait-il les parties qui ont été
modifiées, qu'il doit redessiner ? Ou bien, le GDI tente-t-il peut-être de
tout redessiner, mais la carte graphique ne redessine peut-être que les
pixels qui ont changé ?

Bref, ma question peut se reformuler ainsi : est-ce vraiment plus performant
d'appeller Control.Invalidate(Rectangle) pour forcer le contrôle à
redessiner ce qui a été modifié, ou Control.Invalidate(void) est-il
suffisant ?

Merci.

3 réponses

Avatar
Ambassadeur Kosh
> dans le cadre d'optimisation du dessin d'un contrôle, je me demande
comment
le GDI procède lorsqu'on appelle la fonction :

Colntrol.Invalidate(void)




Redessine-t-il tout le contrôle ? Où sait-il les parties qui ont été
modifiées, qu'il doit redessiner ?



Invalidate invalide tout. en gros, tu vas te repeindre tout le rectangle

Ou bien, le GDI tente-t-il peut-être de
tout redessiner, mais la carte graphique ne redessine peut-être que les
pixels qui ont changé ?



Bref, ma question peut se reformuler ainsi : est-ce vraiment plus
performant
d'appeller Control.Invalidate(Rectangle)



en fait, c'est plus complexe que ça. quand tu appelle invalidate, tu defini
une zone a repeindre. principe de noel avec les papiers ou les trous sont
des jolis sapins et ou tu viens avec ta bombe de peinture.
(clipping). apres, en general, quand tu appelle un DrawMachin, il verifie si
il est dans le clipping ou pas. et cette verification est rentable.

maintenant, y'a deux astuces avec la bombe de peinture. soit tu peint tout
le patchwork en aveugle, soit tu peint maladroitement la zone la plus proche
du sapin.
autrement dit, soit tu fais un paint qui s'appuie completement sur graphics,
soit tu fais un paint qui tient compte du clipping pour optimiser ces
calculs.

imagine que tu dessines une vue en zoom de la cote d'azur. c'est peut être
pas utile de dessiner vers la poubelle toutes les autres regions de france.
un precalcul (classification, préordre, tout ça) peuvent te permettre de
gagner

pour forcer le contrôle à
redessiner ce qui a été modifié, ou Control.Invalidate(void) est-il
suffisant ?



c'est suffisant. mais des fois, ça vaut le coup de se creuser les neurones.
rapport à ce que fait ton controle. et au but recherché

ps : pas suite au salon place stanislas ?
Avatar
Boris Sargos
Salut le nancéen.

Merci de m'avoir répondu aussi vite. Je n'ai pas compris l'allusion aux
sapins.
Je sais pertinemment que Invalidate(Rectangle myrect) ne redessine que le
contenu de myrect. Le principe est simple :
- il appelle la fonction OnPaint du contrôle et fait tous les calculs
sans rien afficher, mais stocke le dessin sur un écran virtuel
- ensuite, au moment de l'affichage, il calcule l'intersection du
rectangle myrect avec cet écran virtuel et dessine le contenu de cette
intersection.
Donc, en appelant la fonction membre Control.Invalidate(), on ne gagne rien
en temps de calcul.
C'est bien ça ?

principe de noel avec les papiers ou les trous sont
des jolis sapins et ou tu viens avec ta bombe de peinture.
(clipping). apres, en general, quand tu appelle un DrawMachin, il verifie


si
il est dans le clipping ou pas. et cette verification est rentable.



Là, je ne comprends pas : sapins, trous et papiers ???

Pour ce qui est de la place stan, je t'ai répondu, et j'ai même été surpris
de ne pas avoir de réponse. Je t'envoie un petit mot en privé.
Merci et à+
Avatar
Ambassadeur Kosh
> Merci de m'avoir répondu aussi vite. Je n'ai pas compris l'allusion aux
sapins.



ben pourtant, c'est exactement l'idée. le sapin, bonhomme de neige, ou ce
que tu veux, c'est la zone que tu as invalidé (la figure que tu as creusé
aux ciseaux dans ta feuille)
c'est la zone de clipping. et apres, tu poses ton cache sur la zone à
peindre (la fenetre, ou le controle), et tu utilise tes bombes de peinture
(le paint).

en general, on ne s'emmerde pas, le paint dessine sur tout le masque, et il
ne reste sur la feuille en dessous que ce qui passe par le trou (clipping).

l'invalidate avec un rectangle sur ton controle devrait te faire gagner un
petit peu ou beaucoup... selon la taille du rectangle, selon... plein de
choses.

Je sais pertinemment que ...
Donc, en appelant la fonction membre Control.Invalidate(), on ne gagne
rien
en temps de calcul.



j'ai essayé l'approche generale. mais j'ai oublié de te donner des details
evidents : les couts de chaque chose.

ce qui coute du temps, c'est placer des pixels dans une image. donc une zone
reduite va conduire à reduire le temps de peinturlurage.
mais quelque fois, au lieu d'enumerer systematiquement tout ce qu'il y'a a
repeindre, tu peux tirer parti de la conaissance que tu as de
la zone. par exemple, imagine que tu dessines des lignes horizontales. tu en
as des millions à repeindre. elle sont triées par y.
evident, avec une dichotomie, (ridicule en cout), tu trouves la premiere
visible et tu vas jusqu'à la derniere visible. alors qu'appeller
un million de fois le DrawLine et tester un million de fois si la ligne est
clippée ou pas, c'est plus couteux, vois tu ?

et certaines fois, essayer de tirer parti de la forme va te conduire à
quelque chose de trés compliqué, disons complexe, qui en cout,
ne sera pas rentable, puisque temps identique ou presque, et masse de code
pondu.

Là, je ne comprends pas : sapins, trous et papiers ???



relis :o)

et maintenant, le trou que tu fais, dans le pochoir (c'est le nom que je
cherchais), c'est pas forcement un rectangle. en théorie, c'est une region,
donc n'importe quel ensemble de formes geometriques.
ça peut être interessant à savoir ça :o)

ah oui, windows gere tout seul pour toi la hierarchie de controles
imbriqués.
si tu poses 25 boutons sur une feuille, que tu invalidate un rectangle qui
en recouvre 3, seul le Paint de ces 3 boutons sera appellé.

donc, d'une maniere générale, il est presque toujours plus interessant de
designer la zone à invalider la plus precise possible.
(à condition de ne pas en oublier bien evidement)

Pour ce qui est de la place stan, je t'ai répondu, et j'ai même été
surpris
de ne pas avoir de réponse. Je t'envoie un petit mot en privé.



ben, j'ai rien vu moi. encore mon OE qui n'en fait qu'à sa tête.
mon email :