Réaliser un projet de crowdsourcing sur Canvas - page 19

 

.

Voici la vidéo que j'ai promis de publier. La qualité de l'image est médiocre, mais cela n'empêche pas de voir les délais de réponse.

En fait, il y a moins de retard dans le terminal. Quand l'enregistreur est en marche, tout est deux fois plus lent. Le processeur charge aussi beaucoup plus.

Il n'est donc pas possible de se faire une idée totalement objective de la vitesse de réaction à partir de cette vidéo, mais elle montre clairement un schéma entre le taux de rafraîchissement des fenêtres et leur taille.

(C'est pourquoi j'ai fait plusieurs fenêtres de différentes tailles).

Je pense que j'ai trouvé la raison exacte du ralentissement de la réponse de l'image. C'est l'appel constant de la fonction ColorToARGB(). A chaque événement et à chaque pixel, j'appelle cette fonction. Au lieu de calculer les couleurs une fois et de les utiliser toutes prêtes, je les recalcule tout le temps.

Je pense que c'est le but.

P.S. J'ai oublié d'ajouter que le nombre total d'objets de toutes les fenêtres est de 35.

 
Реter Konow:

.

Voici la vidéo que j'ai promis de publier. La qualité de l'image est médiocre, mais cela n'empêche pas de voir les délais de réponse.

En fait, il y a moins de retard dans le terminal. Quand l'enregistreur est en marche, tout est deux fois plus lent. Le processeur charge aussi beaucoup plus.

Par conséquent, il n'est pas possible de se faire une idée totalement objective de la vitesse de réaction à partir de cette vidéo, mais je peux clairement voir un schéma entre le taux de rafraîchissement de la fenêtre et la taille de la fenêtre.

(C'est pourquoi j'ai fait plusieurs fenêtres de différentes tailles).

Je pense que j'ai trouvé la raison exacte du ralentissement de la réponse de l'image. C'est l'appel constant de la fonction ColorToARGB(). A chaque événement et à chaque pixel, j'appelle cette fonction. Au lieu de calculer les couleurs une fois et de les utiliser toutes prêtes, je les recalcule tout le temps.

Je pense que c'est le but.

P.S. J'ai oublié d'ajouter que le nombre total d'objets de toutes les fenêtres est de 35.

Est-il possible de regarder les sources ? Moi pour moi, pour l'expérience .
 
Vladimir Pastushak:
Est-il possible de consulter le code source ? Pour moi, pour mon expérience.
Oui, sur cette page j'ai posté un bloc de fonctions qui dessine toutes ces fenêtres ensemble. https://www.mql5.com/ru/forum/92113/page16
Делаем краудсорсовый проект по Canvas
Делаем краудсорсовый проект по Canvas
  • www.mql5.com
Приветстсвую кодеров. Есть интересная задача сделать действительно что-то полезное, и думаю что краудсорс будет хорошим вариантом...
 
Le problème des réactions retardées a été résolu. La solution était la suivante :

Une image est créée une fois. C'est la première fois qu'il faut le plus de temps pour la dessiner, car l'image est constituée de nombreuses parties, et dessiner chaque partie est un appel aux fonctions de dessin, chacune d'entre elles parcourant les parties et initialisant les valeurs dans le tableau.

Je vais vous expliquer quel était le problème :

Avant, lorsque je dessinais les détails d'une image, je faisais une boucle sur toute la zone de l'image et c'est ce qui créait le retard. Pour une fenêtre de 500×500 pixels, je devais redessiner environ 300 parties à chaque repeinte, ce qui entraînait (500×500×300×nombre de fonctions de dessin) des interactions en cycles à chaque repeinte. Il s'avère que cela prend du temps, même pour un ordinateur.
La solution était la suivante : au lieu de redessiner l'image à chaque événement qui nécessite de repeindre un détail particulier de l'image, je dessine l'image une fois, et aux prochains repeints, je la renvoie dans un tableau en utilisant ResourceReadImage().

Ensuite, je redessine la partie sans passer par toute l'image, mais je calcule l'emplacement du pixel de la partie de l'image dans le tableau de l'image par une formule spéciale et je la redessine uniquement. De cette façon, aucune intégration inutile n'est effectuée. J'ai également fusionné les fonctions de dessin en une seule, ce qui a également rendu le mécanisme plus efficace.





 
Est-il réaliste d'accélérer le rendu dans Canvas en utilisant OpenCL ?
 
Timur Gatin:
Est-il réaliste d'accélérer le rendu dans Canvas avec OpenCL ?


Oui. OCL a la capacité de paralléliser le traitement + la capacité d'opérer sur des vecteurs - ce qui accélère le processus de rendu/de superposition.

Pour en savoir plus sur l'utilisation des vecteurs, consultez l'article de Mathemat https://www.mql5.com/ru/articles/407.

OpenCL: от наивного кодирования - к более осмысленному
OpenCL: от наивного кодирования - к более осмысленному
  • 2012.06.05
  • Sceptic Philozoff
  • www.mql5.com
В данной статье продемонстрированы некоторые возможности оптимизации, открывающиеся при хотя бы поверхностном учете особенностей "железа", на котором исполняется кернел. Полученные цифры весьма далеки от предельных, но даже они показывают, что при том наборе возможностей, который имеется здесь и сейчас (OpenCL API в реализации разработчиков терминала не позволяет контролировать некоторые важные для оптимизации параметры - - в частности, размер локальной группы), выигрыш в производительности в сравнении с исполнением хостовой программы очень существенен.
 
Igor Volodin:


Oui. OCL offre la possibilité de paralléliser le traitement + la possibilité de travailler avec des vecteurs - ce qui accélère le processus de dessin/couche.

Pour en savoir plus sur l'utilisation des vecteurs, consultez l'article de Mathemat https://www.mql5.com/ru/articles/407.

Avez-vous comparé la vitesse de Erase() de CCanvas et de la boucle PixelSet() réalisée dans OpenCl ? En théorie, avec une bonne accélération, vous pouvez faire du code de dessin idiot sans mettre en cache les résultats intermédiaires et autres complexités.

Au fait, est-ce que vous mélangez les couches en utilisant cette formule ?


 

Oui, la formule est tirée de wikipedia, pour chaque composante de couleur : Résultat = Arrière-plan + (Avant-plan - Arrière-plan) * Alpha ;

A propos, il y a un problème avec l'effacement dans l'OCL. Il n'y a pas d'analogue de memset (contrairement à CUDA). C'est pourquoi je dois maintenant faire un effacement dans l'hôte et copier le tableau nettoyé via CLBufferWrite, ce qui n'est certainement pas plus rapide qu'un simple effacement.
D'autre part, j'ai essayé de créer un tableau de tâches pour les unités de travail en écrivant 1 point dans le tableau mais je ne me souviens pas de la vitesse - cela semblait plus lent que la méthode précédente.

Et dans OCL 1.2 il y aclEnqueueFillBuffer() qui fait cela => selon la syntaxe MQL il devrait y avoir CLBufferFill()

Mais ce wrapper n'est pas implémenté (car la version 1.1 est portée).

 
Igor Volodin:

Oui, la formule est tirée de wikipedia, pour chaque composante de couleur : Résultat = Arrière-plan + (Avant-plan - Arrière-plan) * Alpha ;

A propos, il y a un problème avec l'effacement dans l'OCL. Il n'y a pas d'analogue de memset (contrairement à CUDA). C'est pourquoi je dois maintenant faire un effacement dans l'hôte et copier le tableau nettoyé via CLBufferWrite, ce qui n'est certainement pas plus rapide qu'un simple effacement.
D'autre part, j'ai essayé de créer un tableau de tâches pour les unités de travail en écrivant 1 point dans le tableau mais je ne me souviens pas de la vitesse - cela semblait plus lent que la méthode précédente.

Et dans OCL 1.2 il y aclEnqueueFillBuffer() qui fait cela => selon la syntaxe MQL il devrait y avoir CLBufferFill()

Mais ce wrapper n'est pas implémenté (car la version 1.1 est portée).

Dans le wiki anglais, la formule est plus intéressante, vous pouvez mélanger deux couches semi-transparentes. Cela permet d'obtenir une interface semi-transparente et d'autres subtilités.
 
Timur Gatin:
Chez la victime anglaise, la formule est plus intéressante, vous pouvez mélanger deux couches translucides. Il est possible de réaliser une interface translucide et d'autres jolies choses.

Je n'en ai pas eu besoin dans mon cas, tout se mélange correctement. Tout ce qui se trouve sous la couche A peut être considéré comme le substrat, même s'il est recouvert de la couche B, à travers laquelle transparaît le substrat lui-même.