Was kann ich bei benutzerdefinierten Game-Engines tun, wenn meine Kerndaten fehlerhaft sind oder fehlen?

27

Ich schreibe eine benutzerdefinierte Engine für ein Spiel. Ich habe dieses Spiel gut begonnen, bevor ich begriff, warum ich stattdessen Middleware verwenden sollte, und es ist zu weit fortgeschritten, um es neu zu schreiben.

Die überwiegende Mehrheit meiner Daten stammt aus externen Dateien, und ich beziehe mich nicht nur auf Assets. Ich definiere alle meine Spielobjekte über .JSON. Aber leider bin ich ein Mensch; Gelegentlich sind meine Datendateien ungültig, oder ich ändere das Format, vergesse jedoch, die Datei zu aktualisieren, oder der Loader selbst ist fehlerhaft.

Welche Optionen stehen mir zur Verfügung, wenn aus irgendeinem Grund ein Versuch fehlschlägt, ein Asset in eine benutzerdefinierte Engine zu laden?

Dies ist kein Duplikat von Wie soll ich mit fehlenden Ressourcen umgehen? Da es sich bei dieser Frage um benutzerbezogene Elemente wie Modelle oder Texturen handelt. Schlechte Texturen können durch ein Schachbrett ersetzt werden, schlechte Töne mit Stille und schlechter Text mit "FEHLER". Mein Problem sind Daten, die für das Spiel selbst während der Ausführung von entscheidender Bedeutung sind, wie Ebenen, Spielobjektdefinitionen und GUI-Layouts.

JesseTG
quelle
7
Ich benutze einen ähnlichen Ansatz für mein Spiel. Ich habe tatsächlich eine kleine Utility-App erstellt, um meine Spieledatendateien zu generieren, um menschliches Versagen zu vermeiden. Auf diese Weise kann ich die Dateien nur ändern, wenn ich Änderungen vornehmen möchte, ohne 100.000 Zeilen JSON manuell schreiben zu müssen.
JDSweetBeat
Sie können Ihre Daten auch vor dem Laden durch einen Validator ausführen .
JDSweetBeat
Mein JSON ist klein genug, um es automatisch zu generieren. Außerdem hilft ein Validator nicht, wenn der JSON fehlt oder ein Fehler in der Sache vorliegt, die ihn lesen soll. Vielen Dank für den Gedanken.
JesseTG

Antworten:

44

Einen Fehler protokollieren und ordnungsgemäß beenden.

Zeigen Sie im Idealfall auch einen vom Menschen lesbaren Fehler auf dem Bildschirm an. Es sollte eine Kernpipeline mit fest codierten Funktionen geben, die ohne diese Datendateien funktioniert. Es ist dieselbe Pipeline, die die Datendateien an erster Stelle lädt. Es sollte in der Lage sein, zu erkennen, ob diese Kerndatendateien beschädigt oder auf andere Weise fehlerhaft sind, und die Anwendung zu beenden. Wenn Benutzer diese Dateien ändern sollen, kann nicht viel mehr getan werden. Andernfalls müssen Sie eine Teststrategie implementieren, um sicherzustellen, dass diese Art von Korruption nicht auftritt. Dann können Sie sicherstellen, dass Sie nur gültige Datendateien freigeben.

MichaelHouse
quelle
12

Byte56 erwähnte eine Option. Es gibt mindestens einen anderen:

Übernehmen Sie die Standardwerte und zeigen Sie eine Warnung an.

Abhängig von der Art Ihrer Daten kann es durchaus akzeptabel sein, einige Standardwerte anzunehmen und den Benutzer zu warnen, dass "da die Datei xxx nicht geladen werden konnte, verwenden wir ein generisches JJJ-Objekt."

Tintenfisch
quelle
6

Dies hängt davon ab, ob dies während der Entwicklung oder Veröffentlichung geschieht.

Während der Entwicklung werden Ihnen ständig Dinge, Fehler und Durcheinander fehlen, und Sie möchten möglicherweise sogar Assets bei Bedarf "heiß" laden oder ein Asset ersetzen, während das Spiel ausgeführt wird. Sie können Skripte bearbeiten, während das Spiel läuft, um die Leistung einer KI zu testen, oder ähnliches.

Es ist am ärgerlichsten, wenn das Programm einen Fehlerdialog anzeigt und jedes Mal beendet wird und Sie es neu starten müssen, was 2-3 Minuten dauert. Das Ziel in der Entwicklung ist es, Sie (deren Zeit das wertvollste Kapital ist) so wenig wie möglich aufzuhalten.
Wenn zum Beispiel eine Textur fehlt, möchten Sie so etwas wie ein rot-weißes Schachbrett sehen, möglicherweise mit dem Wort "fehlt" als Ersatztextur, sodass sofort klar ist, dass etwas seltsam ist . Sie möchten jedoch nicht, dass das Spiel ordnungsgemäß beendet wird oder gar abstürzt. Detaillierte Informationen darüber, was in Ihrer Protokolldatei fehlt, sind immens hilfreich.

Andererseits sollte in einem Release der gesamte Satz von Asset-Dateien idealerweise [1] Ihre automatisierte Asset-Pipeline durchlaufen haben. Dies muss nicht viel mehr als ein einfacher Parser sein, der alle Ihre JSONs einliest und dann überprüft, ob jedes Modul in sich konsistent ist, und überprüft, ob jedes Asset, auf das Sie verweisen, tatsächlich vorhanden ist, und dann die gesamte Gruppe von Dateien komprimiert in bekannter (aber nicht notwendigerweise standardmäßiger) Weise, die für Ihre Engine leicht lesbar ist, optional durch Hinzufügen einiger Prüfsummen.

Sie wissen, dass es keinen Fehler geben kann, da Ihre Pipeline überprüft hat, ob alles vorhanden ist, bevor Sie das Paket für den Endbenutzer freigegeben haben. Wenn also ein Fehler auftritt, ist entweder ein Übertragungsfehler aufgetreten oder der Benutzer versucht mit größerer Wahrscheinlichkeit zu betrügen. In beiden Fällen sollte das Programm eine Meldung anzeigen, dass Asset-Dateien beschädigt sind, und beenden.

Alternativ können Sie die Option zum Herunterladen einer unberührten Kopie der Assets aus dem Internet anbieten (wenn Sie einen Download-Server haben). Um jedoch einen Kunden-Support-Albtraum zu vermeiden, sollten Sie vor dem Herunterladen von Gigabyte-Daten nachfragen .


[1] Die Realität mag anders aussehen, es kann sogar vorkommen, dass bei AAA-Titeln, deren Hersteller "Bescheid wissen" sollten, Vermögenswerte fehlen, diese jedoch in der Regel unrealistische Fristen und große, wechselnde Teams aufweisen. Idealerweise hat alles, was Sie versenden, die automatisierte Pipeline durchlaufen und ist garantiert vollständig.

Damon
quelle