Warum Asset-Manifest-Dateien verwenden?

11

Manchmal werden Sie Leute sehen, die dies empfehlen, anstatt Grafiken / Sounddateien / etc. Zu verwenden. so was...

// Game code
Image myImage = new Image("path/to/image.png");

... sollten Sie stattdessen eine Manifestdatei als Indirektionsebene verwenden:

// Manifest file
MY_IMAGE: path/to/image.png

// Game code
Manifest myManifest = new Manifest("path/to/manifest");
Image myImage = myManifest.getImage("MY_IMAGE");

Welche Gründe hätte ich für einen solchen Ansatz? Wenn ich keine kompilierte Sprache verwende, gibt es dann noch Gründe dafür?

Tung Nguyen
quelle

Antworten:

8

Meistens sind Manifestdateien mit einer Art Archivdateiformat verknüpft. Beispielsweise ist eine JAR-Datei in Java einfach eine Zip-Datei mit einer Manifestdatei, in der die Assets in der Zip-Datei aufgelistet sind und wo sie zu finden sind. In diesem Fall ist "path / to / image.png" kein realer Dateisystempfad, sondern Informationen darüber, wie das Objekt in einem komprimierten Archiv gefunden wird. Zusätzlich zum Speicherplatzvorteil der Komprimierung kann die Verwendung eines Dateiarchivs die Leistung verbessern, da es für Windows sehr schwierig ist, mit Zehntausenden einzelner Dateien in einer kleinen Anzahl von Verzeichnissen umzugehen.

Mithilfe einer Manifestdatei dieser Art können Sie vollständig abstrahieren, woher ein bestimmter Datenblock stammt. Möglicherweise befindet sich Ihre Datei auf einer DVD oder wird aus dem Internet oder in einer Zip-Datei gestreamt. Sie müssen zusätzlichen Code schreiben, um diese Fälle zu behandeln, aber bei Verwendung einer Manifestdatei muss sich Ihre Spielelogik überhaupt nicht darum kümmern, woher etwas geladen wird.

Wenn Sie eine nicht kompilierte Sprache verwenden, kann diese Manifestdatei sicherlich eine C # -Quelldatei sein. Es ist jedoch hilfreich, wenn Sie die Manifestdatei, die Sie zur Clientausführungszeit verwenden, auf der Grundlage einer Registrierungseinstellung oder ähnlichem leicht ändern können. Sie können beispielsweise während der Ausführung überprüfen, ob ein Cache auf der Festplatte vorhanden ist oder ob nur die DVD verfügbar ist. Sie können dann abhängig vom verfügbaren Setup wechseln, welches Manifest verwendet werden soll.

Ben Zeigler
quelle
Ich sehe die Notwendigkeit, Dateispeicherorte in komplexen Szenarien zu abstrahieren, aber das Abrufen von Dateien aus einem Zip-Archiv sollte kein Manifest erfordern, da Dateinamen und Pfade im Archiv erhalten bleiben.
Alex Jasmin
4

Ein Grund: datengesteuerte Programmierung.

Ihr Code möchte möglicherweise nur wissen, dass er eine "LightWood" -Textur benötigt, und lässt den Ressourcenmanager diesen Schlüssel verwenden, um den richtigen Pfad zur Datei zu finden. Darüber hinaus möchten sich Benutzer in Skripten nicht an Dateipfade erinnern. Sie sind chaotisch, sie können falsch sein. Lassen Sie das Manifest herausfinden, wo sich die Datei befindet, und lassen Sie den Menschen anhand des Namens und nicht des Dateinamens herausfinden, welches Material er benötigt.

<material name="wood">
  <diffuse color="1,1,1,1">environment.zip/wood_diffuse.jpg</diffuse>
  <normals>environment.zip/wood_normals.jpg</normals>
  <shader>environment.zip/wood.fx</shader>
  <specular color="1,1,1,1" power="0.5" flat="yes" />
</material>
Nick Bedford
quelle
2

Als allgemeines Entwurfsmuster sind Manifeste nützlich, wenn Sie alle Informationen über eine unterschiedliche Gruppe von Objekten an einem einzigen Ort sammeln möchten. Es muss sich nicht um archivierte / gepackte Dateien oder um Indirektion handeln, damit Dinge verschoben werden können, ohne die ursprünglichen Referenzen neu zu kompilieren / zu aktualisieren. Letzteres kann in der Tat mehr Probleme verursachen als es löst. Sie würden dies also nur tun, wenn es ein bestimmtes Bedürfnis lösen würde, das Sie hatten.

Der große Vorteil von Manifesten besteht darin, dass sie als Index für eine große Datenmenge an einem einzigen kompakten Ort fungieren. Als solche verbessern sie die Leistung (weil Sie einfach das gesamte Manifest von der Disc laden und im Speicher behalten können), insbesondere in dem Fall, in dem Sie mehrere Objekte durchlaufen müssen, aber nicht im Voraus wissen, um welche Objekte es sich handelt . Wenn sich die Objekte auf einer Disc befinden, insbesondere wenn sie sich an mehreren Stellen befinden, müssen Sie das Dateisystem jedes Mal berühren, wenn Sie über Dateien iterieren möchten. Bei Disc-basierten Dateisystemen ist die zum Berühren des Dateisystems erforderliche Zeit unerschwinglich, sodass das Durchlaufen von Dateien in einem Verzeichnis enorme Kosten verursacht. Indem Sie ein Manifest von Dateien zur Erstellungszeit vorab erstellen (Hinweis: keine Kompilierungszeit), tauschen Sie diese Kosten gegen die Speichernutzung aus.

Archivdateien erfordern die Verwendung von Manifesten, einfach weil das Inhaltsverzeichnis für das Archiv im Wesentlichen selbst ein Manifest ist, sodass Sie das Verhalten kostenlos erhalten. Wenn Sie Manifeste für Assets an einem Ort verwenden müssen, kann es sauberer sein, darauf zu bestehen, dass alle Assets über Manifeste referenziert werden. So können Sie den tatsächlichen Speicherort / Mechanismus der Assets von den Verweisen auf diese Assets im Code abstrahieren. Auf diese Weise können Sie einen einzelnen Asset-Referenztyp in Ihrem Code haben und müssen nicht zwischen Dateipfaden, Archivdateipfad + Offset oder Unter-Assets unterscheiden.

MrCranky
quelle
1

Zusätzlich zu den anderen Antworten wird Ihr Code dadurch etwas stärker von Ihren Assets getrennt. Sie können beispielsweise einem Künstler erlauben, direkt mit den Manifestdateien zu arbeiten, ohne dass ein Programmierer die Änderung vornehmen und einen neuen Build erstellen muss. Sie müssen lediglich die Manifestdatei ändern, um auf ein neues Bild zu verweisen, und das Spiel einfach erneut ausführen.

Dennis Munsie
quelle
0

Manifestdateien bieten eine Indirektionsebene zwischen dem Ressourcennamen und seinem Speicherort. Nach zusätzlichen Indirektionsebenen ist dies nur ein Zeichen für Überdesign. Manchmal ist diese zusätzliche Schicht jedoch genau das Richtige, um eine elegante und effiziente Lösung zu erstellen.

Hier ist ein einfaches konkretes Beispiel, bei dem mir die Trennung von Ressourcenname und Standort geholfen hat. Während der Entwicklung befinden sich meine Kunstobjekte in der Revisionskontrolle mit Quellcode. Es ist sehr praktisch und ermöglicht mir, schnell zu iterieren. Normalerweise spiegelt der Ressourcenname den Standort wider. Das Entwicklungsmanifest ist sehr einfach.

Ich möchte kein Spiel mit den verstreuten Assets verteilen. Wenn ich bereit bin, es zu verteilen, kann ich meine Assets einfach in eine Ressourcendatei komprimieren und ein neues Manifest erstellen.

Auch Texturatlanten sind eine großartige Möglichkeit, dem Grafiksystem ein bisschen mehr Leistung zu entziehen. Atlanten sind schnell, aber es ist schwierig, mit ihnen zu arbeiten, während sich die Kunst noch in der Entwicklung befindet. Meine Lösung besteht darin, den Atlas erst am Ende zu erstellen, wenn ich das Spiel optimiere. Da ich Manifeste verwende, muss ich das Manifest nur aktualisieren, um auf einen Atlas zu verweisen, und voilà das Spiel verwendet jetzt Atlanten anstelle von geraden Dateien.

deft_code
quelle