Echtzeit-Debugging-Techniken

18

Es gibt nichts Schöneres als die Routine, eine Variable zu optimieren, Code zu kompilieren, der einige Minuten dauert, den Code auszuführen, zu erkennen, dass Ihre Optimierung in die falsche Richtung geht, und den Vorgang erneut zu wiederholen.

Ich möchte während einer laufenden Sitzung mit meiner Spielelogik interagieren. Wie haben Sie das gemacht?

Ich wäre offen für Lösungen für iOS, C / C ++ und C # / XNA.

David McGraw
quelle

Antworten:

4

Durch die Integration einer vollständig interpretierten Sprache können Sie Spielelemente sehr, sehr einfach im Handumdrehen umschreiben.

Python, Lua usw. können alle ausdrücklich dafür verwendet werden. Angel Engine kann wahrscheinlich als Beispiel dienen.

Das Laden im laufenden Betrieb ist ein weiteres Element, das überprüft werden muss (im Grunde wird ein Ereignis ausgelöst, das Ihnen mitteilt, dass sich ein Asset geändert hat - eine Konfigurationsdatei, ein Kunstelement usw. - und Sie führen es durch eine Reihe von Conditionern, die es für das System ändern endgültiges Format, bevor das vorhandene durch das neue ersetzt wird.

Ich habe mit einem Rapid Prototyping-Motor gearbeitet, bei dem Heißladung verwendet wurde, und es war ein Vergnügen.

AA Grapsas
quelle
2

Was C ++, C # und C # mit XNA betrifft, verfügt Visual Studio über hervorragende Debugging-Tools. Halten Sie die Anwendung in Echtzeit an einer beliebigen Stelle im Code an, und sehen Sie sich die den Variablen zugewiesenen Werte an. Durchlaufen Sie die Funktionsaufrufe , analysieren Sie die Aufrufliste und vieles mehr. Darüber hinaus machen Tools wie Pix und der CLR-Profiler die Entwicklung mit DirectX (Pix) und CLR-basierten Sprachen (CLR-Profiler) großartig.

Außerdem ist ein besonders nützlicher Teil der Arbeit mit Spielen, dass wir diesen riesigen Bereich haben, um Debug-Text, Grafiken usw. zu schreiben. Echtzeitdiagramme zur Speichernutzung, Anzahl der gezeichneten Objekte / Scheitelpunkte, Framerate usw. werden häufig auf dem Bildschirm angezeigt.

Sean James
quelle
1
Während VS ein hervorragendes Entwicklungstool ist, nimmt das normale Debuggen einige Zeit in Anspruch - das Auffinden von Haltepunkten, das Durchlaufen von Code, das Ändern von Variablen und das Neustarten des Ablaufs. Diese Frage sucht nach einer unmittelbaren Möglichkeit, um beispielsweise eine Interface-Komponente zu verschieben oder die Angriffsrate eines Chefs zu ändern.
David McGraw
2

In C / C ++ besteht ein einfacher Trick darin, das Tweakable in eine statische Variable zu setzen, einen Haltepunkt auszulösen, das Static im Debugger zu ändern und es bis zum Beenden beizubehalten.


quelle
Machen Sie es jedoch zu einer statischen Variablen innerhalb einer Funktion. Wenn es sich um ein globales statisches System handelt, kann Visual Studio seinen Wert möglicherweise nicht anzeigen.
Kaj
2

Die HTTP-Protokollierung ist eine große Hilfe und nicht schwer in Betrieb zu nehmen. Sie können sogar die Google App Engine verwenden, um dies schnell zum Laufen zu bringen. Daten sind immer nützlich.

Skripte und XML- Dateien können im laufenden Betrieb neu geladen werden und erfordern kein Zurücksetzen. Lassen Sie sie scheitern, ohne das Spiel zu beeinträchtigen. Dies gibt Künstlern, Testern und Designern viel Kraft.

In-Game-Debug-Menü Ein einfaches Menü, mit dem Sie als Kind das Spiel starten und mit den Engine- und Game-Slidern einfrieren können. So können Sie zur Laufzeit die Schlüsselnummern optimieren und möglicherweise eine oder zwei Debug-Funktionen oder Info-Dumps ausführen.

Ich liebe auch ASYNC-Sockets, wie in Davids Antwort erwähnt

Einfach zu bedienen Ihr Spieleteam muss in der Lage sein, diese Tools zu erweitern und sie sehr einfach zu verwenden, sonst werden sie einfach nicht verwendet.

Kimau
quelle
2

Ich weiß, Sean James hat es bereits gesagt . Aber im Ernst, Visual Studio (speziell die Debugging-Tools) ist großartig dafür.

Heutzutage verwende ich C ++ nicht oft, daher bin ich mir nicht sicher, wie gut dies dort zutrifft. Aber für C # (einschließlich in C # Express) haben Sie:

Und das könnte dich umhauen (es hat mich umgehauen, als ich davon erfuhr):

Das Direktfenster ist eigentlich schwer zu finden (es befindet sich im Menü Debug / Windows).

Der einzige große Nachteil bei der Verwendung des Visual C # -Debuggers ist, dass er keine Änderungswünsche hat const. Also mache ich normalerweise nur meine Gameplay-bezogenen Wertestatic während ich sie optimiere.

(Außerdem hilft es sehr, zwei Monitore zu haben.)


Jetzt muss ich zugeben, dass die obige Methode das Anhalten Ihrer Bewerbung beinhaltet - was für einige besonders schwierige Dinge unbefriedigend langsam sein kann.

In diesen seltenen Fällen muss ich (in XNA) einfach ein bisschen Code hacken (wahrscheinlich mithilfe von Bearbeiten und Fortfahren, wie oben), um ihn zu greifen Keyboard.GetState().IsKeyDown()(tatsächlich habe ich einen einfacher zu tippenden Wrapper dafür) und den Code anzupassen Wert per Tastendruck. Etwas Komplizierteres ist die Mühe nicht wert.


In der Praxis ist das Visualisieren für mich in der Regel weitaus wichtiger Werte in Echtzeit (statt zu modifizieren). Dafür habe ich eine nette kleine Klasse, die Linien und Text puffern kann, um am Ende des Rahmens gezeichnet zu werden. Es ist auch nützlich für schnelles Prototyping.

(Und wieder einmal ist es schön, diese Visualisierungen zur Laufzeit bearbeiten und fortsetzen zu können.)


(Quelle: andrewrussell.net )
( von hier )

Ich fürchte, ich habe momentan keine "nette" Quelle zum Veröffentlichen (vielleicht später). Grundsätzlich handelt es sich jedoch nur um eine Liste von Zeilen (für diese runde Zeilenbibliothek) und Zeichenfolgen (für den in XNA integrierten SpriteBatch). Machen Sie es einfach public staticirgendwo und zeichnen Sie alles mit einer geeigneten Transformation, so dass alles im "Weltraum" erscheint (und löschen Sie dann die Listen für das nächste Bild).

Andrew Russell
quelle
1

Das Schreiben eines einfachen Reflektionssystems für C / C ++ ist ziemlich trivial. Auf diese Weise können Sie alle Variablen im Spiel durchsuchen (sei es mit einem Netzwerk-Tool, einer Tastatur oder einem Joypad) und nach Herzenslust ändern. Es funktioniert für mich, aber alle obigen Antworten sind gleichermaßen gültig.

Bearbeitet, um hinzuzufügen: In diesem Thread geht es jetzt um das Optimieren und nicht um das Debuggen gemäß dem Thread-Titel.

Kaj
quelle
0

Eine Lösung, die ich in mehreren Studios gesehen habe, ist eine externe Debugging-App, die über das Netzwerk an Ihr Programm angehängt wird. Diese App zeigt bestimmte exponierte Variablen und ermöglicht es Ihnen, sie in Echtzeit zu bearbeiten. Beim Hinzufügen neuer Variablen müssen dem Spielcode einige Makros hinzugefügt werden.

Die anfängliche Einrichtung der spielseitigen Makros, des Server / Client-Protokolls (die Lösungen, die ich gerade gesehen habe, serialisieren xml hin und her) und des Client-Schreibens ist groß. Dies ist jedoch äußerst nützlich, da Sie mithilfe des Netzwerks für die Kommunikation auf jeder Plattform arbeiten können.

Tenpn
quelle
0

Binden Sie das Laden und Lesen der Variablen in eine Textdatei und starten Sie sie mit einer bestimmten Tastenkombination oder einem Befehl von der Konsole aus.


quelle