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 struct
fü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.