Ich habe mich gefragt, welche Ansätze oder Gedanken die Leute zur Automatisierung von Leistungstests in XNA hatten. Momentan möchte ich nur in 2d arbeiten, aber das wirft viele Bereiche auf, in denen die Leistung mit verschiedenen Implementierungen verbessert werden kann.
Ein Beispiel wäre, wenn Sie zwei verschiedene Implementierungen der räumlichen Partitionierung hätten, eine wäre möglicherweise schneller als die andere, aber ohne einige tatsächliche Leistungstests könnten Sie nicht sicher sagen, welche (es sei denn, Sie haben gesehen, dass der Code in bestimmten Fällen offensichtlich langsam ist Teile). Sie könnten einen Komponententest schreiben, der für einen bestimmten Zeitraum immer wieder Entitäten für beide Implementierungen hinzufügt / aktualisiert / entfernt und sieht, wie viele in jedem Zeitrahmen erstellt wurden und der höhere der schnellere ist (in diesem Beispiel).
Ein weiteres Beispiel auf höherer Ebene wäre, wenn Sie sehen möchten, wie viele Entitäten Sie ungefähr auf dem Bildschirm haben können, ohne unter 60 fps zu fallen. Das Problem dabei ist , es automatisieren zu können, muss die versteckte Form Trick oder eine andere Sache verwenden , um ein Kick - off Mock Spiel und rein Test , welche Teilen Sie und deaktivieren Sie alles anderes kümmern.
Ich weiß, dass dies keine einfache Angelegenheit ist, denn selbst wenn Sie die Tests automatisieren können, liegt es an einem Menschen, zu interpretieren, ob die Ergebnisse leistungsfähig genug sind, aber als Teil eines Build-Schritts könnten Sie diese Tests ausführen und veröffentlichen lassen die Ergebnisse irgendwo zum Vergleich.
Auf diese Weise stellen Sie möglicherweise fest, dass der Leistungsfaktor im Allgemeinen gestiegen ist, wenn Sie von Version 1.1 auf 1.2 wechseln, aber einige zugrunde liegende Algorithmen geändert haben, was bedeutet, dass Sie die Gesamtleistung der Anwendung verbessert haben, und dann von 1.2 auf 1.3 dass Sie dann die Gesamtleistung etwas gesenkt haben.
Hat jemand so etwas in seinen Projekten automatisiert, und wenn ja, wie messen Sie Ihre Leistungsvergleiche auf hohem Niveau und welche Frameworks verwenden Sie zum Testen? Vorausgesetzt, Sie haben Ihren Code so geschrieben, dass er für die meisten Teile testbar / verspottbar ist, können Sie Ihre Tests einfach als Mechanismus verwenden, um einige Leistungsergebnisse zu erhalten ...
=== Bearbeiten ===
Aus Gründen der Klarheit bin ich mehr daran interessiert, wie Sie automatisierte Tests in XNA am besten nutzen können, um Ihre Leistung zu verfolgen, und nicht, um Tests oder Vermutungen durchzuführen, indem Sie Ihr Spiel manuell auf einem Computer ausführen. Dies unterscheidet sich grundlegend davon, ob Ihr Spiel auf X-Hardware spielbar ist. Es geht vielmehr darum, die Leistungsänderung zu verfolgen, wenn sich Ihre Spiel-Engine / Ihr Framework ändert.
Wie in einem der Kommentare erwähnt, können Sie leicht testen, "wie viele Knoten ich innerhalb von 2 Sekunden in QuadTreeA einfügen / entfernen / aktualisieren kann", aber Sie müssen diese Ergebnisse jedes Mal physisch überprüfen, um festzustellen, ob sie sich geändert haben gut und ist immer noch besser, als sich nur darauf zu verlassen, es zu spielen, um zu sehen, ob Sie einen Unterschied zwischen den Versionen bemerken. Wenn Sie jedoch einen Assert eingeben, um Sie über einen Fehler zu informieren, wenn dieser niedriger als beispielsweise 5000 in 2 Sekunden ist, haben Sie einen spröden Test, da dieser dann kontextabhängig zur Hardware und nicht nur zur Implementierung ist. Obwohl diese Art von automatisierten Tests nur dann wirklich von Nutzen ist, wenn Sie Ihre Tests als eine Art Build-Pipeline ausführen, dh:
Kasse -> Unit-Tests ausführen -> Integrationstests ausführen -> Leistungstests ausführen -> Paket
Auf diese Weise können Sie die Statistiken von einem Build zum anderen auf dem CI-Server leicht als Bericht vergleichen. Auch dies bedeutet für niemanden viel, wenn Sie nicht an Continuous Integration gewöhnt sind. Der Hauptschwerpunkt dieser Frage ist, wie die Leute dies zwischen den Builds verwalten und wie sie es am besten finden, darüber zu berichten. Wie gesagt, es kann subjektiv sein, aber da aus den Antworten Wissen gewonnen wird, scheint es eine lohnende Frage zu sein.
quelle
Antworten:
Ich nehme an, Sie möchten "Run the actual game" komplett ausschließen, daher wird meine Antwort von Anfang an disqualifiziert. Aber vielleicht kannst du etwas davon wegnehmen, deshalb poste ich das trotzdem:
Für meine Masterarbeit habe ich verschiedene unabhängige / parallele Implementierungen, um dasselbe für einige Module meiner Game Engine zu erreichen, und ich muss einige Leistungsmessungen durchführen. Technisch gesehen würde mich nichts daran hindern, nur das Spiel auszuführen und die im Bildschirmprofiler angezeigten Zahlen zu betrachten, aber ich wollte das trotzdem automatisieren, da es ein mühsamer Prozess ist, wenn sich meine Implementierung ändert.
Was ich also habe, ist Folgendes:
Auf diese Weise kann ich meine Anwendung von einer halbwegs anständigen Skriptumgebung aus starten (z. B. Windows-Eingabeaufforderung über Batch-Skripte - aber ich verwende Ruby tatsächlich für diesen Zweck), einen Speicherauszugsdateipfad festlegen, eine Karte laden und verlassen Laufen Sie für ein paar Minuten, beenden Sie das laufende Spiel, legen Sie einen anderen Dump-Dateipfad fest, wechseln Sie den zu verwendenden Algorithmus, laden Sie die Karte erneut, spülen Sie sie aus und wiederholen Sie sie. Das Ruby-Skript kommuniziert mit dem Spiel während des Flugs, indem es die spezielle Datei erstellt, nach der das Befehlszeilenmodul sucht, und die gewünschten Befehle in die Syntax einfügt, die die Befehlszeile darin versteht.
Ich habe momentan keine kontinuierliche Integration für dieses Projekt verwendet, aber nichts würde mich daran hindern, dieses Ruby-Skript zu erweitern, um auch die generierten Leistungsprotokolle zu analysieren und zu erstellen xUnit- kompatibles XML für die Kommunikation mit dem CI-System zu erstellen, wenn die Leistung unerwartet ist aus irgendeinem Grund durcheinander geraten und das Skript für jeden vollständigen Build auf dem Build-Server ausführen.
Okay, mein Spiel ist weder in XNA geschrieben (es ist einfach C ++ und DirectX), noch respektiert dieser Ansatz die Tatsache, dass Sie es eigentlich nicht wollen das Spiel auf Ihrem Build-Server ausführen . Es ist auch bei weitem nicht so flexibel wie das, was Sie wahrscheinlich wollen - aber es ist dennoch ein ordentlicher, Low-Tech-Ansatz für die automatisierte Leistungsmessung, der etwas CI-freundlich ist (vorausgesetzt, man hat einen bulligen Build-Server).
Bearbeiten: Wie weit ich diesen Ansatz tatsächlich gebracht habe - ich vergleiche nur Leistungsmessungen, die aus verschiedenen Implementierungen nur dieses einen Moduls gewonnen wurden. Das gesamte System ist jedoch so eingerichtet, dass ich jede einzelne der für mein Lightweight-Profiling-Framework definierten Kategorien ausgeben und die Ergebnisse mithilfe der externen Skriptumgebung auf die Art und Weise interpretieren kann, die hier und da nützlich erscheint. Ich beabsichtige weiterhin, den Aspekt der Leistungsprofilierung aus der Gleichung herauszunehmen
quelle
Ich sehe nicht, was Sie als hilfreiches Werkzeug beschreiben. Als Entwickler ist eine einfache Leistungszahl fast nutzlos.
Was Sie wollen, ist, Ihren Code zu profilieren, ihn in logische Teile aufzuteilen und zu messen, wie viel Zeit jeder von ihnen verwendet, Spitzenwert und Durchschnitt. Jetzt können Sie feststellen, welcher Teil des Codes Probleme verursacht, und wissen, wo Sie nach Optimierungen suchen müssen.
Der schwierige Teil ist nicht, dass sich die Leistung von einem Build zum anderen ändert. Sie benötigen keine Automatisierung, um dies herauszufinden. Der schwierige Teil sind Leistungsunterschiede zwischen verschiedenen Computern. Es gibt keine Möglichkeit, die Leistung von einem Computer auf einen anderen mit unterschiedlichen Grafikkarten usw. zu extrapolieren.
Was Sie also wollen, ist eine Benchmark-Funktion, mit der Sie mit einem Klick die Profilnummern abrufen können. Auf diese Weise können Sie mehrere Maschinen gleichzeitig testen. Es gibt verschiedene Möglichkeiten, dies zu tun. Sie können beispielsweise die Benutzereingaben überschreiben, um einer normalen Spielsitzung so nahe wie möglich zu kommen.
Möglicherweise möchten Sie auch einen längeren Test durchführen, um Speicherlecks zu erkennen.
quelle