Frage

So versuche ich auf meinem eigenen kleinen 3D-Spiel zu arbeiten. Jetzt bin ich mehr oder weniger diese Weise C # zu lernen. Ich frage mich, was ist die beste Methode für die Verpackungsanlagen wie Texturen / scripts?

Im Allgemeinen, was ich dachte zu tun war:

[header]
[number of records]
[Offset to Record 1 from End of header]
[Offset to Record 2 from end of Record 1]
.
.
[Offset to record N from Record N-1]
[record 1]
[256 bytes represent the filename]
[32 byte size]
[binary data]
[record 2]
.
.

Im Moment will ich es nur speichern, einfache Bilder und Textdateien. Ich habe einige getan umsah und das Beste, was ich war wirklich ein altes Beispiel gefunden, wie das Verhängnis wad gespeichert werden.

Hat jemand Erfahrung?

War es hilfreich?

Lösung

Das ist in Ordnung. Wenn Sie alles in den virtuellen Speicher laden und lassen handle es tauschen, dann können Sie ein beliebiges Format verwenden, wirklich. Wenn Sie Random Access wollen nur einen Datensatz (so zum Beispiel können Sie faul laden, obwohl unkomprimierter memmap auch faul ist), dann haben Sie wahrscheinlich den Index in Erinnerung behalten mögen.

Die meisten Leute benutzen eine Bibliothek, die ihnen den Zugang zu einem .zip, .jar, .pak (Erdbeben-Format) oder ähnliche (komprimiert oder nicht) Archivformat, als ob es Teil des Dateisystems waren (das gibt ist, Datensätze werden von String-Schlüssel zugegriffen wird). Ich würde auf jeden Fall diesen Weg gehen, wenn Sie eine bereits hergestellte Bibliothek finden können, zum Beispiel truezip für Java. Apache Commons man hat, aber ich weiß nicht, wie einfach es zu integrieren, ist w / .NET (es ist eine große C-Codebasis ich glaube). ZipFS sieht aus wie es ein tatsächlicher .NET Zip-Datei-Bestücker ist, dass die Header nur hält im Speicher.

Oder mit wahrscheinlich nur ein wenig weniger Bequemlichkeit, könnten Sie DotNetZip direkt

Andere Tipps

Vergeuden Sie nicht Ihre Zeit Ihr eigenes Speicherformat zu erfinden.

Sie können SharpZipLib oder andere freie Kompressions-Bibliothek für .net verwenden. Mit ihm können Sie auch mehrere Dateien in einem Archiv packen und entpacken Sie die Dateien, die Sie separat auf Anfrage wollen.

Ihr Design mir gut aussieht, wenn ich davon ausgehen, dass Sie 32 Bits gemeint für Größe anstatt 32 Bytes

Ich denke, dass Ihr Design am besten für Situationen wäre, wo Sie alle Ihre Vermögenswerte in einem Rutsch laden wollen, weil es eine Art eines sequentiellen Designs ist. Wenn Sie nur ein paar Vermögenswerte zu einem Zeitpunkt, laden wollen (vielleicht, weil jedes Spiel-Level nur eine Teilmenge der Vermögenswerte verwendet), dann wäre es etwas weniger effizient sein, weil Sie durch die einzelnen Vermögenswert wiederum lesen müßten diejenigen zu finden dass Sie wollen.

In diesem Fall könnten Sie eine indizierte Design ausprobieren wollen, vielleicht so etwas wie folgt aus:

[HEADER]
[Miscellaneous header stuff]
[Offset to index from start of file]
[Number of entries in index]
[RECORD 1]
[Asset data]
[RECORD 2]
[Asset data]
.
.
[RECORD N]
[Asset data]
[INDEX]
[ID or filename of asset 1]
[Size of asset 1]
[Offset to asset 1 from start of file]
[Other asset 1 flags or whatever]
[ID or filename of asset 2]
[Size of asset 2]
[Offset to asset 2 from start of file]
[Other asset 2 flags or whatever]
.
.

Dies würde für eine bessere Direktzugriff von Vermögenswerten ermöglichen, denn jetzt müssen Sie nur noch über Ihren Index suchen (die Sie in den Speicher geladen werden würde), anstatt durch Ihre gesamte Datei (die in den Speicher passen möglicherweise nicht). Wenn Sie bekommen Lust wollte konnte man einen Baum oder Hash-Tabelle für den Index verwendet werden.

Der Grund, den Index am Ende der Datei setzen, anstatt die Front ist, dass es macht es leichter, eine anderen Vermögenswert zu Ihrer Pack-Datei hinzufügen, ohne die ganze Sache wieder aufbauen zu müssen. Andernfalls würde der zusätzliche Eintrag in Ihrem Index alle Ihre Offsets werfen.


EDIT: , um Kommentare zu reagieren ...

Was ich im Sinn hatte, war, dass man nur die Vermögenswerte über den Index zugreifen würde, hoffentlich würden Sie nie das Ende des Vermögens laufen ab, wenn sie zu lesen. Vielleicht ein Beispiel für einen typischen Anwendungsfall würde helfen.

Angenommen, Sie in der Textur namens „TankTexture.png“ lesen wollte. Hier ist, wie ich denke, dass man darüber gehen würde:

  1. Öffnen Sie die Pack-Datei.
  2. Lesen Sie in der festen Größe Header.
  3. Extrahieren Sie die Index-Offset und Anzahl der Einträge aus dem Header.
  4. Suchen Sie nach dem Start des Index.
  5. Lesen des Index in einem Array (fixed Indexeintragsgröße mal Anzahl der Einträge).
  6. Index für die Asset-Suchen Sie in dem Namen "TankTexture.png".
  7. Extrahieren Sie die Asset-Offset und die Größe des Indexeintrags.
  8. Suchen Sie nach dem Start des Vermögenswertes.
  9. Lesen Sie in der Anzahl von Bytes, die von der Asset-Größe angegeben.

Natürlich, für die nachfolgende Assets, die Sie würde nur 6-9 Schritte benötigen.

Ich hoffe, das hilft zu erklären, was ich dachte. Lassen Sie uns wissen, wenn Sie Fragen haben.

Wenn Sie diese zu Lernzwecken tun wollen, dann ist das WAD-Format ist ein guter Anfang. Allerdings würde ich mit einem Chunked Dateiformat vor.
So wäre es im Grunde Ihrem vorgeschlagene Format (das heißt Header, TOC, etc.) folgen, aber für jeden Dateneingabe würden Sie ein Stück ID haben, die, welche Art von Daten identifiziert sind.
Dies hat viele Vorteile, vor allem, dass Sie Ihr Datenformat gegen Code-Format, indem Sie Ihren Code Brocken überspringen variieren können, die es nicht verstehen - dies ermöglicht Ihre Entwicklungs-Tools, während der Kompatibilität in Ihrem Spiel auf Ihren Daten zu halten, rückwärts zu gehen.

Ich würde auch empfehlen, einen zusätzlichen 32-Bit ‚Flags‘ Eintrag in dem Inhaltsverzeichnis, die Sie bitfield verwenden würde es ermöglichen Optionen wie Komprimierungstyp zu ermöglichen, Verschlüsselung etc.

Ich hoffe, das hilft

sagen, dass ich Ihr Format ist eine gute Wahl. Idealerweise sollten Sie alle Ihre Assets in einer Lese ziehen. Zum Beispiel würden Sie alle Ihre Daten für die Ebene 3 in der gleichen Paket wünschen, dass die Art und Weise Sie alle Level-Daten in einem Lese ohne zu versuchen, laden. Es ist wirklich ok einen einzigen Vermögenswert in mehr als ein Paket zu haben. Sie müssen nur den Fall zu behandeln, dass ein Vermögenswert bereits geladen ist und überspringt es.

Wie Sie Ihre Daten aufteilen sollten auf den Abhängigkeiten zwischen den Daten abhängig sein (dh, wenn ein Skript ein bestimmtes Modell benötigt, sollte sie im gleichen Paket sowohl) und wie granular Sie benötigen liest (ex zu machen. Kann Sie lesen alle Level-Daten in einem Rutsch? Dann können Sie Ihre Feinde in der Ebene Paket geschnürt. Aber wenn Ihr Spiel Ströme in der Welt, vielleicht müssen Sie separate Pakete für Feinde.)

Wirklich, Sie Datenabhängigkeiten Tracking ist der schwierige Teil. Bei der Erstellung wollen Sie die Abhängigkeiten von jedem Stück von Daten wissen, dass Sie in ziehen. Während der Laufzeit in Ihrem Paket nur lesen wollen und haben das Vermögen im Speicher angezeigt. Sie müssen auch Abhängigkeiten zur Laufzeit verfolgen, weil Sie müssen wissen, was sicher entladen zu jeder Zeit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top