Leinwand vs. Etiketten - Seite 7

 
Mihail Matkovskij:

Gibt es irgendwo Informationen, wo man mehr darüber lesen kann? Auch wenn es für mich ziemlich klar ist, ist es dennoch ein interessantes Thema! Nun muss noch die Variante der Bitmap-Aktualisierungssteuerung erstellt und getestet werden. Ich wäre überrascht, wenn die Bitmap schneller wäre als die Etiketten.

Ich gebe zu, dass ihre Verwendung bei wenigen Beschriftungen einen Geschwindigkeitsvorteil gegenüber Kanvas hat, da BitMap in C++ und nicht in MQL5 gefüllt wird. Es ist jedoch unwahrscheinlich, dass die Bildung des Textes auch in Canvas gleich sein sollte, da die Bildung von Text BitMap in beiden Fällen von Win-Funktionen durchgeführt wird. Ich denke, im Falle von Label sind diese Objekte mit Ereigniseigenschaften angereichert (sie können mit der Maus gezogen und fallen gelassen werden) und das macht ihre Konstruktion am Ende schwerer.

 

Zur Geschwindigkeit von Canvas gibt es eine Frage.


Die Grafikkarte ist in die CPU integriert.


Code wie diesen ausführen.

#include <fxsaber\Usage\Usage.mqh> // https://www.mql5.com/ru/code/33875

void OnInit()
{  
  USAGE::MinInterval = 100 * 1000; // 100 ms.
  
  EventSetMillisecondTimer((int)USAGE::MinInterval / 1000);  
}

void OnTimer()
{
  _USAGE // Расчет нагрузки.

  USAGE::GraphCreate(1200, 900, 200); // Вывели график нагрузки.
}

void OnDeinit( const int )
{
  USAGE::GraphDelete(); // Удалили график нагрузки.
}

Er misst kurz gesagt, wie viel Zeit OnTimer alle 100 ms ausgeführt wird. Außerdem wird ein Diagramm der Messungen im OnTimer erstellt. Das ist es, was er bekommt.

Sie verschlingt 15-20 %. Offenbar handelt es sich um eine langsame Grafikkarte. Aber das Problem ist ein anderes. Wenn ich beginne, ein Preisdiagramm mit der Maus zu ruckeln (wenn ich die linke Maustaste gedrückt halte und sie nach links oder rechts bewege), erhöht sich die Belastung um das Doppelte. In der obigen Animation ist dies deutlich zu sehen. Was ist der Grund für diese Besonderheit?


Noch einmal. OnTimer braucht doppelt so lange, wenn Sie das Kursdiagramm mit der Maus bewegen.

 
fxsaber:

Zur Geschwindigkeit von Canvas gibt es eine Frage.


Die Grafikkarte ist in die CPU integriert.


Code wie diesen ausführen.

Er misst kurz gesagt, wie viel Zeit OnTimer alle 100 ms ausgeführt wird. Außerdem wird ein Diagramm der Messungen im OnTimer erstellt. Das ist es, was er bekommt.

Sie verschlingt 15-20 %. Offenbar handelt es sich um eine langsame Grafikkarte. Aber das Problem ist ein anderes. Wenn ich beginne, ein Preisdiagramm mit der Maus zu ruckeln (wenn ich die linke Maustaste gedrückt halte und sie nach links oder rechts bewege), erhöht sich die Belastung um das Doppelte. In der obigen Animation ist dies deutlich zu sehen. Was ist der Grund für diese Besonderheit?


Noch einmal. Der OnTimer braucht doppelt so lange, wenn Sie das Kursdiagramm mit der Maus bewegen.

Höchstwahrscheinlich verfügen Ihre Bibliotheken über das CHARTEVENT_CHART_CHANGE-Steuerelement, um die Größe der Leinwand im Bedarfsfall zu ändern (wenn sich die Größe des Diagramms geändert hat), aber um das herauszufinden, müssen Sie die (bisher) sehr langsame asynchrone Funktion ChartGet...
ausführen, was zu Langsamkeit führt.
Für MQ wäre es sinnvoller, das Ereignis CHARTEVENT_CHART_CHANGE zu trennen und z. B. ein separates CHARTEVENT_CHART_SIZE_CHANGE zu erstellen. Das Ereignis CHARTEVENT_CHART_CHANGE enthält zu viele Informationen: neue Balken, Scrollen der Balken, Änderung der vertikalen Preisskala, Größenänderung des Fensters.

 
Nikolai Semko:
Es ist durchaus möglich, dass sie bei einer kleinen Anzahl von Etiketten Geschwindigkeitsvorteile gegenüber Kanvas haben, da BitMap in C++ und nicht in MQL5 ausgefüllt wird. Es ist jedoch unwahrscheinlich, dass die Bildung des Textes auch in Canvas gleich sein sollte, da die Bildung von Text BitMap in beiden Fällen von Win-Funktionen durchgeführt wird. Ich denke, dass diese Objekte im Falle von Label auch mit ereignisgesteuerten Eigenschaften ausgestattet sind (sie können mit der Maus gezogen und fallen gelassen werden) und das macht ihre Konstruktion am Ende schwerer.

Etiketten können in der Tat schneller sein. Kommt darauf an, wie viele in der Tabelle stehen... Ich habe einen Update-Check durchgeführt und war von den Ergebnissen tatsächlich überrascht. Die Grenze liegt bei der für das Auge angenehmen Mindestbildrate von 24 fps, wenn ich mich nicht irre. Ich habe etwa 41 Millisekunden. Setzen Sie Kanvas eine Grenze und, oh Wunder, ich war überrascht. Verglichen mit der unablässigen Aktualisierung der Etiketten vergeht das wie im Flug! Aber als ich die gleiche Einschränkung für die Anzeige auf den Etiketten setzte, war sie sogar schneller als die Kanvas-basierte Anzeige. Aber ich will nicht voreilig sein, ich werde alle Testergebnisse später präsentieren.

 
fxsaber:

Wenn ich das Preisdiagramm mit der Maus zu ruckeln beginne (mit gedrückter linker Maustaste nach links und rechts bewegen), verdoppelt sich die Belastung. In der obigen Animation ist sie gut sichtbar. Was ist der Grund für diese Besonderheit?

Mit dem Windows-Ereignismodell - selbst wenn Sie die Maus schnell bewegen, steigt die CPU-Last, unabhängig davon, welche Anwendung im Fokus war

SZY: mit dem Win10 Task-Manager überprüft... Ich glaube nicht, dass Win10 das Ereignismodell dramatisch verändert hat, es ist eher so, dass der Taskmanager anders funktioniert

 
Nikolai Semko:

Höchstwahrscheinlich verfügen Ihre Bibliotheken über das CHARTEVENT_CHART_CHANGE-Steuerelement, um die Größe der Leinwand bei Bedarf zu ändern (wenn sich die Größe des Diagramms geändert hat), aber um dies herauszufinden, müssen Sie eine schrecklich langsame (bisher) asynchrone ChartGet-Funktion ausführen...
Dies führt zum Bremsen.
Für MQ wäre es sinnvoller, das Ereignis CHARTEVENT_CHART_CHANGE zu trennen und z. B. ein separates CHARTEVENT_CHART_SIZE_CHANGE zu erstellen. Das CHARTEVENT_CHART_CHANGE-Ereignis hat viele Funktionen: ein neuer Balken kommt, die Balken werden gescrollt, die vertikale Preisskala ändert sich, die Fenstergröße wird geändert.

Nichts davon ist im obigen Code enthalten.

 
Igor Makanu:

mit dem Windows-Ereignismodell - selbst wenn man die Maus schnell bewegt, beginnt die CPU-Last zu steigen, unabhängig davon, welche Anwendung im Fokus war

SZY: Ich habe es im Task-Manager von Win10 überprüft... Aus irgendeinem Grund wird kein Anstieg der CPU-Last angezeigt, unter Win7 stieg die Last auf demselben PC an, wenn ich die Maus schnell bewegte - ich bezweifle, dass Win10 das Ereignismodell grundlegend geändert hat, höchstwahrscheinlich arbeitet der Taskmanager anders

Danke, das wusste ich nicht. Es überrascht, dass die Maus das MQL-Programm um die Hälfte verlangsamen kann.

ZS Bin nur ich zu diesem Ergebnis gekommen?
fxsaber:

Sie verschlingt 15-20 %. Offenbar ist die Grafikkarte langsam.

 
fxsaber:

Danke, das habe ich nicht gewusst. Ich war überrascht, dass eine Maus ein MQL-Programm um die Hälfte verlangsamen kann.

Dann ist es legitim, dass es zu Verzögerungen durch Ticks und so weiter kommt. HFT mit einem solchen Ereignismodell ist wie ein Minenfeld.

 
fxsaber:

Nichts davon ist im obigen Code enthalten.

Ja, ich habe nicht gesehen, dass es die interne Tabelle ist.
Nach dem Profiling zu urteilen, liegt die Ursache der Bremsen beim Scrollen des Diagramms auf dieser Linie:

Profiling mit aktivem Scrollen:

Profiling mit aktiver Mausbewegung ohne Scrollen (ohne gedrückte LKM):

ZS: Die Quelle der Bremsen sind also nicht die Kanvas, sondern die Objekte.

 
Mihail Matkovskij:

Sie hätten es auch auf der Karte überprüfen können. Ich dachte jedoch, dass es einfacher wäre, dies im Prüfprogramm zu tun.

Dies ist ein fehlerhafter Ansatz. Zumal der visuelle Tester ein anderes, verzögertes Rendering-Modell verwendet, um den Testprozess nicht völlig zu verlangsamen.

Wie Sie schon sagten, dauert es länger, Text in Beschriftungen zu zeichnen, als OBJ_BITMAP_LABEL zu zeichnen.

Das habe ich nicht gesagt.

Ich habe auf die offensichtlichen Fehler hingewiesen und erklärt, wie das Rendering-System funktioniert.