Wie kann ich eine Unit-Test-Rendering-Ausgabe durchführen?

19

Ich habe kürzlich Test-Driven Development (TDD) eingeführt und es hatte wunderbare Auswirkungen auf meine Entwicklungsleistung und die Ausfallsicherheit meiner Codebasis. Ich würde diesen Ansatz gerne auf einige der Rendering-Arbeiten ausdehnen, die ich in OpenGL mache, aber ich konnte keine guten Ansätze dafür finden.

Ich beginne mit einem konkreten Beispiel, damit wir wissen, welche Dinge ich testen möchte. Nehmen wir an, ich möchte einen Einheitswürfel erstellen, der sich um eine Achse dreht, und ich möchte sicherstellen, dass für eine bestimmte Anzahl von Bildern jedes Bild richtig gerendert wird.

Wie kann ich dazu einen automatisierten Testfall erstellen? Am liebsten würde ich sogar einen Testfall schreiben können, bevor ich Code zum Rendern des Cubes schreibe (gemäß den üblichen TDD-Verfahren). Unter anderem möchte ich sicherstellen, dass Größe, Position und Ausrichtung des Cubes korrekt sind richtig in jedem gerenderten Frame. Ich möchte vielleicht sogar sicherstellen, dass die Beleuchtungsgleichungen in meinen Shadern in jedem Frame korrekt sind.

Die einzige Möglichkeit, die mir dabei von fernem Nutzen ist, besteht darin, die gerenderte Ausgabe mit einer Referenzausgabe zu vergleichen, was die TDD-Praxis im Allgemeinen ausschließt und sehr umständlich ist.

Ich könnte über andere gewünschte Anforderungen weitermachen, aber ich fürchte, die, die ich bereits aufgeführt habe, sind nicht in Reichweite.

notlesh
quelle
3
Das ganze Problem hierbei ist, dass Ihr Testfall durch eine gute Ausgabe bestimmt wird; aber was passiert, wenn diese Ausgabe fehlerhaft ist (falsch positiv)? In beiden Fällen überprüfe ich zuerst die Drahtmodelle. Bewegen Sie sich dann zu einer vorwärts gerenderten Szene und verschieben Sie sie schließlich (falls Sie diese verwenden). Sie können das gesamte Bild einer XOR-Operation unterziehen, um einen schnellen Vergleich durchzuführen (vollständig schwarze Übergänge). Die GPU ist wirklich ein schlechter Bereich, um TDD anzuwenden. Aber wenn Sie sich etwas Schlaues einfallen lassen, würde ich es gerne wissen.
Jonathan Dickinson
Ich vermute, dass ich nicht genau die Antwort bekomme, auf die ich hoffe, aber ich hoffe trotzdem auf ein paar gute Ideen. Gute Gedanken zum Black Pass. Das Testen des Tiefenpuffers kann ebenfalls hilfreich sein.
notlesh
@Adam, danke, dass du das geteilt hast. Leider ist es Art und Weise für einen Indie außer Reichweite wie ich auf Handy - Spiele arbeiten :) Es scheitert auch die meisten meiner grundlegenden Anforderungen.
notlesh
@ Adam, du solltest diesen Link definitiv "beantworten". Ziemlich neu.
Jonathan Dickinson

Antworten:

8

Dies scheint eine gute Anwendung des Approval Tests Frameworks zu sein.

Wie in den Kommentaren angegeben, haben Sie immer noch ein Problem mit False Positives, wenn Sie eine schlechte Ausgabe genehmigen. Dies wird Ihnen jedoch MINDESTENS mitteilen, wenn sich die Ausgabe erheblich geändert hat.

Da Sie OpenGL verwenden, gehe ich davon aus, dass Genehmigungen für Sie nicht direkt funktionieren, aber die Idee ist fundiert. Überprüfen Sie einfach den Datei-Hash und zeigen Sie den Fehler in einem geeigneten Diff-Viewer (wie einem Bild-Diff-Programm) an, wenn er anders ist. Wenn Sie mit der neuen Version einverstanden sind, aktualisieren Sie die "genehmigte" Datei so, dass sie mit dem neuen Ergebnis übereinstimmt.

John Gietzen
quelle
Das ist ein interessantes Werkzeug. Wenn Sie so etwas wie die Testfarm in Adams Link in den obigen Kommentaren genommen und einen integrierten Genehmigungsmechanismus wie diesen angewendet haben, würden Sie wahrscheinlich anfangen, sich etwas anzunähern, das ziemlich wenig Aufwand bedeutet. Danke für das Teilen!
notlesh
Der Abnahmetest ist kein automatisierter Test.
zwcloud
@zwcloud: Was meinst du? Sobald es erstellt wurde, ist es wie jeder Test automatisiert. Es ist nur so, dass die erste Genehmigung Teil des Authoring-Prozesses ist.
John Gietzen
@JohnGietzen Ich habe das aus deiner Antwort nicht verstanden. Ich denke, Sie sollten die Idee der Zulassungsprüfungen genauer erläutern. Ich werde die Ablehnung entfernen, wenn die Antwort aktualisiert wird.
zwcloud
6

Ich bin nicht in das Spielegeschäft involviert, also ertrage bitte jede mögliche dumme und naive Wahrnehmung

Für mich Schreiben von Tests , die vollständig gerenderte Bilder vergleichen sind nicht wirklich Einheit Tests, aber die vollständige Integration Tests, weil alles , was für einen erfolgreichen Testlauf zu funktionieren hat.

Was ist mit einer Zwischenschicht, in der Sie überprüfen können, ob alles in Ordnung ist? Mir fallen zwei Dinge ein:

  1. Zeichnen Sie nicht direkt, sondern geben Sie einen Befehlsstrom aus , der in Renderaufrufe umgewandelt wird. Der Befehlsstrom kann auf Richtigkeit überprüft werden. Dies ist kein End-to-End-Test, aber Sie möchten Unit- Tests, keine vollständigen Integrationstests.

  2. Dies ist wirklich eine Variation von 1. Wrappen Sie OpenGL, fangen Sie alle Aufrufe ab, reduzieren Sie dies auf das, was Sie wirklich testen möchten, und überprüfen Sie, ob die Ausgabe noch übereinstimmt. Der OpenGL-Wrapper kann die Prüfung selbst durchführen, wenn er ordnungsgemäß konfiguriert ist, und wird zu einem Schein .

Stefan Hanke
quelle
3

Das Problem ist, dass 3D-Engines kein genaues Bild Bit für Bit ausgeben müssen. Ein gewisser Spielraum wird toleriert, solange die dadurch verursachten Artefakte für den Betrachter nicht sichtbar sind. Eine Textur, die 1% dunkler als erwartet ist, ist normalerweise kein ernstes Problem ... normalerweise. Unter bestimmten Umständen kann es sich um ein visuelles Artefakt handeln. Und das ist das Problem: Es ist bei einem automatisierten Test schwer zu beurteilen, welche Artefakte von einem menschlichen Betrachter wahrgenommen werden und welche nicht. Trotzdem können automatisierte Tests für einfache Überprüfungen der Integrität verwendet werden, wenn sehr einfache Geometrien verwendet werden.

Was Sie tun könnten, ist einige einfache Szenen zu rendern und dann das erzeugte Bild mit einem Referenz-Rendering zu vergleichen. Dieses Referenz-Rendering könnte entweder von einer anderen Grafik-Engine stammen oder ein früherer Screenshot derselben Engine sein (Regressionstest).

Wenn einige Tests nach einer Änderung der Grafik-Engine fehlschlagen, sollte ein menschlicher Tester die Ausgabe mit dem Referenzbild vergleichen und selbst beurteilen, ob die neue Ausgabe genauso gut wie zuvor aussieht (oder sogar noch besser). In diesem Fall sollte der Test geändert werden, um ihn mit den neuen, verbesserten Ergebnissen zu vergleichen.

Eine andere Sache, die Sie automatisch überprüfen könnten, sind Leistungsanforderungen. Eine solche Anforderung könnte sein, dass während einer selbst laufenden Demo (die eine reale Sequenz aus dem Spiel simuliert) die Bildrate auf dem Testsystem nicht unter 40 Fps fallen darf. Dies können Sie automatisch testen. Was Sie nicht testen können, ist, dass das Rendering zufriedenstellend ist. Mit solchen Tests können Sie jedoch verhindern, dass Ihre Entwickler ein Spiel entwickeln, das hervorragend aussieht, aber erst Jahre nach dem Start auf einem erschwinglichen System ordnungsgemäß ausgeführt wird (hallo Crytek).

Philipp
quelle