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.
Antworten:
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.
quelle
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:
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.
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 .
quelle
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).
quelle