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

 
Алексей Барбашин:

Genau so habe ich es gebaut. Im Grunde genommen habe ich die Standardbibliothek als Grundlage genommen, weil sie sehr gut ausgearbeitete Momente der Ereignisübertragung und einige andere Dinge hat. Anatoly erstellt Gruppierungen für die verschiedenen Klassen von Elementen, während in der Standardgruppierung alles auf ein Basisobjekt reduziert wird.

...

In seinen Beispielen zeigt Nikolay, dass man sich nicht die Mühe machen muss, alle Daten der lokalen Bereiche zu speichern, weil das Neuzeichnen der gesamten Leinwand so schnell ist, dass man nicht bis ins Detail gehen muss und es reicht, die gesamte Leinwand auf einmal neu zu zeichnen.
So einfach ist das nicht. Stellen Sie sich vor, Sie haben eine große Tabelle (in voller Größe), in der eine der Zellen 20 Mal pro Sekunde ihren Wert ändert. Wenn Sie die gesamte Leinwand neu zeichnen, steigt die Belastung des Prozessors um bis zu 40 % oder mehr. Völlig falsche Art, mit einer Leinwand zu arbeiten. Sie müssen einzelne Elemente neu zeichnen, da sonst Tabellen, Glas und verschiedene lokale Animationen den Prozessor überlasten und die Ausführung anderer Funktionen verlangsamen (wenn sie sich in einem gemeinsamen Thread befinden).
 
Реter Konow:
So einfach ist das nicht. Stellen Sie sich vor, Sie haben eine große Tabelle (ein ganzes Diagramm) gezeichnet, in der eine der Zellen 20 Mal pro Sekunde ihren Wert ändert. Wenn Sie die gesamte Leinwand neu zeichnen, steigt die Belastung des Prozessors um bis zu 40 % oder mehr. Völlig falsche Art, mit der Leinwand zu arbeiten. Sie müssen einzelne Elemente neu zeichnen, da sonst Tabellen, Glas und verschiedene lokale Animationen den Prozessor überlasten und die Ausführung anderer Funktionen verlangsamen (wenn sie sich in einem gemeinsamen Thread befinden).

Die bisherigen Experimente von Nikolay beweisen das Gegenteil. Er zeichnet den gesamten Inhalt der Leinwand in einem Zug neu, was im Code deutlich sichtbar ist.

Aber ich bin immer noch für lokale Änderungen. Aber dieser Ansatz hat seine eigenen Schwierigkeiten, die ich noch nicht gelöst habe.

 
Алексей Барбашин:

Die bisherigen Experimente von Nikolay beweisen das Gegenteil. Er zeichnet den gesamten Inhalt der Leinwand in einem Zug neu, und das ist im Code deutlich sichtbar.

Aber ich bin immer noch für lokale Veränderungen. Aber dieser Ansatz hat seine eigenen Schwierigkeiten, die ich noch nicht gelöst habe.

Ich betrachte Nikolay als meinen Freund, und er hat bei der Arbeit mit der Leinwand einige große Erfolge erzielt, aber er hat noch keine vollwertigen Experimente mit Kontrollen durchgeführt. Besonders bei Tischen und Glas. Jedenfalls ist mir nichts bekannt.

Die Quintessenz ist folgende: Ein Canvas ist ein Array von Daten. Die Daten werden bei Änderungsereignissen geändert und neu gespeichert. Wenn das Array alle Pixel des Diagramms enthält, dann ist seine Größe = Höhe*Breite des Diagramms. Wenn es eine lokale Änderung der Pixelwerte innerhalb des Arrays gibt, ist es nicht notwendig, eine vollständige Schleife über das gesamte Array zu machen und alle Werte zurückzusetzen. Sie müssen eine Schleife über den geänderten Bereich ausführen, die Werte einstellen und die Schleife verlassen. Andernfalls ist es eine Verschwendung von Ressourcen und Zeit, egal wie man es dreht und wendet.

Und dieser Ansatz birgt eine Reihe von Schwierigkeiten. Die Hauptaufgabe besteht darin, eigene voll funktionsfähige Objekte zu erstellen, sie auf der eigenen Leinwand zu finden und zu bearbeiten. Das hauseigene CCanvas ist dafür nicht geeignet. Es würde Ihre Elemente nicht "sehen", und Sie können nicht über sie darauf zugreifen. Sie hat keine solche Funktion.

 
Реter Konow:

Ich betrachte Nikolai als einen Freund von mir, und er hat mit den Kanvas große Erfolge erzielt, aber er hat noch keine vollwertigen Experimente mit den Kontrollen durchgeführt. Vor allem mit Tischen und einem Becher. Jedenfalls ist mir nichts bekannt.

Die Quintessenz ist folgende: Ein Canvas ist ein Array von Daten. Die Daten werden bei Änderungsereignissen geändert und neu gespeichert. Wenn das Array alle Pixel des Diagramms enthält, dann ist seine Größe = Höhe*Breite des Diagramms. Wenn es eine lokale Änderung der Pixelwerte innerhalb des Arrays gibt, ist es nicht notwendig, eine vollständige Schleife über das gesamte Array zu machen und alle Werte zurückzusetzen. Sie müssen eine Schleife über den geänderten Bereich ausführen, die Werte einstellen und die Schleife verlassen. Andernfalls ist es eine Verschwendung von Ressourcen und Zeit, egal wie man es dreht und wendet.

Und dieser Ansatz birgt eine Reihe von Schwierigkeiten. Die Hauptaufgabe besteht darin, eigene voll funktionsfähige Objekte zu erstellen, sie auf der eigenen Leinwand zu finden und zu bearbeiten. Das hauseigene CCanvas ist dafür nicht geeignet. Es würde Ihre Elemente nicht "sehen", und Sie können nicht über sie darauf zugreifen. Eine solche Funktionalität gibt es dort nicht.

Ich verstehe dies alles sehr gut und bin mir dessen bewusst. Ich habe meine eigenen Objektklassen erstellt, und es funktioniert alles einwandfrei.

 
Алексей Барбашин:

Ich verstehe das alles sehr gut und bin mir dessen sehr bewusst. Ich habe meine Objektklassen erstellt, und es funktioniert alles einwandfrei.

In diesem Fall können Sie dies überprüfen , indem Sie eine Tabelle erstellen und sie auf zwei Arten aktualisieren - lokal (jede Zelle einzeln) und auf einmal die gesamte Tabelle.

 

Nikolais Animationen haben meist eine niedrige Bildwiederholrate, so dass das gleichzeitige Neuzeichnen der gesamten Leinwand nicht zu einer Überlappung führt. Wenn Sie jedoch die Aktualisierungsrate auf bis zu 5 Mal pro Sekunde erhöhen, können Sie einen Anstieg des CPU-Ressourcenverbrauchs feststellen. Wenn Sie die gesamte Animation neu zeichnen müssen, gibt es keinen Ausweg, aber wenn es sich um einen einzelnen, kleinen Bereich handelt, ist es besser, nur diesen zu zeichnen.

Die Häufigkeit selbst - 5 Mal pro Sekunde - kann in einer Tabelle auftreten, in der sich die Werte asynchron ändern. Diese Situation trat bei mir auf MT4 auf, als ich den Tisch über Ressourcen mit dem Tester verbunden habe. Dort ändern sich bei Geschwindigkeit 31 alle Parameter so schnell, dass ein fehlerhaftes Neuzeichnen der Tabelle eine CPU-Last von 50 % oder mehr verursacht. Selbst das lokale Neuzeichnen von Elementen konnte das Problem nicht vollständig lösen. Ich hatte die Idee, die Geschwindigkeit der Anzeige der Werte zu verlangsamen. Die Werte selbst änderten sich in einem natürlichen Rhythmus, aber sie wurden mehrmals weniger häufig an die Zellen ausgegeben. Damit war das Problem gelöst.

Hier ist ein Beispiel. 1000 Zellen sollten ihre Werte in einem Rhythmus von 25 ms ändern. Tatsächlich ändern die Zellen ihre Werte etwa alle 500 ms und die CPU-Last liegt bei etwa 50 %. (Dies ist MT4 und die Tabelle ist gezeichnet).

https://www.mql5.com/ru/forum/293630/page160


Hier ist ein Beispiel mit dem Tester. Die Tabelle wird zwar gezeichnet, aber sie bewahrt den Prozessor nicht vor Überlastung. :) (Testergeschwindigkeit 31, Zellenaktualisierung voll (kein Pin-Skipping)).

https://www.mql5.com/ru/forum/293630/page148

 
Реter Konow:
So einfach ist das nicht. Stellen Sie sich vor, Sie haben eine große Tabelle (für das gesamte Diagramm), in der eine der Zellen 20 Mal pro Sekunde ihren Wert ändert. Wenn Sie die gesamte Leinwand neu zeichnen, steigt die Belastung des Prozessors um bis zu 40 % oder mehr. Völlig falsche Art, mit einer Leinwand zu arbeiten. Sie müssen einzelne Elemente neu zeichnen, da sonst Tabellen, Glas und verschiedene lokale Animationen den Prozessor überlasten und die Ausführung anderer Funktionen verlangsamen (wenn sie sich in einem gemeinsamen Thread befinden).

Ich bin mir nicht ganz sicher, woher Sie Ihre Zahlen nehmen. Sehen Sie sich Nikolais ganz einfaches Beispiel an: https://www.mql5.com/ru/forum/227736/page44#comment_13445909. Auf einer Leinwand in der Größe eines Diagramms werden mehrere Objekte erzeugt, die auf das Diagramm (auf der Leinwand) gezogen und fallen gelassen werden können. Der gesamte Kanvas wird neu gezeichnet. Es gibt überhaupt keine Verlangsamung.

Canvas - это круто!
Canvas - это круто!
  • 2019.09.20
  • www.mql5.com
Поставил себе задачу: коротким кодом эффектно продемонстрировать возможности пользовательской графики через класс CCanvas...
 
Алексей Барбашин:

Ich bin mir nicht ganz sicher, woher Sie Ihre Zahlen nehmen. Sehen Sie sich Nikolais ganz einfaches Beispiel an: https://www.mql5.com/ru/forum/227736/page44#comment_13445909. Auf einer Leinwand in der Größe eines Diagramms werden mehrere Objekte erzeugt, die auf das Diagramm (auf der Leinwand) gezogen und fallen gelassen werden können. Der gesamte Kanvas wird neu gezeichnet. Es gibt keine Verlangsamungen.

Sehen Sie sich die obigen Beispiele an.

Einfügen der Links zu den Hyphen.
 

Hier ein Beispiel für die Verlangsamung der Ausgabe von Werten an Zellen und die Entlastung des Prozessors:


https://www.mql5.com/ru/forum/293630/page148

 
Алексей Барбашин:

Ich bin mir nicht ganz sicher, woher Sie Ihre Zahlen nehmen. Sehen Sie sich Nikolais ganz einfaches Beispiel an: https://www.mql5.com/ru/forum/227736/page44#comment_13445909. Auf einer Leinwand in der Größe eines Diagramms werden mehrere Objekte erzeugt, die auf das Diagramm (auf der Leinwand) gezogen und fallen gelassen werden können. Der gesamte Kanvas wird neu gezeichnet. Es gibt überhaupt keine Verlangsamung.

Die Bildwiederholfrequenz in diesem Beispiel ist normal. Es gibt also keine Verlangsamung.

Grund der Beschwerde: