Poco y gran endianness en los juegos.

16

¿Tenemos que preocuparnos por las órdenes de bytes en el proceso de programación de un juego? ¿Las consolas de juegos usan diferentes órdenes de bytes?

saadtaame
fuente
1
¿Le preocupa un proyecto específico en el que está trabajando en este momento o solo en general? Principalmente, si está escribiendo un juego para una consola, es probable que esté utilizando un conjunto de herramientas bien documentadas como XNA y la entrada y salida se cubrirán en su documento.
wolfdawn
44
Si está preocupado por esto, realmente recomiendo La falacia del orden de bytes de Rob Pike : tratar de preocuparse por el orden de los bytes a menudo le causa más problemas que simplemente ignorarlo y escribir código verdaderamente independiente de endian.
1
Es una buena lectura, pero Rob está demostrando que puede obtener lecturas simplificadas a expensas de necesitar escrituras más complejas. Si no eres el que escribe, ¡genial!
Kylotan

Respuestas:

14

Si está escribiendo código de red, a menudo es algo con lo que tiene que lidiar, sí.

También es posible que el orden de bytes en un formato de archivo no sea el que usa su plataforma, por lo que a veces también es importante.

Kylotan
fuente
8

¿Tienes que preocuparte por eso? Probablemente no. La gran mayoría de la programación de juegos estará a un nivel tal que el endianness se abstraiga. Incluso en redes, seguramente usará una biblioteca para protocolos de red. Es bueno que lo sepas, pero dudo que te encuentres con un problema.

MichaelHouse
fuente
5

La mayoria del tiempo, no.

La endianess generalmente se abstrae en los módulos de alto nivel de un motor de juego, y no tienes que preocuparte por eso a diario. Si no está abstraído, entonces el motor tiene un problema grave y debe solucionarse, porque este no es el tipo de detalles por los que debería preocuparse al hacer un juego.

Sin embargo, si está trabajando en algunas partes de bajo nivel de un motor multiplataforma C / C ++, es posible que deba lidiar con él. Las tres consolas de la generación actual usan una arquitectura PowerPC, que es big-endian, mientras que la arquitectura x86 utilizada en PC es little-endian. Entonces, si está trabajando en algún código que lee bytes sin procesar de algún lugar para colocarlos en estructuras de datos (serialización binaria, redes ...), sí, tendrá que lidiar con eso.

Por ejemplo, en C / C ++, es común ver este tipo de intercambio de bytes en acción (no probado, correcciones de bienvenida):

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

Una vez más, esto está bien en el código de bajo nivel, pero esto no debería ser algo usado en todas partes.

Laurent Couvidou
fuente
3

Depende de las plataformas a las que apunta. Por ejemplo, creo que la PS3 es grande, así que si ese es uno de tus objetivos, entonces es algo que debes tener en cuenta, sí.

En el espacio de la computadora doméstica, los "Big 3" (Windows, Linux, Mac) son exclusivos, o casi exclusivamente, en las arquitecturas Intel x86 / x64 en estos días, por lo que las preocupaciones de resistencia ya no son relevantes.

Maximus Minimus
fuente
¿Ya no es relevante? En mi experiencia (2-3 juegos en un par de empresas y 7 años, ambos MMO ... tan anecdóticos en lugar de estadísticamente válidos) cada uno de los mercados de PS y Xbox son aproximadamente el doble del tamaño del mercado de Windows, las Mac eran una pequeña fracción de Windows, y Linux era notablemente más pequeño que eso. A menos que su juego simplemente no pueda funcionar en una consola, está dejando el 80% de sus ganancias en el suelo al adherirse a las PC. El código cross-endian también significa que sus servidores pueden estar en máquinas completamente diferentes a sus clientes (por ejemplo: cada juego de consola cliente-servidor).
Mark Storer
@ MarkStorer: creo que debes volver a leer lo que realmente escribí.
Maximus Minimus