Wie das Zeitverhalten des GUI einer Anwendung mit GameCanvas verbessern?


#1

Die Frage bezieht sich auf meine graphische Anwendung zur Präsentation von GPS-Daten (siehe Unterforum „Stellt euch vor!“).

Die Anwendung läuft im Hauptteil als Thread mit Schleife in einem GameCanvas. Periodisch werden vorliegende Geo-Daten als Punktfolgen in das Canvas gezeichnet und KeyEvents abgefragt. Zur Kommunikation mit der Anwendung benutze ich einen Zeiger. Mit dem Zeiger werden Geo-Koordinaten abgegriffen und Menüflächen bedient.

Das klappt soweit alles ganz gut, nur bei sehr großen Datenmengen wird die Schleife so langsam, dass sich der Zeiger nur noch sehr träge bewegt. Hab schon daran gedacht, das Eintragen der Geo-Daten in den gepufferten Bildspeicher von einem Taktgeber gesteuert in der Schleife auszusetzen, da ein Update der Datenanzeige eigentlich nur in Intervallen > 1sec nötig wäre. Hätte aber zur Folge, dass Zusatzinfos zu gezeigten Punkten nur sehr verzögert angezeigt werden könnten.

Ich bitte um eure Meinung, wie das Problem anzugehen wäre. Wer kann Lösungsansätze vorschlagen. Bitte


#2

Ein Punkt wäre auf jeden Fall nicht immer alles neu zuzeichnen, sondern das du nur die neuen Punkte hinzufügst und einfach deine Oberfläche verschiebst. Das ist aufwändig aber sollte auf jeden Fall Geschwindigkeitsvorteile bringen.


#3

Hi Mobi_JaNa, ich könnte mir für dein Projekt hier bei uns eine Projektseite gut vorstellen. Was hältst du davon?


#4

EagleEye, die Punkte müssen nicht nur verschoben werden. Nachdem ein Stück Weg zurückgelegt ist und die neuen Koordinaten vorliegen, wird auch der neue Kurs zum nächsten Ziel berechnet und die Darstellung so gedreht, dass Voraus nach oben auf dem Display zeigt, eben eine True Motion Darstellung. Außerdem werden die Routedaten und die PoI-Daten ständig abgetastet, um zu einem „gezeigten“ Punkt auch die Infos bereitzustellen.
Der richtige Ansatz scheint mir jetzt, die Berechnungen in der Schleife nur für kurze Zeit – solange der Zeiger bewegt wird – auszusetzen. Um es auszuprobieren muss ich erst mal die Schleife neu strukturieren. In ein paar Tagen werde ich hoffentlich über Erfolg berichten können.

L-ectron-X, zu deiner Frage werde ich nachdenken und mich dann äußern.


#5

Achso ok mit dem Drehen musst du natürlich alles neu zeichnen, was du aber einbauen kannst ist eine Art Sortierung.
Du zeichnest nur die Punkte die auch dargestellt werden, genauso kannst du es ja mit den POIs halten.
Ansonsten halt nur dann neuzeichnen wenn auch was neues kommt.

Ich weiß jetzt nicht genau was du mit POIs alles machst, aber wie wäre es nur jeden X. Durchgang die POIs anzusehen? Und dann halt nen kleinen Rundumradius für die POIs festlegen wann sie aktiviert werden ~10-50m, weil zu 100% auf die Koordinaten verlassen geht ja aufgrund der Ungenauigkeit von GPS schon nicht.


#6

Kleine Änderung - große Wirkung

	boolean unterbrechePuZeich = false;
	boolean activZeiger;
	Auszug aus der Programmschleife 
	...
	// Auswertung der Key-Events bei aktivem Zeiger
	// Zeigerbewegung
	int keyState = getKeyStates();
	if (activZeiger) {
		if((keyState & (LEFT_PRESSED|RIGHT_PRESSED|UP_PRESSED|DOWN_PRESSED)) != 0) 
			unterbrechePuZeich = true;
		// Auswertung der Key-Events für Zeigerbewegung
		if (keyState & (LEFT_PRESSED)usw. ändere Zeigerkoordinaten x,y entsprechend;
		}
	// Zeiger zeichnen bei x,y
	zeichnenZeiger();
	// Punkte zeichnen
	if (!unterbrechePuZeich) {
		zeichnenPunkte();
	}
	unterbrechePuZeich = false;
	...

Der im Schnipsel angedeutete Weg hat die entscheidende Verbesserung gebracht. Zwar werden jetzt bei anhaltend gepressten Tasten Track, Route und PoI nicht angezeigt, aber sofort nach dem Lösen der Tasten ist das volle Bild wieder da.
Ansonsten hab ich keinerlei andere Nebeneffekte beobachtet.