Récemment, j'ai apporté quelques optimisations au code. Après le test, l'effet est correct, mais j'ai constaté que l'interface scintillait, en particulier le contrôle TreeView, le langage était C# et l'IDE était VS2005. Après avoir consulté quelques informations et utilisé quelques techniques de base (comme l'activation du double buffering), j'ai constaté que cela n'avait aucun effet.
J'ai donc utilisé l'outil PRfiler pour découvrir que le goulot d'étranglement réside dans l'opération EndUpdate après chaque mise à jour de l'interface (cela sert à réduire le nombre de mises à jour de l'interface, mais ce n'est pas idéal ici car il y a beaucoup d'éléments dans le contrôle) .Je suppose qu'à chaque fois qu'elle est mise à jour, la couche inférieure de .Net Chaque primitive sera mise à jour et redessinée, donc la vitesse sera lente et provoquera un scintillement. Mais si tel est le cas, l’utilisation du double tampon devrait donner de meilleurs résultats. En regardant à nouveau le code, j'ai trouvé que l'action de mise à jour était peut-être trop fréquente, j'ai donc réduit la vitesse et je me suis amélioré, mais cela n'a toujours pas fonctionné.
Continuez à chercher en ligne et trouvez enfin une solution plus adaptée. Il s'avère que le redessin sous-jacent effacera le canevas à chaque fois, puis tout redessinera. C'est la principale cause du scintillement. Le fonctionnement de la fonction d'envoi de message est donc surchargé et ce message est désactivé. Le code est le suivant :
remplacement protégé void WndProc (réf Message m)
{
if (m.Msg == 0x0014) // Désactive la suppression des messages en arrière-plan
retour;
base.WndProc(réf m);
}
succès!
Remarque : Le double buffering est toujours utile lorsque les mises à jour ne sont pas très fréquentes et que le contrôle ne contient pas trop d'éléments. Une fois qu'il y a trop d'éléments, chaque mise à jour prendra beaucoup de temps. Même si une double mise en mémoire tampon est utilisée, le problème de scintillement ne peut pas être résolu. Personnellement, je pense que la méthode idéale consiste finalement à désactiver et à effacer les messages d’arrière-plan.
Pièce jointe : Quelques enregistrements de tentatives et d'échecs
1) Utilisez setStyle
Il est dit sur Internet que la fonction setStyle permet de définir les paramètres du contrôle, notamment :
SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
Le dernier de ces trois paramètres d'option dépend du premier et doit coexister, sinon il sera invalide. Et cette fonction elle-même est protégée, vous devez donc d'abord hériter d'un certain contrôle avant de l'utiliser.
Cet objectif est cohérent avec la solution correcte précédente, qui désactive également la suppression de l'arrière-plan et active la double mise en mémoire tampon, mais nécessite l'option de dessin de l'utilisateur, et tous les dessins sont effectués par l'utilisateur. Cela nécessite que vous implémentiez vous-même tous les dessins des commandes, ce qui est assez gênant. Cette méthode n’est donc pas totalement irréalisable, mais elle nécessite un travail supplémentaire et n’est pas recommandée. Je ne l'ai pas utilisé non plus.
2) Utilisez BeginUpdate et EndUpdate
Cette paire d'opérations a un meilleur effet dans les scénarios où des opérations par lots sont nécessaires pour mettre à jour les contrôles, comme l'ajout d'un grand nombre de nœuds par lots lors de l'initialisation. L’inconvénient est qu’il ne peut pas être mis à jour immédiatement. Par conséquent, il ne convient pas aux situations dans lesquelles les nœuds sont fréquemment mis à jour et souhaitent être immédiatement reflétés dans l’interface. Si vous l'utilisez et ne désactivez pas le message clair de l'interface, le contrôle apparaîtra scintillant, il aura principalement un fond blanc et le contenu sera presque invisible (en fonction de la complexité de la vidéo). Étant donné que les mises à jour de l'interface sont terminées à EndUpdate, trop d'opérations entraînent le blocage d'EndUpdate pendant une longue période, et l'interface est d'abord effacée et mise à jour plus tard, ce qui fait que l'interface apparaît vide pendant une longue période.
3) Utilisez l'option ControlStyles.EnableNotifyMessage
L’effet de cette option est également cohérent avec la bonne solution. L'utilisation est :
SetStyle(ControlStyles.EnableNotifyMessage, true);
remplacement protégé void onNotifyMessage (Message m)
{
//Écrivez ici le code du message du filtre
}
Cependant, l’expérience elle-même n’a montré aucun effet, je ne sais pas pourquoi, et je n’ai pas étudié la question en détail.
-