Know-How: Exakte Performance-Messung (oder: Making of Review NY Airports, Teil 1)

In meinem letzten Review zu New York Airports hatte ich die Performance gemessen – auf Nachfrage in den Kommentaren wurde ich gebeten, das Tool, mit dem ich das gemacht hatte, doch bitte zur Verfügung zu stellen – so sei es 🙂 .

Dazu bekommt ihr aber noch ein paar Informationen zur Funktionsweise von SimConnect (immerhin eine wesentliche Schnittstelle, die uns all die bunten Flugzeug-Addons beschert) und ein paar Hinweise zur Datenverarbeitung. Ob das dann für euch sinnvoll ist, müsst ihr selbst herausfinden. Besonders einfach ist das alles nämlich nicht.

Was ist und was kann SimConnect?

SimConnect ist eine Schnittstelle, mit der eigene Programme interne Daten des FSX zur Laufzeit abfragen und gegebenenfalls auch verändern können. Ein Beispiel für das Abfragen der Daten ist mein Tool, aber auch die Echtzeit-Flugverfolgung im FS Commander, und eigentlich auch jedes komplexere Cockpitinstrument in Flugzeugaddons. Manipulation von Daten kommt beispielsweise bei der Sichtsteuerung durch Track IR zum Einsatz. Ein Beispiel für die Daten, auf die zugegriffen werden kann, findet sich in der Dokumentation von ESP hier.

Der Clou dabei ist, dass die Datenübertragung mit einem eigenen Programm relativ einfach funktioniert- es gibt vordefinierte Bibliotheken, die von Visual Studio genutzt werden können. Ich war für mein New York Airports-Review nun auf der Suche nach einer Möglichkeit, die Framerate des FSX mitzuloggen, und zusätzlich noch weitere nützliche Daten (Flugzeugposition, Geschwindigkeiten, Höhe und so weiter). Klingt relativ einfach – schreibe ein Programm, dass die Daten aus dem FSX herausholt und in eine Textdatei schreibt, die dann zum Beispiel mit Excel oder MATLAB weiterverarbeitet werden kann.

Da ich leider überhaupt keine Erfahrung mit der Programmierung von neueren Windows-Versionen (neuer als 3.11) hatte, musste ich ein Beispielprogramm nutzen und verändern. Fündig wurde ich bei FS Landing Info, das den Quelltest mitbringt. FSLI fragt diverse (schon recht brauchbare) Informationen vom FSX ab, um daraus die Güte der Landung zu beurteilen. Insbesondere die Benutzerschnittstelle und die Initialisierung der Kommunikation mit dem FSX habe ich genutzt und angepasst. Haken bei der Sache: eine Information zu den FPS gibt es immer noch nicht.

Konzept der FPS-Messung

Es gibt aber in SimConnect die Möglichkeit, den FSX bei jedem Bildaufbau die Daten schicken zu lassen – und aus der Differenz der Systemzeit des aktuellen Frames und des letzten Frames kann man dann die Framerate berechnen. Klingt einfach, ist aber wie viele Messdaten oftmals ein wenig gestört. Filtern hilft dabei, aber ich wollte keinen Filter in das Programm einbauen, weil das a) Performance kostet, ich b) nicht wusste, wie ich das anstellen soll, und ich c) in MATLAB hinterher ohnehin alle Filter der Welt ansetzen kann.

Bedienung und Auswertung

Und wie funktioniert das nun alles? Ladet euch das Programm hier runter, legt es auf den Desktop, startet es und startet einen x-beliebigen Flug. Mit einem Klick auf Connect wird die Datenaufzeichnung gestartet, mit Disconnect wieder beendet. Die Daten werden in eine Datei mit dem Namen fsx_log.txt geschrieben (Achtung: wird bei jedem Programmstart gelöscht und neu erstellt) und können ohne viele Komplikationen mit Excel importiert werden (bei MATLAB muss ggf. noch Punkt/Komma vertauscht werden). In der Datei steht jede Zeile für die Werte eines Zeitpunktes, jede Spalte für eine gemessene Variable (die Bedeutung findet sich in der Kopfzeile). Die letzte Spalte ist die gewünschte Framerate. Ein Beispiel einer Datenzeile:

6,35432191928049E+17 6,93248364716395 -33,0322408822792 4,61972908111428 -94,858932495117 -0,592834512381922 5,91752681250771 -0,44939048291546 316,130164667591 319,745414104243 0,703334236166473 0,402681613950443 3995,19618473154 0 0 21,7376182526433

Das bedeutet aufgeschlüsselt: System-Ticks 6,35432191930049E+17 [10.000.000 = 1 s],  Beschleunigung in x 6,93248364716395 [Fuß/m2], Beschleunigung in y -33,0322408822792, Beschleunigung in z 4,61972908111428 Sinkrate -94,858932495117 [Ft/s], Schwimmwinkel -0,592834512381922 [°] Rollwinkel 5,91752681250771 [°], Pitch -0,44939048291546 [°] Magnetic Heading 316,130164667591 [°], True Heading 319,745414104243 [°] Lattitude 0,703334236166473 [Radians], Longitude 0,402681613950443, Höhe 3995,19618473154 [Ft] Höhe des Bodes 0 [m], Bin ich auf dem Boden? 0 [Nein!] Framerate seit dem letzten Frame 19,9961607371385 [FPS].

Tatsächlich hatte ich die Aufzeichnung gestartet, als ich gerade den Anflug auf Thessaloniki begonnen habe – passt also alles.

Die Einheiten sind oftmals ein wenig eigenartig, aber genau so kommt es eben aus SimConnect raus :-). Eine Schwierigkeit habt ihr sicher, wenn ihr nicht – wie ich – hauptsächlich in MATLAB arbeitet, sondern in Excel: den Filter müsst ihr selbst machen. Ich empfehle gleitende Mittelwerte über 10 oder 20 Zeilen, das geht zum Beispiel so. Zum Ausprobieren ist hier die Beispiel-Datendatei von meinem Anflug auf Thessaloniki, hier das komplette Visual Studio-Projekt zum selbst kompilieren, für die MATLAB/SciLab/Octave-Nutzer ist hier mein Einleseskript.

Alles klar? Wenn nicht – einfach ausprobieren, Visual Studio in der Express-Version reicht und kostet nichts. Ihr benötigt übrigens Dot.Net 2, und es kann sein, dass P3D nicht auf Anhieb funktioniert, weil die SimConnect-Version eine andere ist. Vielleicht kann das jemand einfach neu kompilieren?