Verfasst am: 15.06.2015, 15:56
Titel: GUI mehrere Plots - extrem langsam
Hallo,
ich habe vor kurzem ein Programm geschrieben, welches dazu dient eine Datenaufzeichnung einzulesen und grafisch darzustellen.
Zum einen habe ich einen GPS Plot, welcher ansicher superfunktioniert.
Dazu noch aktuell vier weitere Plots, welche verschiedene Kanäle darstellen.
Als x-Achse dient in den Plots die aktuelle Messzeit aus der Datenaufzeichnung. Um die Messung komfortabel "durchzusehen" benutze ich eine Slider Bar.
Außerdem auch eine Play/Stop Taste, bei welcher bei jedem Schleifendurchlauf die aktuelle Zeit um beispielsweise 1/10s erhöht wird.
Letzteres ist aber für mein Problem erstmal nebensächlich.
Zum Problem:
Schon wenn ich nur die Zeit auf einen anderen Messwert ändere und dementsprechend die vier Plots mit neuen Achsenlimits gezeichnet werden, muss ich teilweise bis zu 3 Sekunden warten, bis wieder alles fertig geplottet ist!!
Zum Grundlegenden Prinzip:
Bei einer Änderung des Zeitwertes werden für jeden Plot die Achsenlimits neu gesetzt. Weiter nichts. Die Messdaten (y-Achse) werden schon im vorherein eingelesen. Dadurch konnte ich schon etwas Zeit sparen.
Anfangs habe ich die Achsenlimits auch über axis(xx yy) geändert. Da war es auch schon sehr langsam.
Dann habe ich auf set(gca,'XLim',...) gewechselt, dann war es etwas schneller. Aber immer noch so langsam, dass das Programm im Grunde unbrauchbar ist.
Matlab R2013a 64bit.
Laut Profile ist für die lange "Wartedauer" nur die Rescale Unterfunktion verantwortlich. Mit knapp drei Sekunden pro Aufruf. (Siehe Anhang) Diese dient nur dazu die Achsenlimits neu zu setzen:
Code:
function rescale_test(handles) global Time_Value
allAxesInFigure = findall(gcf,'type','axes');
delete(findobj(allAxesInFigure,'Type','line','Color','k'));
(Der erste Teil dient nur dazu vorhandene Linien zu entfernen. Eigentlich wird bei jedem Aufruf der Funktion auch eine neue Linie beim aktuellen Time_Value gezeichnet, damit man weiß wo man sich befindet. Habe ich mal testweise entfernt, hat nichts gebracht. )
Gibt es hier irgendwelche Grundregeln um die Darstellung zu beschleunigen?
Warum sind die Plots so langsam? Was könnte ich verbessern?
Oder ist Matlab für diese Zwecke einfach ungeeignet?
Am Computer sollte es nicht legen, habe extra Arbeitsspeicher und CPU Belastung im Auge behalten. Da tut sich nichts wenn ich das Programm ausführe.
ah gut, wusste gar nicht, dass man da noch genauer nachschauen kann
Es liegt am
"axes(handles.axes2);"
bzw das gleiche für axes3, axes4, axes5
(Genaueres siehe Anhang)
bzw. folgendes war auch noch sehr langsam. Hatte das jetzt erstmal testweise entfernt: "allAxesInFigure = findall(gcf,'type','axes')"
Nebenbei: Ich habe jetzt noch vor jeder neuen Änderung der jeweiligen Achsenlimits folgendes eingefügt:
"set(gca,'DrawMode','fast')"
Jetzt dauert es immerhin schon nur noch halb so lange. Aber immer noch zu lang!
habe es jetzt mal so umgesetzt wie du vorgeschlagen hast und es hat tatsächlich funktioniert. Wenn ich direkt auf das handle zugegriffen habe, ohne "axes(handlex.axesX)" dann geht es wesentlich schneller.
bzw inzwischen habe ich es noch ein bisschen weiter modifiziert und mache es jetzt über Subplots, die ich in der openingfcn definiere:
ax1=subplot(4,1,1);
ax2=subplot(4,1,2);
ax3=subplot(4,1,3);
ax4=subplot(4,1,4);
All_Axes=[ax1 ax2 ax3 ax4];
Und dann erst später nachdem ein neuer "Time_Value" über die SlideBar erzeugt wurde:
set(All_Axes,'XLim',[Time_Value-100 Time_Value+100]);
Jetzt bekomme ich für die Rescale Funktion nur noch knapp 2ms anstatt 3s wie davor.
Laut Profiler.
In echt ist aber immer noch eine kurze Verzögerung von geschätzt 1s vorhanden. Im Profiler ist nichts zu sehen.
Für die Analyse der Messdaten gibt es auch ein offizielles Programm (Java), da geht das wesentlich besser. Da gibt es auch eine SlideBar und der Bereich verschiebt sich quasi ohne Verzögerung.
Nur das ist mir von der Funktionalität zu eingeschränkt.
Ohne den relevanten Code zu sehen, kann man nur schwer Verbesserungsvorschläge geben.
Es ist merkwürdig, dass GUIDATA und isprop so viel Zeit benötigen. Falls die AXES Linien mit sehr vielen Zahlen enthalten, ist das automatische Setzen der Y-Werte zeitraubend. YLim hier hart zu setzen wäre eine Idee.
Gruß, Jan
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.