Mała i duża endianizm w grach

16

Czy musimy martwić się kolejnością bajtów podczas programowania gry? Czy konsole do gier używają różnych kolejności bajtów?

saadtaame
źródło
1
Czy martwi Cię konkretny projekt, nad którym obecnie pracujesz, czy ogólnie? Przeważnie, jeśli piszesz grę na konsolę, prawdopodobnie będziesz używać dobrze udokumentowanego zestawu narzędzi, takich jak XNA, a dane wejściowe i wyjściowe zostaną omówione w tym dokumencie.
wolfdawn
4
Jeśli martwisz się o to, naprawdę polecam błąd Roba Pike'a . Błędność kolejności bajtów - próba martwienia się o kolejność bajtów często sprawia ci więcej kłopotów niż tylko ignorowanie go i pisanie naprawdę niezależnego od Endian kodu.
1
To dobra lektura, ale Rob pokazuje, że możesz uzyskać uproszczone odczyty kosztem bardziej skomplikowanych zapisów. Jeśli to nie ty piszesz, świetnie!
Kylotan

Odpowiedzi:

14

Jeśli piszesz kod sieci, często masz do czynienia z tak, tak.

Możliwe jest również, że porządkowanie bajtów w formacie pliku nie jest tym, czego używa Twoja platforma, więc czasem też ma to znaczenie.

Kylotan
źródło
8

Czy musisz się tym martwić? Prawdopodobnie nie. Zdecydowana większość programów gier będzie na takim poziomie, że endianizm zostanie oderwany. Nawet w sieci prawie na pewno będziesz używać biblioteki do protokołów sieciowych. Dobrze, że zdajesz sobie z tego sprawę, ale wątpię, byś miał z tym problem.

MichaelHouse
źródło
5

Przez większość czasu nie.

Endianess jest zwykle wyabstrahowany w modułach wysokiego poziomu silnika gry i nie musisz się o to martwić codziennie. Jeśli nie jest abstrakcyjny, silnik ma poważny problem i powinien zostać naprawiony, ponieważ nie są to takie szczegóły, o które powinieneś się martwić podczas tworzenia gry.

Jeśli jednak pracujesz nad niskopoziomowymi częściami silnika wieloplatformowego C / C ++, być może będziesz musiał sobie z tym poradzić. Wszystkie trzy konsole obecnej generacji wykorzystują architekturę PowerPC, która jest big-endianem, podczas gdy architektura x86 używana na PC jest little-endianem. Więc jeśli pracujesz nad kodem, który odczytuje gdzieś surowe bajty, aby umieścić je w strukturach danych (serializacja binarna, sieci ...), tak, będziesz musiał sobie z tym poradzić.

Na przykład w C / C ++ często zdarza się, że tego rodzaju zamiana bajtów w akcji (nie testowana, mile widziane poprawki):

// 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
}

Po raz kolejny jest to OK w kodzie niskiego poziomu, ale nie powinno to być wszędzie używane.

Laurent Couvidou
źródło
3

To zależy od platform, na które celujesz. Na przykład uważam, że PS3 to wielki endien, więc jeśli jest to jeden z twoich celów, musisz o tym wiedzieć, tak.

W domowej przestrzeni komputerowej „Big 3” (Windows, Linux, Mac) są obecnie wyłącznie, lub wszystkie, ale znakomicie, na architekturze Intel x86 / x64, więc obawy dotyczące endienity nie są już istotne.

Maximus Minimus
źródło
Już nieistotny? Z mojego doświadczenia (2-3 gry w kilku firmach i 7 lat, obie gry MMO ... więc raczej anegdotyczne niż statystycznie ważne) każdy z rynków PS i Xbox jest około dwa razy większy niż rynek okien, komputery Mac były niewielkim ułamkiem okien, a Linux był wyraźnie mniejszy. O ile twoja gra po prostu nie może działać na konsoli, 80% zysków pozostawiasz na ziemi, pozostając na PC. Kod cross-endian oznacza również, że twoje serwery mogą znajdować się na zupełnie innych komputerach niż klienci (np. Każda gra konsolowa klient-serwer).
Mark Storer
@ MarkStorer - Myślę, że musisz ponownie przeczytać to, co napisałem.
Maximus Minimus