Lieber Besucher, herzlich willkommen bei: RPG Studio - Make your World real. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

  • Playm

    RPG Studio Webmaster

    Sie müssen sich registrieren, um eine Verbindung mit diesem Benutzer herzustellen.

322

Dateiformate bei der Spielentwicklung

Bewertung:

Von Playm, Sonntag, 5. November 2017, 21:29

Kippt schonmal die ganze Milchpackung ins Kakaopulver und macht es euch bequem. Heute mal ein gemütlicher Blog mit ein bisschen plauschen über die Dateien des RPG Makers, von Java, Microsoft Word und was ich bedenken würde, wenn ich mir selber einen Maker baue. ITgenie und schM0ggi bitte mitschreiben. ;)

Das Format einer Datei erklärt wie die Informationen in dieser Datei aufgeschrieben sind. Programme, die das Dateiformat kennen, können dann die tatsächlichen Informationen herauslesen. Man kann grob von drei Klassen für Dateiformate ausgehen: Binärdateien, textuelle Dateien und gepackte Dateien.

Ein Beispiel für eine textuelle Datei ist die HTML-Seite, die euer Browser gerade anzeigt und die ihr lest. Die Informationen werden als Text in die Datei geschrieben. Der Browser kennt das Format und kann euch die tatsächliche Information anzeigen. Ihr könnt die HTML-Datei aber auch mit einem Texteditor öffnen und habt eine Chance zu verstehen, was für Informationen enthalten sind. Ein Beispiel für binäre Dateien sind die .rxdata- oder .rvdata-Dateien des RPG Makers. Hier werden Rubyobjekte als eine Reihe von Bytes gespeichert. Öffnet man diese Dateien mit dem Texteditor erkennt man so ziemlich nichts. Ein paar Worte kann man sehen aber zwischendurch stehen einfach nur Bytes, die als Buchstaben interpretiert keinen Sinn ergeben. Das letzte Format, was wir heute berücksichtigen sind gepackte Dateien. Zum Beispiel .odt- oder .docx-Dateien von LibreOffice und MS Word gehören in diese Klasse. Oder .jar-Dateien, wenn ihr Jave-Programmierer seid. Wir wollen uns hier mal diese drei Klassen im Detail ansehen und inwiefern sie für die Spielentwicklung geeignet sind - welche Vor- und Nachteile sie haben.

Wir schauen dabei auf drei Eigenschaften:
  1. Wie groß sind solche Dateien im Vergleich?
  2. Wie leicht sind diese Dateien außerhalb des Programms für den Benutzer verständlich/bearbeitbar?
  3. Kann ich mit git oder anderen Werkzeugen zum gemeinsamen Arbeiten die Dateien benutzen ohne mir selbst noch Software dazu basteln zu müssen?


Binärdateien


Binärdateien erlauben uns Informationen maximal platzsparend unterzubringen. Nehmen wir zum Beispiel das folgende Szenario:
  • Wir haben ein Multiplayer-Labyrinth-Spiel wo vier Spieler zusammen durch ein Labyrinth laufen und vier besondere Schätze finden müssen. Zusätzlich finden sie Schlüssel, mit denen sie Toren öffnen können. Wir wollen jetzt den aktuellen Spielstand abspeichern.

    Spieler 1 befindet sich auf der Map 7 mit den Koordinaten 53|26 und hat vier Items dabei mit den IDs 1, 4, 12 und 48.
    Spieler 2 befindet sich auch auf dieser Map an Koordinate 46|32 und hat zwei Items dabei mit den IDs 96 und 98.

    Wir wissen es gibt maximal 4 Spieler, es gibt bis zu 99 Maps die bis zu 500x500 groß seien können und wir haben 200 Items in der Database. Dann könnte man diese Informationen in acht Bytes pro Spieler speichern. Unser Spielstand als Binärdatei wäre also 16 Bytes groß.
    Spoiler: Beweis

    Quellcode

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    1.Byte    2.Byte    3.Byte    4.Byte    5.Byte    6.Byte    7.Byte    8.Byte
    0000_0000 0000_0000 0000_0000 0000_0000 0000_0000 0000_0000 0000_0000 0000_0000
    SSmm_mmmm mmxx_xxxx xxxx 00yy yyyy yyyy iiii_iiii iiii_iiii iiii_iiii iiii_iiii
     
    S  = Bit für die Kodierung von Spieler ID
    m  = Bit für die Kodierung der Map ID
    x  = Bit für die Kodierung der X-Koordinate
    y  = Bit für die Kodierung der Y-Koordinate
    i8 = Byte für die Kodierung eines Items.
    zum Lesen den Text mit der Maus markieren

    Man könnte das sogar noch weiter optimieren, dass wir sogar nur 14 Bytes bräuchten, aber das ist jetzt nicht so wichtig. Vor allem wird auch keiner mehr schlau daraus, was in diesen Dateien dann steht. Im Anschluss an diesen Blog könnt ihr euch ja mal Dateiformate für Bilder angucken - die Meisterklasse von speicherplatzoptimierten Binärdateien.


Zusätzlich bietet fast jede objektorientierte Programmiersprache die Möglichkeit Objekte in Binärdateien zu speichern und wieder daraus zu laden. Dies ermöglicht dem Programmierer eine sehr einfache Entwicklung. Der RPG Maker verzichtet zum Beispiel darauf, seine Informationen zu Tode zu optimieren, sondern speichert einfach Rubyobjekte in seine .rxdata- und .rvdata-Dateien.

Ein klarer Pluspunkt ist also die breite Verfügbarkeit, dass egal womit ich mein Spiel programmiere (Ruby, Java, Python, ...) ich sehr wahrscheinlich die Möglichkeit habe Spieldaten (ohne viel nachdenken zu müssen) in Binärdateien speichern und auch daraus wieder laden und weiterbenutzen zu können.

Ein Nachteil ist, das Binärdateien in der Regel nur von dem Programm verstanden werden, dass sie erstellt hat. Habe ich gerade den Maker nicht zur Hand werde ich wenig mit den .rxdata-Dateien anfangen können.

Der RPG Maker, der Binärdateien verwendet war nie dafür vorgesehen, dass mehrere Leute gemeinsam an einem Projekt arbeiten. Aber wenn man mal abgesehen von ownCloud oder Dropbox mit anderen sein Projekt teilen möchte schaut man erstmal in die Röhre. Da beliebige Binärdateien nicht von allen Programmen verstanden werden, kann ich auch die meisten Versionierungswerkzeuge wie git nicht so einfach verwenden, um zu gucken was mein Projektpartner an der Item-Database geändert hat. Anders wäre es bei textuellen Dateien.

textuelle Dateien


Textuelle Dateien erlauben uns Informationen menschenlesbar zu speichern. Das puristischste Beispiel sind .txt-Dateien, die wirklich absolut nichts enthalten außer den Text, den wir reinspeichern wollten. Damit der Computer auch was davon hat, hat man verschiedene Auszeichnungssprachen (markup) sich ausgedacht, um Texte so zu kennzeichnen, dass der Computer versteht was dort passiert. Zum Beispiel HTML, wo wir sagen das hier ist der Titel der Seite, das hier ist eine Überschrift und so weiter. Oder JSON, wie es der RPG Maker MV verwendet. Das hier zum Beispiel ist aus der Datei Items.json eines RPG Maker MV Projekts:

Json Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
	"id" : 1,
	"animationId" : 41,
	"consumable" : true,
	"damage" : {
		"critical" : false,
		"elementId" : 0,
		"formula" : "0",
		"type" : 0,
		"variance" : 20
	},
	"description" : "",
	"effects" : [
		{
			"code" : 11,
			"dataId" : 0,
			"value1" : 0,
			"value2" : 500
		}
	],
	"hitType" : 0,
	"iconIndex" : 176,
	"itypeId" : 1,
	"name" : "Trank",
	"note" : "",
	"occasion" : 0,
	"price" : 50,
	"repeats" : 1,
	"scope" : 7,
	"speed" : 0,
	"successRate" : 100,
	"tpGain" : 0
}

Wir sehen hier ein Item und sowohl der Computer als auch wir Menschen können in etwa verstehen, was hier für Informationen gespeichert sind.

Der Nachteil einer textuellen Representation ist, dass es in den meisten Fällen mehr Speicherplatz belegt, als eine binäre Speicherung der selben Informationen.

Dafür sind textuelle Formate wie HTML, JSON oder XML programmgrenzenübergreifend bekannte Formate und viele Programme erlauben uns die Informationen zu betrachten oder zu bearbeiten. Beispielsweise könnt ihr wenn ihr den RPG Maker MV habt einfach mal die Database-Dateien mit eurem Browser öffnen. Funktioniert auch und ihr bekommt sie zwar etwas nüchterner dargestellt, aber es funktioniert zumindest. Eure Items.rxdata hingegen wird der Browser wohl nicht verstehen.

Wenn ihr mit euren Freunden gemeinsam an einem Projekt arbeitet und dabei git oder ähnliche Werkzeuge für das gemeinsame Arbeiten einsetzt könnt ihr euch freuen. Die textuellen Dateien werden voll unterstützt und ihr könnt euch direkt anzeigen lassen, was eure Freundin an der Item-Database geändert hat und ob ihr die Änderung übernehmen wollt.

Entwicklung schön und gut, aber man muss sich am Ende aber auch bewusst sein, dass dann auch beim Endnutzer textuelle Dateien ankommen. Wenn man nicht möchte, dass seine Spieldaten auf einfache Weise menschenlesbar zur Verfügung stehen muss sich dann für die Verteilung seines Spiels noch etwas überlegen. Eine Mischung wären dann gepackte Dateien. Beispielsweise sind die .jar-Dateien von Java ein auf ZIP basierendem Archiv-Format, wo aller Programmcode und Ressourcen wie Bilder zusammengepackt sind.

gepackte Dateien


Gepackte Dateien verbinden die Vor- und Nachteile aus zwei Welten: Als binäres Format sind sie in der Regel nicht so einfach versionierbar mit git. Dafür sind sie durch das Packen etwas kleiner und sie erlauben uns, unsere Datei aus mehreren anderen zusammen zu puzzlen, zum Beispiel aus textuellen Dateien.
LibreOffice und Words .docx-Dateien benutzen das zum Beispiel, um eingebettete Bilder mit in die Datei zu packen. Der tatsächliche Text des Dokuments ist in einer XML-Datei im Archiv enthalten.

Sollange wir uns noch selbst in der Spielentwicklung befinden, machen gepackte Dateien glaube ich nicht so viel Sinn, da wir mehr Übersicht und Möglichkeiten haben, wenn die Bestandteile bar herumliegen und leicht geändert werden können. Siehe Java mit seinen .jar-Dateien. Für die Verteilung des fertigen Spiels kann man dann schon wieder mehr draus machen. So hat zum Beispiel der RPG Maker XP ja ein gepacktes (und verschlüsseltes) Dateiformat .rgssad für die Verteilung der Spiele.

Eigene Dateiformate


Ich denke, wenn man gerne gemeinsames Arbeiten an einem Projekt erlauben wollen würde, aber nicht selber ein Programm schreiben möchte, dass die Unterschiede zwischen zwei Projekten ermittelt, sollte auf textuelle Dateien gehen. Man könnte auch überlegen einen Hybrid zu bauen, der sowohl das Projekt als textuelle Dateien, sowie auch als binäre Dateien exportieren kann.
Ich denke da wäre dann aber der RPG Maker XP bis VX Ace Weg nicht schlecht, zu erlauben am Ende das Projekt als gepackte Datei zur Verfügung zu stellen und bis dahin alles als textuelle Dateien zu speichern.

Wenn man auf der anderen Seite keinen Wert darauf legt, dass der Spielentwickler die Dateien außerhalb des eigenen Makers benutzt und lieber unkompliziert Spieldaten abspeichern und wieder laden möchte, der ist wohl mit Binärdateien besser bedient. Wenn ihr wilde Speicherplatzoptimierer seid, dann sowieso.

Hm ja - Playms Fazit: Es kommt darauf an... :3

Dieser Artikel wurde bereits 48 mal gelesen.


Kommentare (2)

  • 2

    Von ITgenie98 (Dienstag, 14. November 2017, 22:17)

    Eigentlich ist alles binär selbst text, er wird nur durch ein encoding zu text (ASCII, UTF-8, Unicode, etc) xD

    Das stichwort hier heißt Dateiformat. Z.b. hat eine Zip datei oder eine PNG datei ein genau festgelegtes format welches bit für welche information steht. Öffnest du diese dann natürlich in einem programm welches ein anderes format nutzt kommt es entweder zu fehlermeldungen (Bildbearbeitungsprogremme), oder das Programm öffnet sie aber spuckt nur unleserliche sachen aus (Notepad). Änderungen können dann natürlich zu ungewünschten ergebnissen führen oder die datei ganz beschädigen, sodass das urspungsprogramm diese nicht mer laden will. ^^

    Zu der frage mit dem Bild als txt öffnen: Ja das ginge, aber erwischt du das falsche zeichen / die falsche position, kann es gut sein das Paint / Photoshop oder jedes andere Bildprogramm sich einfach weigert es zu öffnen weil es "Ungültig" oder "Beschädigt" ist.

  • 1

    Von Josey (Samstag, 11. November 2017, 23:29)

    "Kippt schonmal die ganze Milchpackung ins Kakaopulver und macht es euch bequem"
    Da fühle ich mich doch sofort angesprochen XD
    Du hast es drauf, den Leser einzubeziehen ;D

    Sehr interessanter Text, ich hab mir noch nie Gedanken gemacht, wie genau das klappt. Wenn ich eine .rar oder .zip packe, wird dann alles binärt?
    Wenn ich ein Bild als .txt öffne und was ändere, sieht das Bild dann anders aus?

    Toller Eintrag! :D

Blog Navigation

Vorheriger Artikel

Playm träumt: Konfigurierbare Menüs

Von Playm (Sonntag, 22. Oktober 2017, 07:00)