Pouco e grande endianness em jogos


16

Precisamos nos preocupar com ordens de bytes no processo de programação de um jogo? Os consoles de jogos usam ordens de bytes diferentes?


11
Você está preocupado com um projeto específico no qual está trabalhando agora ou apenas em geral? Principalmente, se você estiver escrevendo um jogo para um console, provavelmente usará um conjunto de ferramentas bem documentado, como XNA, e as entradas e saídas serão abordadas em seu documento.
Lobo2

4
Se você está preocupado com isso, eu realmente recomendo a falácia da ordem de bytes de Rob Pike - tentar se preocupar com a ordem de bytes geralmente causa mais problemas do que apenas ignorá-la e escrever um código independente de endian.

11
É uma boa leitura, mas Rob está mostrando que você pode obter leituras simplificadas à custa de precisar de gravações mais complexas. Se você não é quem está escrevendo, ótimo!
Kylotan # 26/12

Respostas:


14

Se você está escrevendo um código de rede, isso geralmente é algo com o qual você precisa lidar, sim.

Também é possível que a ordem de bytes em um formato de arquivo não seja o que sua plataforma usa, portanto, às vezes, isso também é importante.


8

Você precisa se preocupar com isso? Provavelmente não. A grande maioria da programação de jogos estará em tal nível que o endianness será abstraído. Mesmo em redes, você quase certamente usará uma biblioteca para protocolos de rede. É bom que você esteja ciente disso, mas duvido que você tenha um problema com isso.


5

Na maior parte do tempo, não.

Endianess geralmente é abstraída nos módulos de alto nível de um mecanismo de jogo, e você não precisa se preocupar com isso diariamente. Se não for abstraído, o mecanismo tem um problema sério e deve ser corrigido, porque esse não é o tipo de detalhes com o qual você deve se preocupar ao criar um jogo.

No entanto, se você estiver trabalhando em algumas partes de baixo nível de um mecanismo multiplataforma C / C ++, poderá ter que lidar com isso. Todos os três consoles de geração atual usam uma arquitetura PowerPC, que é big-endian, enquanto a arquitetura x86 usada no PC é little-endian. Portanto, se você estiver trabalhando em algum código que lê bytes brutos de algum lugar para colocá-los em estruturas de dados (serialização binária, rede ...), sim, você terá que lidar com isso.

Por exemplo, em C / C ++, é comum ver esse tipo de troca de bytes em ação (não testado, recebendo correções):

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

Mais uma vez, isso é bom no código de baixo nível, mas isso não deve ser algo usado em todos os lugares.


3

Depende das plataformas que você está segmentando. Por exemplo, acredito que o PS3 é de grande porte, por isso, se esse é um dos seus objetivos, é algo que você precisa conhecer, sim.

No espaço dos computadores domésticos, os "Big 3" (Windows, Linux, Mac) são exclusivos ou praticamente excepcionais nas arquiteturas Intel x86 / x64 hoje em dia, de modo que as preocupações com a durabilidade não são mais relevantes.


Não é mais relevante? Na minha experiência (2-3 jogos em duas empresas e sete anos, ambos os MMOs ... tão anedóticos em vez de estatisticamente válidos) cada um dos mercados de PS e Xbox tem o dobro do tamanho do mercado de janelas, os Macs eram uma pequena fração do Windows, e o Linux era visivelmente menor que isso. A menos que seu jogo simplesmente não funcione em um console, você estará deixando 80% do seu lucro no campo, aderindo aos PCs. O código cross-endian também significa que seus servidores podem estar em máquinas completamente diferentes dos seus clientes (por exemplo: todos os jogos de console cliente-servidor de todos os tempos).
Mark Storer

@ MarkStorer - acho que você precisa reler o que realmente escrevi.
Maximus Minimus
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.