Wann muss ich mich um Endianness sorgen?

8

Ich habe unzählige Hinweise auf Endianess gesehen und was es bedeutet. Ich habe keine Probleme damit ... Mein Coding-Projekt ist jedoch ein einfaches Spiel, das unter Linux und Windows auf Standard-Gamer-Hardware läuft. Muss ich mich in diesem Fall um Endianness sorgen? Wann sollte ich mich darum kümmern müssen? Mein Code ist einfach C und SDL + GL, die einzigen komplexen Daten sind grundlegende Mediendateien (png + wav + xm) und die Spieldaten sind meist Strings, Integer Booleans (für Flags und solche) und statische Größe Arrays. Bisher hat noch kein Benutzer Probleme gehabt, also frage ich mich, ob das Hinzufügen von Prüfungen notwendig ist (wird später gemacht, aber es gibt dringendere Probleme IMO).

    
GAKOKO 06.02.2010, 14:40
quelle

7 Antworten

2

Wenn Sie einen PC mit "Standard-Gamer-Hardware" meinen, müssen Sie sich nicht um Endianness sorgen, da es auf x86 / x64 immer ein kleines Endian sein wird. Wenn Sie das Projekt jedoch auf andere Architekturen portieren möchten, sollten Sie es unabhängig von der Endanord- nung entwerfen.

    
AndiDog 06.02.2010, 14:48
quelle
5

Die Zeiten, in denen Sie sich Gedanken über Endianess machen müssen:

  • Sie senden binäre Daten zwischen Maschinen oder Prozessen (über ein Netzwerk oder eine Datei). Wenn die Maschinen unterschiedliche Byte-Reihenfolge haben oder das verwendete Protokoll eine bestimmte Byte-Reihenfolge angibt (was es sollte), müssen Sie mit Endianess umgehen.
  • Sie haben Code, der auf Speicher durch Zeiger verschiedener Typen zugreift (sagen Sie, dass Sie auf eine Variable unsigned int über eine char* zugreifen).

Wenn Sie diese Dinge tun, haben Sie es mit der Byte-Reihenfolge zu tun, ob Sie es wissen oder nicht - es könnte sein, dass Sie damit umgehen, indem Sie annehmen, dass es so oder so geht, solange Ihr Code funktioniert muss sich nicht mit einer anderen Plattform auseinandersetzen.

In ähnlicher Weise müssen Sie sich in den gleichen Fällen und aus ähnlichen Gründen im Allgemeinen mit Ausrichtungsproblemen befassen. Noch einmal, Sie können damit umgehen, indem Sie nichts tun und alles funktioniert gut, weil Sie nicht plattformübergreifend überschreiten müssen (die zurückkommen kann, um Sie auf die Straße beißen, wenn das eine Anforderung wird).

    
Michael Burr 06.02.2010 19:51
quelle
1

Sie müssen sich nur darum kümmern, wenn Ihr Spiel auf verschiedenen Hardwarearchitekturen ausgeführt werden muss. Wenn Sie sicher sind, dass es immer auf Intel-Hardware läuft, dann können Sie es vergessen. Wenn es unter Linux läuft, verwenden viele Leute andere Architekturen als Intel und Sie müssen vielleicht darüber nachdenken.

    
Cromulent 06.02.2010 14:46
quelle
1

Verteilen Sie Ihr Spiel im Quellcode?

Wenn Sie Ihr Spiel nur als Binärdatei ausgeben, wissen Sie genau, auf welche Prozessorfamilien Ihr Spiel läuft. Auch die Mediendateien, sind sie Benutzer generiert (möglicherweise über einen Level-Editor) oder sind sie wirklich nur von Ihnen selbst geliefert werden?

Wenn es sich um eine wirklich geschlossene Umgebung handelt (Ihre Distributions-Binärdateien und die Spiel-Assets sind nicht dazu gedacht, angepasst zu werden), dann kennen Sie Ihre eigenen Risiken für Endianer und ich persönlich würde mich nicht damit täuschen lassen.

Wenn Sie jedoch entweder die Quelle verteilen und / oder hoffen, dass die Leute ihr Spiel anpassen, haben Sie ein potentielles Problem. Aber mit den meisten Desktop / Laptop-Computern, die heutzutage auf x86 umstellen, würde ich denken, dass dies eine abnehmende Sorge ist.

    
Jason Whitehorn 06.02.2010 14:47
quelle
1

Immer wenn Sie Daten aus einem Netzwerk empfangen / übertragen, denken Sie daran, in die / aus der Netzwerk- und Host-Byte-Reihenfolge zu konvertieren. Die C-Funktionen htons , htonl usw. oder Equivalents in Ihrer Sprache sollten hier verwendet werden.

Immer wenn Sie Multibyte-Werte (wie UTF-16-Zeichen oder 32-Bit-Inte) aus einer Datei lesen, da diese Datei möglicherweise auf einem System mit unterschiedlicher Endiannität entstanden ist. Wenn die Datei UTF 16 oder 32 ist, hat sie wahrscheinlich eine BOM (Byte-Order Mark). Andernfalls muss das Dateiformat in irgendeiner Weise Endianness angeben.

    
gnud 06.02.2010 14:54
quelle
0

Das Problem tritt bei der Vernetzung und beim Senden der Daten auf, wenn Sie auf verschiedenen Prozessoren herumspielen, da die verschiedenen Prozessoren die Daten möglicherweise unterschiedlich im Speicher ablegen.

    
Rob 06.02.2010 14:48
quelle
0

Ich glaube, Power PC hat die entgegengesetzte Endianz der Intel-Boards. Könnte in der Lage sein, eine Routine zu haben, die die Endianz abhängig von der Architektur setzt? Ich bin mir nicht sicher, ob Sie tatsächlich sagen können, was die Hardware-Architektur im Code ist ... vielleicht ist jemand schlauer, dann kennt ich die Antwort auf diese Frage.

Nun in Bezug auf Ihre Aussage "Standard" Gamer H / W würde ich sagen, dass Sie in der Regel Consumer Off the Shelf-Lösungen betrachten werden, sind wirklich, was die meisten Standard-Gamer verwendet, so dass Sie fast zu Mit Sicherheit den gleichen Endian auf der ganzen Linie bekommen. Ich bin sicher, dass jemand mir nicht zustimmen wird, aber das ist mein $ .02

Ha ... Ich habe gerade bemerkt, dass es auf der rechten Seite einen Link gibt, der sich auf den obigen Vorschlag bezieht.

Finden Sie Endianness durch ein ac-Programm

    
onaclov2000 06.02.2010 15:11
quelle

Tags und Links