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
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.