Sollten die Content-Pipeline-Tools in die Engine eingebettet sein?

10

Wie minimal sollte eine Spiele-Engine sein? Wie viel der Inhaltspipeline sollte in die Engine eingebettet sein?

Einige Anwendungsfälle, in denen der Supermotor nützlich sein könnte:

  • Beim Laden von Benutzerinhalten muss der Benutzer seine Texturen nicht verpacken, die Engine erledigt dies beim Laden.

  • Ein Skript fordert eine Schriftart an, die viel größer ist als vorab generiert. Die Engine kann die ttf-Datei analysieren und einen neuen Texturatlas erstellen.

  • Halo-Schmiede .

Nichts davon ist natürlich kostenlos. Dazu müssen Ihre Content-Pipeline-Tools in C ++ geschrieben sein. Unterstützungsbibliotheken, die Sie in der Pipeline verwenden, müssen für die Verwendung auf dem Gerät kompiliert werden. Die Inhaltserstellung muss nicht fehlerhaft sein. Und es macht Ihren Motor im Allgemeinen größer und unhandlicher.
Was sind andere Vor- und Nachteile?
Wiegen die Vorteile die Nachteile auf?

Einige spezifische Fragen:

  • Sollte die Engine in der Lage sein, verschiedene Bildformate zu laden? Ein Lader nur für TGA ist ziemlich einfach zu handhaben.

  • Was ist mit Audioformaten? Ist es möglich, nur das Laden von WAV-Dateien zu unterstützen? Was ist mit Ambient-Musikdateien, die oft riesig sind?

  • Sollte die Engine in der Lage sein, dynamisches TTF-Parsing und Atlas zu generieren?

  • Texturverpackung.

deft_code
quelle

Antworten:

11

Noels Llopis 'Blog "Games from Within" hat dies kürzlich im Beitrag "Remote Game Editing" angesprochen . Der erste Absatz:

Ich bin seit langem ein Fan von minimalen Spiellaufzeiten. Alles, was offline oder in einem separaten Tool ausgeführt werden kann, sollte außerhalb der Laufzeit liegen. Dadurch bleibt die Spielarchitektur und der Code sehr schlank und einfach .

(Der Artikel ist eine sehr empfehlenswerte Lektüre, wie bei den meisten Noel-Artikeln, unabhängig davon, ob Sie zu 100% zustimmen oder nicht.)

Ich glaube, der Schlüssel hier ist, die Komplexität außerhalb des Motors zu halten. Sie können immer noch Flexibilität haben, aber es ist Flexibilität in der Inhaltspipeline. Und Sie erzielen eine bessere Leistung, wenn Sie keine Zeit damit verbringen, Daten zu konvertieren und zu verschieben.

Eine bessere Leistung kann seltsamerweise zu einer kürzeren Iterationszeit führen, obwohl einige der In-Engine-Bearbeitungsfähigkeiten verloren gehen: Es ist einfacher, etwas auszuprobieren, wenn Sie das Spiel in einer Sekunde laden können.

Wenn Sie einige der Grundsätze der " Unix-Philosophie " übernehmen, können Sie Ihre Toolchain flexibel halten: eine kleine modulare Pipeline.

Meine persönliche Philosophie: Backen Sie so viele Daten wie möglich offline, bieten Sie jedoch Engine-Unterstützung, um jederzeit neue Daten zu erhalten. (Beachten Sie, dass diese neuen Daten erst dann ins Spiel kommen müssen, wenn ein geeigneter Punkt erreicht ist: Die Schaltfläche "Aktualisieren" wird gedrückt, die nächste Ebene beginnt, Sie wechseln in einen neuen Bereich, was auch immer. Der Schlüssel besteht darin, den minimalen Sweet Spot zu finden Iterationszeit mit minimaler Codekomplexität und minimalem Codierungsaufwand.)

In unserem Unternehmen konzentrieren sich die meisten unserer Tools für Künstler / Designer auf Probleme mit der Benutzeroberfläche: einfache Bearbeitung einzelner Assets oder Stapel davon usw. Manchmal handelt es sich nur um Tools von Drittanbietern wie Photoshop oder 3DS Max. Diese Tools werden in ein Zwischenformat exportiert (häufig XML, das auf binäre Quelldaten verweist, jedoch nicht immer). Das Zwischenformat wird von einem Backend-Tool "data make" übernommen, das es zu etwas Nützlichem und Schnellladbarem für die Zielplattform macht.

Die Portabilität wird durch Hinzufügen zusätzlicher Tools zum Erstellen von Backend-Daten oder durch Erweitern der vorhandenen Tools zum Erstellen von Backend-Daten erreicht, was den zusätzlichen Vorteil hat, dass sie für die Ersteller von Inhalten unsichtbar sind.

Mit einer korrekten inkrementellen Datenerstellung können Sie nun innerhalb von Sekunden Änderungen im gebackenen Format vornehmen. Ihre Engine kann spinnen oder ein Werkzeug kann spinnen, und diese werden dann in Ihrem Ressourcensystem angezeigt und können nach Bedarf neu geladen werden.

Die Tools - insbesondere die Tools zum Erstellen von Backend-Daten - sind häufig schlampiger und fehlerhafter als der Engine-Code. Dies ist in Ordnung, da sie einfacher umzugestalten / umzuschreiben, zu erweitern und zu testen sind. Sie haben Spezifikationen für ihr Verhalten und es ist ziemlich einfach, sie im Vergleich zu einem Motorcode zu testen.

Meine Meinung zu Ihren Fragen:

Sollte die Engine in der Lage sein, verschiedene Bildformate zu laden? Ein Lader nur für TGA ist ziemlich einfach zu handhaben.

(Abgesehen davon: Selbst wenn Sie einen TGA-Decoder in der Engine verwenden, codieren Sie ihn nicht von Hand. Sie fragen nur nach Problemen - es gibt viele Feinheiten bei den meisten Bildformaten und viele Tools, die nicht funktionieren genau auf das wahrscheinlich nicht spezifizierte Format. Am besten finden Sie vorhandenen, gut getesteten Bibliothekscode für die Bildverarbeitung.)

Ich würde das Tool hier von TGA in Ihr internes Texturformat konvertieren lassen, plus Metadaten.

Was ist mit Audioformaten? Ist es möglich, nur das Laden von WAV-Dateien zu unterstützen? Was ist mit Ambient-Musikdateien, die oft riesig sind?

Wir verwenden hier drei Formate: Verfolgte Musik (.xm), ADPCM (.wav) und Speex (.spx). Dies liegt hauptsächlich daran, dass wir Handhelds verwenden und diese Formate sehr leicht zu dekodieren sind.

Sollte die Engine in der Lage sein, dynamisches TTF-Parsing und Atlas zu generieren? Texturverpackung.

Atlasing ist ein schwieriges Problem: Sehen Sie sich die Antworten Ihrer letzten Frage an . Es lohnt sich fast immer, offline zu arbeiten.

Außerdem können Sie die Metadaten pro Zeichen in eine gebackene Struktur mit einem Ladecode nahe Null verwandeln.

Abschließend können Sie diese Pipeline für die Mod-Community bereinigen und mit Ihrem Spiel verpacken. Sie können jederzeit weitere Quellformate hinzufügen. Und nichts hindert Sie daran, in bestimmten Fällen die Lücke zwischen den Tools zur Erstellung von Inhalten und der Engine zu schließen. Hoffentlich können Ihr Datenbackcode und Ihr Spider / Transfer-Code in Bibliotheken umgewandelt werden, die in einigen Fällen möglicherweise direkt von den Tools zur Erstellung von Inhalten verwendet werden. Aber ich würde das nicht unbedingt zu meinem ersten Ziel machen ... Seien Sie sich nur bewusst, dass es ein letztendliches Ziel sein wird, und lassen Sie dies Ihr Design ein wenig beeinflussen, und entscheiden Sie sich zuerst für die niedrig hängenden Früchte.


Als Update sollten Sie das KTX-Dateiformat für Texturen verwenden. Es hat den Vorteil, dass es structfür die meisten GL-Fälle meistens "eingelesen und losgelegt" wird (und aus Ihren Kommentaren geht hervor, dass Sie auf GL abzielen), während es dennoch flexibel und klar definiert ist.

Der Overhead für KTX-Header kann für vollständig gebackene Daten je nach Ziel etwas hoch sein, und je nach Verwendungszweck möchten Sie möglicherweise auf die Unterstützung für Endian-Swaps verzichten. Für Designüberlegungen ist er jedoch definitiv einen Blick wert.

schlanker
quelle
Tolles Zeug, danke. Ich hatte nie daran gedacht, mein eigenes einfach zu ladendes Bildformat zu erstellen. Gibt es eine bereits erstellte Bibliothek zum Laden minimaler Texturen? Andererseits ist es im Grunde ein Strom von Bytes mit einer Breite, Höhe und Codierung (dh GL_RGB555).
Deft_code
1
Erstellen Sie nicht so sehr Ihr eigenes Bildformat, sondern bringen Sie das Bild genau in das Format, das DirectX, GL oder was auch immer Sie verwenden möchten. =) Was Bibliotheken angeht: Es gibt eine Menge da draußen. Für Tools verwende ich normalerweise nur die ImageMagick- Bibliothek ( imagemagick.org/script/index.php ) oder sogar die Programme ... Der ImageMagick-Code ist altmodisch und ein bisschen hässlich, aber ziemlich schnell, flexibel und schnell -geprüft. Ich bin sicher, dass andere viele andere Vorschläge haben werden; Wenn Sie zB C # für Ihre Toolchain verwenden, wird ein Großteil dieses Materials bereits in .NET-Bibliotheken integriert sein ...
Leander
1
"Ich bin sicher, andere werden viele andere Vorschläge haben" MFC! :) Oder vielleicht OpenIL. Ich denke, einer der wichtigen Punkte beim Backen von Assets in plattformspezifische Formate ist, dass die Anzahl der Kombinationen explodiert, wenn Sie mehr Quellformate und mehr Plattformen hinzufügen. Durch das Konvertieren der Quellressourcen in ein Zwischenformat und das anschließende Konvertieren dieser in plattformspezifische Formate wird die Anzahl der Konvertierungsrouten verringert. Fügen Sie ein weiteres Quellformat hinzu, schreiben Sie einfach einen Konverter in das Zwischenformat. Fügen Sie eine weitere Plattform hinzu und fügen Sie dem Zielformat dieser Plattform einen Bäcker hinzu.
Chris Howe
1
Ich würde hinzufügen, dass das Halten der Komplexität außerhalb der Engine nicht unbedingt bedeutet, dass der Engine keine Funktionalität zur Verfügung steht. Es ist jedoch wichtig, es getrennt zu halten, damit es leicht vom Motor getrennt werden kann. Ich kann gar nicht genug betonen, wie nützlich es ist, das Heißladen von Assets zu unterstützen, dh Dinge im laufenden Betrieb neu zu laden. Auch dies kann eine Menge Komplexität in Ihr System bringen. Sie sollten also sicherstellen, dass es so aufgebaut ist, dass sich das Spiel nicht darum kümmern muss, woher die Assets stammen.
Dash-Tom-Bang
3

Ihre Fragen klingen sehr subjektiv und hängen stark davon ab, wer Ihre Zielgruppe ist.

Lassen Sie uns Ihre Font / TTF-Analysefrage beantworten. Wenn Sie planen, dass Modder ihre eigene Schriftart hinzufügen, möchten Sie den Importvorgang wahrscheinlich so wenig wie möglich ausführen. Wenn Sie dem Spiel intern viele Schriftarten / Schriftgrößen hinzufügen, möchten Sie vielleicht ein etwas ausgefeiltes Werkzeug, das ein Künstler mit ein wenig Training verwenden kann. Wenn Sie dies einmal intern tun, wird die Zeit, die Sie für die Erstellung eines geeigneten Importeurs aufwenden, wahrscheinlich geringer sein, als sich die Zeit zu nehmen, um Tools für die vorherigen Fälle zu schreiben.

Bei allem anderen ist es wirklich eine Frage des Maßstabs. Eingebettete Tools sind die Mühe wert, wenn Sie häufig etwas tun und die daraus resultierenden Komplexitäten / Fehler reduzieren möchten. Jedes zusätzliche Qualifikationsmerkmal, das Sie hinzufügen (dh nur TGA-Texturen, anstatt beispielsweise PSDs zu importieren), führt dazu, dass der Endbenutzer mehr Zeit benötigt.

Denken Sie daran, dass Content-Tools normalerweise von weniger technisch Interessierten verwendet werden (sprich: Künstler). Ich persönlich mag die Art und Weise, wie Unity funktioniert, bei der Sie einfach eine Quelldatei (psd, 3ds, ttf, mp3, jpg, mov usw.) ziehen können und diese automatisch in ihr internes Format konvertiert. Das interne Format ist dem Endbenutzer größtenteils verborgen. Es wird auch automatisch neu konvertiert, wenn festgestellt wird, dass sich die Quelldatei ändert. Aber das ist viel Arbeit.

Tetrad
quelle