Piccola e grande endianness nei giochi


16

Dobbiamo preoccuparci degli ordini di byte nel processo di programmazione di un gioco? Le console di gioco utilizzano ordini di byte diversi?


1
Sei preoccupato per un progetto specifico a cui stai lavorando in questo momento o semplicemente in generale? Per lo più, se stai scrivendo un gioco per una console, probabilmente utilizzerai un set di strumenti ben documentati come XNA e input e output saranno trattati nel suo documento.
Wolfdawn,

4
Se sei preoccupato per questo, consiglio vivamente L'errore di ordine byte di Rob Pike - cercare di preoccuparsi dell'ordine di byte spesso ti mette più nei guai che ignorarlo e scrivere codice veramente indipendente.

1
È una buona lettura, ma Rob sta dimostrando che è possibile ottenere letture semplificate a spese della necessità di scritture più complesse. Se non sei tu a scrivere, fantastico!
Kylotan,

Risposte:


14

Se stai scrivendo codice di rete, questo è spesso qualcosa che devi affrontare, sì.

Inoltre è possibile che l'ordinamento dei byte in un formato di file non sia quello utilizzato dalla tua piattaforma, quindi a volte è importante anche lì.


8

Devi preoccupartene? Probabilmente no. La stragrande maggioranza della programmazione di gioco sarà a un livello tale che l'endianità viene sottratta. Anche nella rete, quasi sicuramente utilizzerai una libreria per i protocolli di rete. È un bene che tu ne sia consapevole, ma dubito che potresti incorrere in un problema.


5

Il più delle volte no.

L'endianess viene solitamente sottratta ai moduli di alto livello di un motore di gioco e non devi preoccuparti di questo ogni giorno. Se non è astratto, il motore ha un problema serio e dovrebbe essere risolto, perché questo non è il tipo di dettagli di cui dovresti preoccuparti quando crei un gioco.

Tuttavia, se stai lavorando su alcune parti di basso livello di un motore multipiattaforma C / C ++, potresti doverlo gestire. Tutte e tre le console della generazione attuale usano un'architettura PowerPC, che è big-endian, mentre l'architettura x86 utilizzata su PC è little-endian. Quindi, se stai lavorando su un codice che legge byte grezzi da qualche parte per inserirli in strutture di dati (serializzazione binaria, rete ...), sì, dovrai occupartene.

Ad esempio, in C / C ++, è comune vedere questo tipo di scambio di byte in azione (non testato, correzioni di benvenuto):

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

Ancora una volta, questo è OK nel codice di basso livello, ma non dovrebbe essere usato ovunque.


3

Dipende dalle piattaforme a cui ti rivolgi. Ad esempio, credo che la PS3 sia un grande end-end, quindi se questo è uno dei tuoi obiettivi allora è qualcosa di cui devi essere consapevole, sì.

Nello spazio dei computer di casa i "Big 3" (Windows, Linux, Mac) sono tutti esclusivamente, o quasi, eccellentemente, su architetture Intel x86 / x64 al giorno d'oggi, quindi i problemi di endienness non sono più rilevanti.


Non è più pertinente? Nella mia esperienza (2-3 giochi in una coppia di società e 7 anni, entrambi MMO ... quindi aneddotici piuttosto che statisticamente validi) ciascuno dei mercati PS e Xbox sono circa il doppio delle dimensioni del mercato Windows, i Mac erano una piccola frazione di Windows e Linux era notevolmente più piccolo di quello. A meno che il tuo gioco non riesca semplicemente a funzionare su una console, stai lasciando l'80% dei tuoi guadagni sul terreno attenendosi ai PC. Il codice cross-endian significa anche che i tuoi server possono trovarsi su macchine completamente diverse rispetto ai tuoi client (es: ogni gioco console client-server di sempre).
Mark Storer,

@MarkStorer - Penso che devi rileggere ciò che ho effettivamente scritto.
Maximus Minimus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.