Leinwand ist cool! - Seite 64

 
Vladimir Pastushak:

Hallo zusammen, ich würde gerne meine Kenntnisse über Canvas vertiefen.

Ich weiß gar nicht, wo ich anfangen soll. Im Moment stelle ich mir vor, dass Canvas aus komplizierten logarithmischen Formeln und ähnlichem besteht.

Können Sie mir ein Beispiel dafür geben, wie man eine Schaltfläche wie unten auf der Leinwand zu machen. Ich brauche etwas Code, um es zu verstehen.


Forum für Handel, automatisierte Handelssysteme und Strategietests

Ein Crowdsourced-Projekt auf Canvas erstellen

Nikolai Semko, 2017.05.24 02:20


Hier ist das Ergebnis.


Die Schaltfläche kann hinter dem Hintergrund und im Vordergrund angezeigt werden, mit oder ohne Klicksperre.

In der Beispieldatei CanvasButton.mq5 ist es möglich, die Schaltfläche mit der Maus zu ziehen. Halten Sie dazu einfach die Strg-Taste gedrückt, um die blaue Taste zu bewegen, und die Umschalttaste, um die rote Taste zu bewegen.

Da die GButton-Klasse ein Nachkomme der CCanvas-Klasse ist, demonstriert das Beispiel die Möglichkeit, Funktionen der CCanvas-Klasse im CircleWu-Beispiel zu verwenden (dies wird in OnInit implementiert). So ist es möglich, mit Funktionen der CCanvas-Klasse Text auf die Schaltfläche zu schreiben.

Diese Klasse gibt natürlich nicht vor, sauber zu sein. Die Grafik glänzt nicht mit Perfektion und 3D ist sehr konventionell; die Schatten sind nicht implementiert, die Ausführungsgeschwindigkeit ist nicht optimiert. Und höchstwahrscheinlich gibt es viele Ecken und Kanten und verschiedene Kontrollen fehlen. Urteilen Sie also nicht streng.

Wenn Sie etwas mehr Zeit investieren, ist das natürlich möglich:


Ich habe nur versucht... man könnte sagen - die Richtung vorgeben.


Die Datei Canvas.mqh unterscheidet sich vom Original nur dadurch, dass das Array m_pixels als öffentlich definiert ist.


 

Nikolay ist natürlich eine Respektsperson für seine Experimentierfreudigkeit mit Canvas. Und ich habe die Codebeispiele mit nicht weniger Vergnügen studiert.

Leider ist Canvas in seiner aktuellen Implementierung ein rein CPU-gebundener Algorithmus zum Füllen des Bitmap-Arrays mit grafischen Primitiven. D.h. über Schleifen mit Array-Element-Aufzählung und das war's dann auch schon... Inzwischen ist es 21 Jahre her...

Die Experimente sind sicherlich gut, aber die Umsetzung in der Praxis sollte nicht nur schön, sondern auch effektiv sein. Denn ich kann es sicherlich ignorieren, wenn ich an einem 8-Kern-PC der Spitzenklasse sitze, aber in der Regel hat die Masse der Nutzer eher Mittelklasse-PCs. Und jede Vollbild-GUI mit Visualisierung von Marktdaten, auch wenn sie noch so bequem und schön ist, wird nicht beliebt sein, wenn sie die CPU bis zu 75% belastet. Das ist eine Tatsache. Aus diesem Grund - und nicht, weil sie einfach nichts anderes zu tun hatten - wurde die Hardware-Beschleunigung in die Canvas-Implementierungen aller wichtigen Browser aufgenommen.

Um zum Kern zu kommen - in MQL5 sollte es einen Wrapper für Direct2D (und DirectWrite) geben - das wäre eine echte Bombe und würde den Weg zur effizienten hardwarebeschleunigten Implementierung vieler praktischer Aufgaben im Bereich der GUI und Datenvisualisierung öffnen. Natürlich kann man sagen, dass es bereits DirectX gibt. Aber nur der Direct3D-Teil ist vertreten, und das sind 3D-Projektionen, Shader und andere 3D-Attribute, und das ist immer noch eine ziemlich enge Nische für den praktischen Einsatz. Ja, natürlich kann man durch einige angepasste Projektionen und andere Manipulationen und Tesselierungen das Rendern von 2D-Grafiken und durch Direct3D erreichen - aber es bedeutet nicht mehr und nicht weniger, wenn man seine eigene Implementierung von Direct2D über Direct3D erstellt. Das würde keinen Sinn machen, da Direct2D schon vor langer Zeit eingeführt wurde.

Also, hier ist ein Gedanke...
 
Aber auch auf der CPU kann alles schnell gezeichnet werden.

Die obigen Beispiele beweisen dies. Außerdem handelt es sich um einen Anwendungsbereich, in dem es keine strengen Anforderungen an die endgültige Schönheit und Raffinesse der Bilder gibt.
 
Codexample:

Nikolay ist natürlich eine Respektsperson für seine Experimentierfreudigkeit mit Canvas. Und ich habe die Codebeispiele mit nicht weniger Vergnügen studiert.

Leider ist Canvas in seiner aktuellen Implementierung nichts anderes als ein CPU-gebundener Algorithmus zum Füllen von Bitmap-Arrays mit grafischen Primitiven. D.h. über Schleifen mit Array-Elementen suchen und das war's dann auch schon... Inzwischen ist es 21 Jahre her...

Die Experimente sind sicherlich gut, aber die Umsetzung in der Praxis sollte nicht nur schön, sondern auch effektiv sein. Denn ich kann es sicherlich ignorieren, wenn ich an einem 8-Kern-PC der Spitzenklasse sitze, aber in der Regel hat die Masse der Nutzer eher Mittelklasse-PCs. Und jede Vollbild-GUI mit Marktdatenvisualisierung, auch wenn sie noch so bequem und schön ist, wird nicht beliebt sein, wenn sie die CPU bis zu 75% belastet. Das ist eine Tatsache. Aus diesem Grund - und nicht, weil sie einfach nichts anderes zu tun hatten - wurde die Hardwarebeschleunigung in die Canvas-Implementierungen aller wichtigen Browser aufgenommen.

Um auf den Punkt zu kommen - in MQL5 wäre ein Wrapper für Direct2D (und DirectWrite) eine echte Bombe, die den Weg zur effizienten hardwarebeschleunigten Umsetzung vieler praktischer Aufgaben im Bereich der GUI und Datenvisualisierung ebnen würde. Man kann natürlich sagen, dass es bereits DirectX gibt. Aber nur der Direct3D-Teil ist vertreten, und das sind 3D-Projektionen, Shader und andere 3D-Attribute, und das ist immer noch eine ziemlich enge Nische für den praktischen Einsatz. Ja, natürlich kann man durch einige anpassende Projektionen und andere Manipulationen und Tesselierungen das Rendern von 2D-Grafiken und durch Direct3D erreichen - aber es bedeutet nicht mehr und nicht weniger, wenn man seine eigene Implementierung von Direct2D über Direct3D erstellt. Das würde keinen Sinn machen, da Direct2D schon vor langer Zeit eingeführt wurde.

Ich habe eine Idee...

Vielen Dank für die freundlichen Worte.
Eigentlich sind MQ in dieser Hinsicht gut und haben sich um die Grafik- und Rechentools gekümmert, die GPUs und nicht nur CPUs verwenden.
Ich meine OpenCL und DirectX.
In den folgenden Beispielen wird die Implementierung derselben grafischen Aufgabe (8 Gravitationszentren) in drei Varianten - CPU, OpenCL(GPU) und DirectX(GPU) - verglichen:

1.CPU -14 fps. (Skript Swirl2.mq5)

2) OpenCL - 162 Bilder pro Sekunde (OpenCL-Treiber müssen auf Ihrem Computer installiert sein) (Skript Swirl2_OCL.mq5)

3 DirectX - 37 Bilder pro Sekunde (Skript Swirl2_GPU.mq5)


damit es nicht so melancholisch ist.
Wenn Sie maximale Leistung benötigen, können Sie auch eine Grafikkarte verwenden.
Ich sollte anmerken, dass diese Tests auf einem eher schwachen Laptop mit einer schwachenIntel® HD Graphics 620-Grafikkarte durchgeführt wurden.
Während die Verwendung einer Grafikkarte einen sehr anständigen Leistungsschub bringt, stimme ich mit Renat überein, dass sogar die Verwendung einer CPU für die Grafikausgabe über 99 % aller Grafikaufgaben im MQL5-Aufgabenbereich abdeckt
.
Solange mein Frame in weniger als 10 Millisekunden generiert wird, bin ich nicht sonderlich nervös wegen der GPU (obwohl die Versuchung manchmal groß ist, gut, dass es Spielraum gibt).
Und in 10 Millisekunden könnte ich zum Beispiel so ein Ding mit Schatten, Antialiasing und Transparenz ausgeben:


SZY-Codes für die GPU wurden ausdiesem Thread heruntergeladen, vielen Dank an@Rorschach und@Serhii Shevchuk dafür.

Dateien:
Swirl2.mq5  5 kb
Swirl2_OCL.mq5  14 kb
 
Leute, hat jemand die Größe von Grafikressourcen mit Canvas-Interpolation verändert?
 
Nikolay Kositsin:
Leute, hat jemand die Größe von grafischen Ressourcen mit Interpolation auf Canvas verändert?

Ich habehier ein Beispiel für den Code gegeben. Aber der Code ist bei weitem nicht perfekt. Jetzt wäre es ganz anders.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Leinwand ist cool!

Nikolai Semko, 2018.03.24 04:13

Skript-Demo zur Rasterskalierung

In der Ex5-Datei befindet sich eine recht große BMP-Datei als Ressource.



 
Nikolai Semko:

Ich habehier ein Beispiel für den Code gegeben. Aber der Code ist bei weitem nicht perfekt. Ich hätte es jetzt ganz anders gemacht.


Ich bin neugierig, wie Sie es jetzt machen würden. Es ist in meinem besten Interesse :)

 
Nikolai Semko:

Ich habehier ein Beispiel für den Code gegeben. Aber der Code ist bei weitem nicht perfekt. Ich würde jetzt alles anders machen.


Es ist unbeschreiblich schön :)

 

OpenCL:https://www.mql5.com/ru/forum/162864

DirectX:Remnant 3D als Standard

Вот что можно сделать с OpenCL прямо в терминале MetaTrader 5 без всяких DLL
Вот что можно сделать с OpenCL прямо в терминале MetaTrader 5 без всяких DLL
  • 2016.12.10
  • www.mql5.com
Это демонстрация не только расчетов на GPU в MQL5 коде, но и графических возможностей терминала: Полный исходный код в виде скрипта приложен...
 
Artyom Trishkin:

Ich frage mich nur, wie Sie es jetzt machen würden. Ganz in meinem Interesse :)

Ganz kurz, Artem, früher habe ich ein Pixel als ein Quadrat wahrgenommen, dessen gewichtete Beteiligung an einem Pixel neuen Maßstabs durch die Fläche berechnet wurde, aber jetzt würde ich es als einen Kreis wahrnehmen, dessen gewichtete Beteiligung durch den Abstand zum Zentrum des Pixels neuen Maßstabs berechnet wird.
Grund der Beschwerde: