Ein Crowdsourced-Projekt auf Canvas durchführen - Seite 19

 

.

Hier ist das Video, das ich zu veröffentlichen versprochen habe. Die Bildqualität ist schlecht, aber das hindert Sie nicht daran, die Reaktionsverzögerungen zu erkennen.

Tatsächlich gibt es im Terminal weniger Verzögerungen. Wenn der Rekorder eingeschaltet ist, ist alles doppelt so langsam. Auch der Prozessor wird viel mehr belastet.

Es ist also nicht möglich, aus diesem Video eine völlig objektive Vorstellung von der Reaktionsgeschwindigkeit zu gewinnen, aber es zeigt deutlich ein Muster zwischen der Aktualisierungsrate des Fensters und der Fenstergröße.

(Deshalb habe ich mehrere Fenster in verschiedenen Größen gemacht.)

Ich glaube, ich habe den genauen Grund für die verlangsamte Bildreaktion gefunden. Es ist der konstante Aufruf der Funktion ColorToARGB(). Bei jedem Ereignis und bei jedem Pixel rufe ich diese Funktion auf. Anstatt die Farben einmal zu berechnen und dann fertig zu verwenden, berechne ich sie immer wieder neu.

Ich glaube, das ist der Punkt.

P.S. Ich habe vergessen hinzuzufügen, dass die Gesamtzahl der Objekte in allen Fenstern 35 beträgt.

 
Реter Konow:

.

Hier ist das Video, das ich zu veröffentlichen versprochen habe. Die Bildqualität ist schlecht, aber das hindert Sie nicht daran, die Reaktionsverzögerungen zu erkennen.

Tatsächlich gibt es im Terminal weniger Verzögerungen. Wenn der Rekorder eingeschaltet ist, ist alles doppelt so langsam. Auch der Prozessor wird viel mehr belastet.

Daher ist es nicht möglich, aus diesem Video eine völlig objektive Vorstellung von der Reaktionsgeschwindigkeit zu gewinnen, aber ich kann eindeutig ein Muster zwischen der Aktualisierungsrate des Fensters und der Fenstergröße erkennen.

(Deshalb habe ich mehrere Fenster in verschiedenen Größen gemacht.)

Ich glaube, ich habe den genauen Grund für die verlangsamte Bildreaktion gefunden. Es ist der konstante Aufruf der Funktion ColorToARGB(). Bei jedem Ereignis und bei jedem Pixel rufe ich diese Funktion auf. Anstatt die Farben einmal zu berechnen und dann fertig zu verwenden, berechne ich sie immer wieder neu.

Ich glaube, das ist der Punkt.

P.S. Ich habe vergessen hinzuzufügen, dass die Gesamtzahl der Objekte in allen Fenstern 35 beträgt.

Ist es möglich, die Quellen einzusehen? Ich für mich selbst, für die Erfahrung.
 
Vladimir Pastushak:
Ist es möglich, einen Blick auf den Quellcode zu werfen? Für mich, für meine Erfahrung.
Ja, auf dieser Seite habe ich einen Funktionsblock gepostet, der all diese Fenster zusammenzeichnet. https://www.mql5.com/ru/forum/92113/page16
Делаем краудсорсовый проект по Canvas
Делаем краудсорсовый проект по Canvas
  • www.mql5.com
Приветстсвую кодеров. Есть интересная задача сделать действительно что-то полезное, и думаю что краудсорс будет хорошим вариантом...
 
Das Problem der verzögerten Reaktionen ist gelöst. Die Lösung sah wie folgt aus:

Ein Bild wird einmal erstellt. Dies ist das erste Mal, dass es am längsten dauert, es zu zeichnen, weil das Bild aus vielen Teilen besteht und das Zeichnen jedes Teils ein Aufruf der Zeichenfunktionen ist, von denen jede die Teile durchläuft und die Werte im Array initialisiert.

Ich werde erklären, was das Problem war:

Vorher habe ich beim Zeichnen der Details eines Bildes eine Schleife über den gesamten Bildbereich gemacht, und das hat die Verzögerung verursacht. Bei einem Fenster mit einer Größe von 500×500 Pixeln musste ich bei jedem Neuanstrich etwa 300 Teile neu zeichnen, was zu (500×500×300×Anzahl der Zeichenfunktionen) Interaktionen in Zyklen bei jedem Neuanstrich führte. Das ist selbst für einen Computer sehr zeitaufwendig.
Die Lösung war folgende: Anstatt das Bild bei jedem Ereignis neu zu zeichnen, bei dem ein bestimmtes Detail innerhalb des Bildes neu gezeichnet werden muss, zeichne ich das Bild einmal, und bei den nächsten Wiederholungen gebe ich es mit ResourceReadImage() in ein Array zurück.

Dann zeichne ich den Teil neu, ohne eine Schleife über das ganze Bild zu machen, sondern ich berechne die Pixelposition des Bildteils im Bildfeld durch eine spezielle Formel und zeichne nur diesen Teil neu. Auf diese Weise wird keine unnötige Integration vorgenommen. Außerdem habe ich die Zeichenfunktionen zu einer einzigen zusammengefasst, was den Mechanismus ebenfalls effizienter macht.





 
Ist es realistisch, das Rendering in Canvas mit OpenCL zu beschleunigen?
 
Timur Gatin:
Ist es realistisch, das Rendering in Canvas mit OpenCL zu beschleunigen?


Ja. OCL bietet die Möglichkeit, die Verarbeitung zu parallelisieren und mit Vektoren zu arbeiten - dies beschleunigt den Rendering-/Overlay-Prozess.

Lesen Sie mehr über die Verwendung von Vektoren in Mathemat's Artikel https://www.mql5.com/ru/articles/407

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


Ja. OCL bietet die Möglichkeit, die Verarbeitung zu parallelisieren und mit Vektoren zu arbeiten - dies beschleunigt den Zeichen-/Layering-Prozess.

Lesen Sie mehr über die Verwendung von Vektoren in Mathemat's Artikel https://www.mql5.com/ru/articles/407

Haben Sie die Geschwindigkeit von Erase() aus CCanvas und der PixelSet()-Schleife aus OpenCl verglichen? Theoretisch kann man mit einer guten Beschleunigung dummen Zeichencode ohne Zwischenspeicherung von Zwischenergebnissen und andere Komplexitäten erstellen.

Übrigens, mischen Sie die Schichten nach dieser Formel?


 

Ja, die Formel stammt von wikipedia, für jede Farbkomponente: Ergebnis = Hintergrund + (Vordergrund - Hintergrund) * Alpha;

Übrigens, es gibt ein Problem mit Erase in OCL. Es gibt kein Analogon von memset (im Gegensatz zu CUDA). Deshalb muss ich jetzt im Host ein Erase durchführen und das bereinigte Array über CLBufferWrite kopieren, was sicherlich nicht schneller ist als ein einfaches Erase.
Andererseits habe ich versucht, ein Aufgabenfeld für Arbeitseinheiten zu erstellen, indem ich 1 Punkt in das Feld geschrieben habe, aber ich kann mich nicht mehr an die Geschwindigkeit erinnern - es schien langsamer zu sein als die vorherige Methode.

Und in OCL 1.2 gibt esclEnqueueFillBuffer(), die das tut => nach MQL-Syntax sollte es CLBufferFill()sein

Dieser Wrapper ist jedoch nicht implementiert (da Version 1.1 portiert wird).

 
Igor Volodin:

Ja, die Formel stammt von wikipedia, für jede Farbkomponente: Ergebnis = Hintergrund + (Vordergrund - Hintergrund) * Alpha;

Übrigens, es gibt ein Problem mit Erase in OCL. Es gibt kein Analogon von memset (im Gegensatz zu CUDA). Deshalb muss ich jetzt im Host ein Erase durchführen und das bereinigte Array über CLBufferWrite kopieren, was sicherlich nicht schneller ist als ein einfaches Erase.
Andererseits habe ich versucht, ein Aufgabenfeld für Arbeitseinheiten zu erstellen, indem ich 1 Punkt in das Feld geschrieben habe, aber ich kann mich nicht mehr an die Geschwindigkeit erinnern - es schien langsamer zu sein als die vorherige Methode.

Und in OCL 1.2 gibt esclEnqueueFillBuffer(), die das tut => nach MQL-Syntax sollte es CLBufferFill()sein

Dieser Wrapper ist jedoch nicht implementiert (da Version 1.1 portiert wird).

Im englischen Wiki ist die Formel interessanter, man kann zwei halbtransparente Schichten mischen. Dies kann eine halbtransparente Schnittstelle und andere Annehmlichkeiten schaffen.
 
Timur Gatin:
Im englischen Vic ist die Formel interessanter, man kann zwei durchscheinende Schichten mischen. Es ist möglich, eine durchsichtige Oberfläche und andere hübsche Dinge zu erstellen.

In meinem Fall brauchte ich das nicht, da sich alles richtig mischt. Alles, was sich unter der Schicht A befindet, kann als Substrat betrachtet werden, auch wenn sich darüber die Schicht B befindet, durch die das Substrat selbst durchscheint.
Grund der Beschwerde: