Forum: PC-Programmierung Qt QML nichts für größere GUI ?


von Motorrad (Gast)


Lesenswert?

Ich habe ein Projekt in Qt Qml mit sehr viel Qml, c, c++ Dateien.  Es 
soll einiges Live darstellen (Daten kommen aus IPC)

1) Contoller bootet länger als 3 Minuten wenn ich es mit beim booten 
starte. Ohne dauerts keine 30 Sekunden.

2 ) CPU auslast zu hoch (ca. 20-40% dauerlast nur durch GUI)

3) Speicherverbrauch viel zu hoch für ein GUI Prozess


Bitte verbessern wenn ich falsch bin:
- QML lädt alle Fenster, auch wenn diese nicht angezeigt werden
- QML reagiert auf Events obwohl die Seite nicht angezeigt wird 
(xxxOnChanged:)

Da alle QMLs im Hintergrund laufen, ist klar warum CPU und Speicher 
ausgelastet werden.

Gibt es die Möglichkeit, die anzuzeigende Seite dynamisch zu 
laden/erstellen und beim Wechseln auf ein anderen diese wieder 
loszulassen ?

Problem ist,  die Livedaten ändern sich jede Sekunde. VIELE Qmls 
berechnen und zeichnen dementsprechend. Es soll aber nur die zeichnen 
und berechnen die angezeigt wird und alle andere sollen still bzw. Gar 
nicht da sein :)

LOADER ist halbe Wahrheit ?!

Sry wegen grammatik- bin schlecht darin

von Rolf M. (rmagnus)


Lesenswert?

Motorrad schrieb:
> 1) Contoller bootet länger als 3 Minuten wenn ich es mit beim booten
> starte. Ohne dauerts keine 30 Sekunden.

Was heißt "Controller"? Nutzt du Qt for MCUs?

> 2 ) CPU auslast zu hoch (ca. 20-40% dauerlast nur durch GUI)

Wird da viel animiert, bzw. sendest du permanent Updates deiner Daten an 
die GUI? Normalerweise sollte da nicht viel Last entstehen, solange sich 
nicht dauernd was ändert bzw. aktualisiert werden muss.

> 3) Speicherverbrauch viel zu hoch für ein GUI Prozess

Qt/QML braucht viel Speicher (vor allem Grafikspeicher), weil sehr viel 
Caching der gerenderten Items (als Texturen) statt findet. Das wird 
gemacht, um es schneller zu machen, weil der Aufwand, alles in jedem 
Frame komplett neu zu rendern, zu hoch wäre.

> Bitte verbessern wenn ich falsch bin:
> - QML lädt alle Fenster, auch wenn diese nicht angezeigt werden

Bei QML gibt es keine Fenster. Wenn du die Komponenten meinst: Er lädt 
halt alle, die du in deinem QML direkt angibst.

> - QML reagiert auf Events obwohl die Seite nicht angezeigt wird
> (xxxOnChanged:)

Ich denke, ja. Er kann ja auch nicht entscheiden, ob da wirklich nur 
eine Anzeige gemacht wird, die im Nichts verpufft oder auch irgendwas 
anderes, das auf jeden Fall benötigt wird.

> Da alle QMLs im Hintergrund laufen, ist klar warum CPU und Speicher
> ausgelastet werden.
>
> Gibt es die Möglichkeit, die anzuzeigende Seite dynamisch zu
> laden/erstellen und beim Wechseln auf ein anderen diese wieder
> loszulassen ?

Ja. Man kann Komponenten auch dynamisch nachladen und zerstören.

> LOADER ist halbe Wahrheit ?!

Warum? Der ist doch genau dafür da. Alternativ kann man im JavaScript 
mit createComponent dynamisch Komponenten erstellen und mit 
Component.destory() wieder entfernen. Aber ich denke, der Loader ist da 
der elegantere Weg.
Aus der Doku von Loader:

Loader can load a QML file (using the source property) or a Component 
object (using the sourceComponent property). It is useful for delaying 
the creation of a component until it is required: for example, when a 
component should be created on demand, or when a component should not be 
created unnecessarily for performance reasons.

Das klingt exakt nach deinem Anwendungsfall.

von Motorrad (Gast)


Lesenswert?

Vielen Dank.
Ich benutze Qt auf RasPi bzw BBB mit selbstgebasteltem toolchain 
(Linux).

Sry Fenster->QML files

Ja , viele Daten kommen an und dies jede Sekunde - aber nicht an allen 
QMLs. Bspw. Startbildschirm braucht keine Animation und erwartet auch 
keine Daten - im Unterverschachtelung wird viel animiert bzw. berechnet.

Ich bin nicht ganz sicher:
LOADER wird nur das booten optimieren aber was ist mit CPU und Speicher?
Sobald ich durch die GUI einmal geblättert habe sind ja alle QMLs wieder 
wie üblich am arbeiten trotz "Not visible" ?

Ich werde (nach 1-2 Wochen) folgendes ausprobieren:
1.Startbildschirm mit loader laden
2.Auf ein andere QML (was durchgehend viel animiert und CPU auslastet) 
wechseln
3. Mit loader wieder zurück zum hauptbildschirm

Danach CPU und Speicher zwischen den oben erwähnten Schritte 
Vergleichen.

von Rolf M. (rmagnus)


Lesenswert?

Motorrad schrieb:
> Ich bin nicht ganz sicher:
> LOADER wird nur das booten optimieren aber was ist mit CPU und Speicher?
> Sobald ich durch die GUI einmal geblättert habe sind ja alle QMLs wieder
> wie üblich am arbeiten trotz "Not visible" ?

Du kannst dem Loader sagen, dass er die Komponente löschen soll, indem 
du einfach die Property "active" auf false setzt. In der Doku von z.B. 
SwipeView ist ein ganz simples Beispiel:
1
 SwipeView {
2
     Repeater {
3
         model: 6
4
         Loader {
5
             active: SwipeView.isCurrentItem || SwipeView.isNextItem || SwipeView.isPreviousItem
6
             sourceComponent: Text {
7
                 text: index
8
                 Component.onCompleted: console.log("created:", index)
9
                 Component.onDestruction: console.log("destroyed:", index)
10
             }
11
         }
12
     }
13
 }
Damit bleibt immer die aktuell dargestellte Seite und die links und 
rechts davon geladen. Alle anderen Seiten werden automatisch gelöscht.

: Bearbeitet durch User
von Motorrad (Gast)


Lesenswert?

Wow - ich glaube es ist genau das was ich suche. Ich werde es 
ausprobieren:)

Sehr vielen Dank Herr Rolf.
Dankeschön!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.