Galerie der in MQL geschriebenen UIs - Seite 56

 
Nikolai Semko #:
Nein Perth, immer noch zu viel. Deine Oberfläche mit all dem Text, den Schatten usw. erreicht auf einem schwachen Prozessor maximal 50 ms.
Suchen Sie nach dem Fehler.
Führen Sie ein Profiling durch. Sehen Sie, welche Funktionen 95% der Zeit beanspruchen.
Vielleicht verwenden Sie ChartGet oder XY-Funktionen (obwohl Sie keine Bindung an ein Diagramm haben).
Wie auch immer, führen Sie eine Profilerstellung durch. Es wird nur 40 Sekunden dauern.

Ja, ich werde alles noch einmal überprüfen. Aber das ist nicht der Punkt. Der Zeichenblock zeichnet nicht nur. In ihm gibt es logische Labyrinthe, die eingehende Ereignisse verarbeiten. Sie werden benötigt, um zu entscheiden, was gezeichnet werden soll und was nicht. Sie entscheiden, woher die Bilder kommen und wo und wie sie überlagert werden sollen. Wenn es sich um eine einfache Zeichenfunktion mit 100 Linien handeln würde, gäbe es nichts zu sagen. Aber dies ist ein massiver Mechanismus, der sicherstellt, dass ALLES gezeichnet wird.

Das ist es wert, berücksichtigt zu werden.))

 
Andrey Barinov #:

Ich verwende einfach NICHT die Standard-Leinwand :).

...

Und dies ist eine angenehme Überraschung. :) Selbstentfaltung ist immer cool. Auch wenn sie unvollkommen ist.

Ich habe nichts gegen die Ccanvas-Klasse (ich habe sogar ihre Funktionalität in die Konstruktor-Dateien aufgenommen), aber ich benutze sie noch nicht. Das Schlüsselwort ist "noch". Ich habe große Pläne für sie. Für die Zukunft.

 
Ich werde die Rendering-Geschwindigkeit einer leeren grünen Leinwand in der Größe des Diagramms überprüfen und das Ergebnis hier veröffentlichen.
 
Реter Konow #:

Ja, ich werde alles doppelt überprüfen. Aber das ist nicht der Punkt. Der Zeichenblock zeichnet nicht nur. In ihm gibt es logische Labyrinthe, die eingehende Ereignisse verarbeiten. Sie werden benötigt, um zu entscheiden, was gezeichnet werden soll und was nicht. Sie entscheiden, woher die Bilder kommen, wo und wie sie überlagert werden sollen. Wenn es sich um eine einfache Zeichenfunktion mit 100 Linien handeln würde, gäbe es nichts zu sagen. Aber dies ist ein massiver Mechanismus, der sicherstellt, dass ALLES gezeichnet wird.

Das ist es wert, berücksichtigt zu werden.))

Nein, wenn es richtig implementiert ist, dauert das Ereignismodell nicht länger als eine Mikrosekunde (ein Millionstel einer Sekunde), selbst wenn es Tausende von Prüfungen gibt.
Suchen Sie nach einem Fehler.
Und hören Sie auf, defensiv zu sein! Niemand greift Sie an, man will Ihnen nur helfen.
Ich habe spürbare Verzögerungen (>300 ms) ab 100 Tausend Objekten, und an die Preis-Zeit gebunden.
 
Nikolai Semko #:
Nein, wenn das Ereignismodell korrekt implementiert ist, dauert es nicht länger als eine Mikrosekunde (ein Millionstel einer Sekunde), selbst wenn es Tausende von Prüfungen gibt.
Suchen Sie nach einem Fehler.
Und seien Sie nicht so defensiv! Niemand greift Sie an, man will Ihnen nur helfen.
Ich habe spürbare Verzögerungen (>300 ms) ab 100 Tausend Objekte, und gebunden an Preis-Zeit.

Ich bin nicht defensiv))) Ha ha. Ich erkläre nur. ))

Also gut. Ich werde mit einem einfachen Test beginnen. Ich fülle eine bildschirmfüllende Leinwand mit einer Farbe und messe die Zeit. Sie messen Ihre Rendering-Funktion und dann wird klarer, ob ich Bremsen in meinem Code habe. Vielleicht gibt es welche. Ich streite mich nicht. Ich muss es überprüfen.

 
Реter Konow #:

Ich bin nicht abwehrend.) Ha ha. Ich erkläre nur. ))

Also gut. Ich werde mit einem einfachen Test beginnen. Ich werde eine Leinwand im Vollbildmodus mit einer Farbe füllen und die Zeit messen. Sie messen Ihre Rendering-Funktion und dann wird klarer, ob ich Bremsen in meinem Code habe. Vielleicht gibt es welche. Ich streite mich nicht. Ich muss es überprüfen.

Ich dachte, dass Sie vielleicht noch nie mit Profiling gearbeitet haben. Du arbeitest auch nicht mit Debugging.


 
Nikolai Semko #:

Ich dachte, Sie haben vielleicht noch nie mit Profiling gearbeitet. Du arbeitest auch nicht mit Debugging.


Nicht mit Debugging. Ich kann es nicht, wegen des russischen Codes. Ich habe mit Profiling gearbeitet. Aber das ist schon lange her. Ich mag es, auf die altmodische Art zu programmieren. So ist es nun mal.

Ich werde es morgen machen. In den letzten Tagen habe ich von 6:00 Uhr morgens bis 22:00 oder 23:00 Uhr abends gearbeitet. Mal mehr, mal weniger. Ich bin ein bisschen müde.
 
Die Geschwindigkeit kann wahrscheinlich auf die lange Bank geschoben werden, und die Optimierung der Geschwindigkeit ist nichts, was sich schnell bewerkstelligen lässt; im Moment ist es besser, die Funktionalität zu verbessern.
 
hini #:
Die Geschwindigkeit kann wahrscheinlich in den Hintergrund gedrängt werden, und die Optimierung für die Geschwindigkeit ist nicht etwas, das schnell gemacht werden kann, es ist besser, die Funktionalität für jetzt zu verbessern.
Nun, es ist immer schön für einen Programmierer, die Geschwindigkeit zu verbessern. Und im Allgemeinen stimme ich zu. Das ist vernünftig. Die richtige Prioritätensetzung bei der Entwicklung ist sehr wichtig. Besonders bei so großen Projekten. Für mich war es wichtig zu wissen, wie wichtig die Geschwindigkeit für die Benutzer ist. Sozusagen, um Feedback zu bekommen. Die Beschleunigung an sich war nicht Teil meiner ursprünglichen Pläne. Ich wollte nur, dass die Benutzer nicht vor Lags zurückschrecken, wenn sie die Schnittstelle betrachten. :)

Natürlich hat die Funktionalität der Elemente für mich immer noch oberste Priorität. Engine, Elemente, Bugs. Das ist die Hauptsache.
 

@Nikolai Semko

Nikolai, jetzt kam unerwartet die Antwort auf die Frage"warum es so lange dauert, eine Leinwandzu malen".

Die Fenster bestehen aus zwei Leinwänden! Diese Leinwände sind fast gleich groß. Also muss die Zeichenfläche mit zwei multipliziert werden. Aber das ist nur der Anfang.

Auf der Fensterfläche befinden sich große Bildlaufelemente (V_BOX), die ebenfalls vollständig mit der Originalfarbe gefüllt gezeichnet werden. Das heißt, wenn V_BOX den Hauptteil des Fensters einnimmt, sollte die Zeichenfläche mit drei multipliziert werden. Aber! Sie hat eine zusätzliche Leinwand. Das Bild wird auf dieser Leinwand gescrollt. Die Basis des Elements ist nur eine Bildlaufleiste. Kurz gesagt - die Zeichenfläche sollte mit vier multipliziert werden (vor allem, wenn die Bildlaufleiste lang ist). Und erst dann werden die Elemente gezeichnet.

Das scheint alles zu sein... Wir können einen Punkt setzen.Wir multiplizieren die Fläche des Fensters mit drei oder vier. Aber nein!

DieElemente selbst sind auch mehrschichtig. Jedes hat eine Basis. Die Basis wird immer von Grund auf neu gezeichnet, gefüllt mit der Originalfarbe. Dann werden die Rahmen über die Basis gezeichnet. Als nächstes werden die Symbole auf die bereits gezeichneten Teile des Elements gezeichnet. Und schließlich werden die Texte über alles gezeichnet.

Als Ergebnis sieht der Benutzer nur die endgültige Farbe auf jedem einzelnen Pixel. Aber an der Stelle dieses Pixels haben sich die Farben mehrmals geändert, während das ganze Fenster gezeichnet wurde.


Multiplizieren Sie dies nun mit 15 Fenstern.... Es wird deutlich, dass es keinen speziellen Fehler im Code gibt - ich habe extra die Ausführungsgeschwindigkeit von Teilen des Zeichenblocks gemessen, und 50 ms für einen Vollbildschirm funktioniert auch bei mir. Es ist nur so, dass ich am Ende viel mehr Bildschirme habe.


Ich habe eine Idee, wie ich den Code ändern und das Zeichnen um den Faktor 2 oder 3 beschleunigen kann. Aber ich werde es nach der Hauptarbeit tun.

Ich möchte mich bei Ihnen bedanken, dass Sie darauf bestanden haben, den Code zu überprüfen. Du hattest Recht. Das ist der Fall, wenn Kritik hilfreich ist.

Danke auch an @AndreyBarinov für den Hinweis mit dem Text. Vielleicht fällt mir ja noch etwas ein.

Nikolai Semko - BeeXXI Corporation
Nikolai Semko - BeeXXI Corporation
  • 2024.07.15
  • www.mql5.com
Профиль трейдера