Galerie d'interfaces utilisateur écrites en MQL - page 57

 

@Nikolai Semko

Nikolai, la réponse à la question"pourquoi faut-il tant de temps pour dessiner une toile" est arrivée de manière inattendue.

Les fenêtres sont composées de deux toiles ! Ces toiles sont presque de taille égale. La surface de dessin doit donc être multipliée par deux. Mais ce n'est que le début.

Sur l'espace de la fenêtre se trouvent de grands éléments de défilement (V_BOX), qui sont également dessinés entièrement remplis de la couleur d'origine. En d'autres termes, si V_BOX occupe la majeure partie de la fenêtre, la zone de dessin devrait être multipliée par trois. Mais ! il dispose d'un canevas supplémentaire. L'image défile sur ce canevas. La base de l'élément n'est qu'une barre de défilement. En bref, la zone de dessin devrait être multipliée par quatre (surtout si la barre de défilement est longue). Ce n'est qu'ensuite que les éléments sont dessinés.

Il semblerait que ce soit tout... On peut mettre un point,on multiplie la surface de la fenêtre par trois ou quatre. Mais non !

Leséléments eux-mêmes sont également multicouches. Chacun a une base. La base est toujours dessinée à partir de zéro, remplie de la couleur d'origine. Les cadres sont ensuite dessinés au-dessus de la base. Ensuite, les icônes sont dessinées sur les parties déjà dessinées de l'élément. Enfin, les textes sont dessinés par-dessus tout.

Par conséquent, l'utilisateur ne voit que la couleur finale sur chaque pixel particulier. Mais à l'endroit de ce pixel, les couleurs ont changé plusieurs fois au fur et à mesure que la fenêtre entière était dessinée.


Multipliez maintenant ce chiffre par 15 fenêtres.... Il apparaît clairement qu'il n'y a pas de bogue particulier dans le code - j'ai spécialement mesuré la vitesse d'exécution de certaines parties du bloc de dessin, et les 50 ms pour un plein écran me conviennent également. C'est juste que je me retrouve avec beaucoup plus d'écrans.


J'ai une idée pour modifier le code et accélérer le dessin de 2 ou 3 fois. Mais je le ferai après le travail principal.

Je tiens à vous remercier d'avoir insisté pour vérifier le code. Vous avez raison. C'est dans ce cas que la critique est utile.

Merci également à @AndreyBarinov pour l' astuce concernant le texte. Je pourrai peut-être trouver quelque chose.

Nikolai Semko - BeeXXI Corporation
Nikolai Semko - BeeXXI Corporation
  • 2024.07.15
  • www.mql5.com
Профиль трейдера
 
Реter Konow #:

@Nikolai Semko

...et 50ms en plein écran, ça marche aussi pour moi. ....

Le test est approximatif. J'ai mesuré la vitesse d'ouverture d'une fenêtre contenant trois toiles de taille presque égale (fenêtre d'icônes) et j'ai obtenu ~70 ms. Si l'on additionne la surface de toutes les toiles (sans les éléments), on obtient à peu près la surface de l'écran 17" de l'ordinateur portable. Cela n'inclut pas la surface de la base des éléments et des icônes elles-mêmes, qui ont été dessinées au-dessus de la toile. Donc oui, ~50ms pour remplir de couleurs la surface d'un plein écran théorique. Je ne l'ai pas encore mesuré exactement. Pourquoi, alors que l'"éléphant" se trouve au milieu de la pièce ? :)

 
Je parlais de 50 ms comme d'une interface surchargée et non optimisée. Une vitesse de 3 à 10 ms est normale

Faites un peu de profilage. Vous ferez de nombreuses découvertes dans votre code.
 
Nikolai Semko #:
Je parlais de 50 ms comme d'une interface surchargée et non optimisée. Une vitesse de 3 à 10 ms est normale

Faites un peu de profilage. Vous ferez de nombreuses découvertes dans votre code.
Nikolaï, ce ne sont que des chiffres. Vous avez besoin de détails. La taille de l'écran, au moins. Ensuite, tu pourras faire des calculs précis.
 
Le dessin sur le canevas est une initialisation de tableau. Il est facile de déterminer la vitesse maximale - la fonction avec la boucle de remplissage du tableau la révèlera. La taille du tableau doit correspondre à la somme des pixels de l'écran conditionnel.
 
Vous êtes comme Stirlitz qui ne voulait pas aller au champ de patates.
Faites le profilage...
 
Nikolai Semko #:
Vous êtes comme Stirlitz qui ne voulait pas aller au champ de patates.
Faites le profilage...
Je l'ai fait. Je t'enverrai un gif.
 


Il faut une étude approfondie des cycles à l'intérieur du bloc de dessin. Un profilage superficiel ne donne pas une image complète. Mais la question est déjà claire. J'ai écrit ici

. Je pense que je n'ai pas tort.

(version provisoire du bloc de dessin, que j'utilise pour les tests)
 
Реter Konow #:

...

J'ai une idée pour modifier le code et accélérer le rendu de 2 ou 3 fois. Mais je le ferai après le travail principal. ...

J'ai analysé la complexité de la tâche et la valeur du résultat final.

Conclusion : cela n'a aucun sens.

Accélérer le premier dessin n'a aucun sens : une seconde et demie pour construire 15 fenêtres avec des graphiques complexes et des barres de défilement est un résultat normal. Le premier dessin peut être caché aux yeux de l'utilisateur en l'exécutant avant d'ouvrir les fenêtres. Visuellement, les fenêtres apparaîtront instantanément après une pause d'une demi-troseconde. Si, bien sûr, il souhaite que 15 fenêtres s'ouvrent en même temps, ce qui est peu probable.

Il n'est pas nécessaire de dessiner l'arrière de la fenêtre. Il y aura un gain de ~20ms. Cela ne semble pas impressionnant.

La semaine dernière, l'essentiel a été réalisé : l'utilisation d'images sauvegardées pour tous les événements, à l'exception de la première version. Il s'agit d'un gain énorme en termes de vitesse d'interface.

Le reste des lags est lié au redécoupage des fenêtres lors du changement de focus, ou à des appels inutiles. Ces problèmes sont faciles à résoudre. Je ne veux pas que ce gain majeur soit ignoré à cause du temps de chargement, qui n'est pas si important. Cependant, j'ai changé mon propre centre d'attention. C'est ce que vous devriez faire.

Ici, je clos la question de la vitesse du premier rendu, en raison de son manque de pertinence et d'intérêt pour le développement actuel.

Prochaine mise à jour dimanche. Je déploierai un moteur avec un mécanisme conceptuellement complet d'interaction du logiciel avec le programme de l'utilisateur.
 
Реter Konow #:
J'ai analysé la complexité de la tâche et la valeur du résultat final.

J'en ai conclu que cela n'avait aucun sens.

Créer 15 fenêtres avec des graphiques complexes et des barres de défilement en une seconde et demie est un résultat normal. Il est possible de dessiner le premier graphique avant d'ouvrir la fenêtre de manière à ce que l'utilisateur ne le voie pas. Visuellement, la fenêtre apparaîtra immédiatement après une pause d'une demi-seconde. Bien entendu, si l'utilisateur souhaite ouvrir 15 fenêtres en même temps, cela est peu probable.

Il n'est pas nécessaire de dessiner l'arrière de la fenêtre. Il y aura un gain de ~20 ms. Cela n'a pas l'air extraordinaire.

La semaine dernière, nous avons atteint notre objectif principal : utiliser des images sauvegardées pour tous les événements sauf la première construction. Il s'agit d'une accélération considérable de l'interface.

Le reste des retards était lié au redessin de la fenêtre lors du changement de focus ou à des appels inutiles. Ces problèmes sont faciles à résoudre. Je ne veux pas ignorer cette amélioration majeure à cause des temps de chargement, qui ne sont pas si importants. Cependant, j'ai changé mon fusil d'épaule. Vous devriez avoir

Ici, j'ai mis fin au premier problème de vitesse de rendu parce qu'il n'est pas pertinent ou important pour le développement actuel.

La prochaine mise à jour aura lieu dimanche. Je présenterai un moteur avec un mécanisme conceptuel complet d'interaction entre le logiciel et le programme de l'utilisateur.

Oui, il est très important de sortir d'abord un logiciel entièrement fonctionnel.