Kleine und große Endianness in Spielen

16

Müssen wir uns beim Programmieren eines Spiels um die Reihenfolge der Bytes kümmern? Verwenden Spielekonsolen unterschiedliche Bytereihenfolgen?

Saadtaame
quelle
1
Sind Sie besorgt über ein bestimmtes Projekt, an dem Sie gerade arbeiten, oder nur allgemein? Wenn Sie ein Spiel für eine Konsole schreiben, werden Sie wahrscheinlich einige gut dokumentierte Tools wie XNA verwenden, und die Ein- und Ausgabe wird in diesem Dokument behandelt.
Wolfdawn
4
Wenn Sie sich darüber Sorgen machen, empfehle ich Rob Pikes Fehlschluss in der Bytereihenfolge. Wenn Sie sich Gedanken über die Bytereihenfolge machen, bekommen Sie häufig mehr Probleme als nur das Ignorieren und das Schreiben von wirklich endianunabhängigem Code.
1
Es ist eine gute Lektüre, aber Rob zeigt, dass Sie vereinfachte Lesevorgänge erhalten können, wenn Sie komplexere Schreibvorgänge benötigen. Wenn Sie nicht derjenige sind, der schreibt, großartig!
Kylotan,

Antworten:

14

Wenn Sie Netzwerkcode schreiben, müssen Sie sich häufig damit befassen, ja.

Es ist auch möglich, dass die Bytereihenfolge in einem Dateiformat nicht dem entspricht, was Ihre Plattform verwendet. Daher ist dies manchmal auch von Bedeutung.

Kylotan
quelle
8

Musst du dir darüber Sorgen machen? Wahrscheinlich nicht. Die überwiegende Mehrheit der Spielprogramme wird auf einer solchen Ebene sein, dass die Endianität abstrahiert wird. Selbst in Netzwerken werden Sie mit ziemlicher Sicherheit eine Bibliothek für Netzwerkprotokolle verwenden. Es ist gut, dass Sie sich dessen bewusst sind, aber ich bezweifle, dass Sie damit auf ein Problem stoßen würden.

MichaelHouse
quelle
5

Meistens nein.

Endianess wird normalerweise in den High-Level-Modulen einer Game-Engine entfernt, und Sie müssen sich nicht täglich darum kümmern. Wenn es nicht abstrahiert ist, hat die Engine ein ernstes Problem und sollte behoben werden, da dies nicht die Art von Details sind, über die Sie sich beim Erstellen eines Spiels Gedanken machen sollten.

Wenn Sie jedoch an Teilen einer C / C ++ - Engine mit mehreren Plattformen auf niedriger Ebene arbeiten, müssen Sie sich möglicherweise damit befassen. Alle drei Konsolen der aktuellen Generation verwenden eine PowerPC-Architektur, bei der es sich um Big-Endian handelt, während es sich bei der auf PCs verwendeten x86-Architektur um Little-Endian handelt. Wenn Sie also an Code arbeiten, der unformatierte Bytes liest, um sie in Datenstrukturen einzufügen (binäre Serialisierung, Vernetzung ...), müssen Sie sich damit befassen.

In C / C ++ ist es beispielsweise üblich, diese Art von Byte-Austausch in Aktion zu sehen (nicht getestet, Korrekturen werden begrüßt):

// Assume bytes comes ordered as big-endian
u16 u16FromBytes(void* data)
{
#if BIG_ENDIAN
    return (u16(data[0]) << 8) + u16(data[1]);
#else // LITTLE_ENDIAN
    return (u16(data[1]) << 8) + u16(data[0]);
#endif
}

Wieder ist dies in Code auf niedriger Ebene in Ordnung, dies sollte jedoch nicht überall verwendet werden.

Laurent Couvidou
quelle
3

Das hängt von den Plattformen ab, auf die Sie abzielen. Ich glaube zum Beispiel, dass die PS3 ein Big-End ist. Wenn das also eines Ihrer Ziele ist, müssen Sie sich dessen bewusst sein, ja.

Im Bereich der Heimcomputer sind die "Big 3" (Windows, Linux, Mac) heutzutage ausschließlich oder fast ausschließlich auf Intel x86 / x64-Architekturen installiert, sodass Endienheitsbedenken keine Rolle mehr spielen.

Maximus Minimus
quelle
Nicht mehr relevant? Nach meiner Erfahrung (2-3 Spiele über ein paar Unternehmen und 7 Jahre, beide MMOs ... also eher anekdotisch als statistisch gültig) ist jeder der PS- und Xbox-Märkte etwa doppelt so groß wie der Windows-Markt, Macs waren ein kleiner Bruchteil von Windows, und Linux war deutlich kleiner als das. Wenn Ihr Spiel nicht einfach auf einer Konsole funktioniert, bleiben 80% Ihres Gewinns auf dem Boden, wenn Sie sich an PCs halten. Cross-Endian-Code bedeutet auch, dass sich Ihre Server auf völlig anderen Rechnern befinden können als Ihre Clients (zum Beispiel: jedes Client-Server-Konsolenspiel, das jemals gespielt wurde).
Mark Storer
@MarkStorer - Ich denke, Sie müssen noch einmal lesen, was ich tatsächlich geschrieben habe.
Maximus Minimus