게임에서 작고 큰 엔디안


16

게임 프로그래밍 과정에서 바이트 순서에 대해 걱정해야합니까? 게임 콘솔은 다른 바이트 순서를 사용합니까?


1
현재 또는 일반적으로 진행중인 특정 프로젝트에 대해 걱정하고 있습니까? 대부분 콘솔 용 게임을 작성하는 경우 XNA와 같은 잘 문서화 된 도구 세트를 사용하게되며 입력 및 출력은 해당 문서에서 다룰 것입니다.
wolfdawn

4
이 문제가 걱정된다면 Rob Pike의 바이트 순서 오류를 권장합니다 . 바이트 순서 에 대해 걱정하려고하면 종종 무시하고 엔디 언 독립적 코드를 작성하는 것보다 더 많은 문제가 발생합니다.

1
잘 읽었지만 Rob은 더 복잡한 쓰기가 필요하지만 간단한 읽기를 얻을 수 있음을 보여줍니다. 글을 쓰는 사람이 아니라면 훌륭합니다!
Kylotan

답변:


14

네트워킹 코드를 작성하는 경우에는 종종 처리해야합니다.

또한 파일 형식의 바이트 순서가 플랫폼에서 사용하는 것이 아닐 수도 있으므로 때로는 중요합니다.


8

당신은 그것에 대해 걱정해야합니까? 아마 아닐 것입니다. 게임 프로그래밍의 대다수는 엔디안이 추상화되는 수준에있을 것입니다. 네트워킹에서도 네트워킹 프로토콜을위한 라이브러리를 사용하게 될 것입니다. 잘 알고있는 것이 좋지만 문제가 발생한 것 같습니다.


5

대부분의 경우 아닙니다.

Endianess는 일반적으로 게임 엔진의 고급 모듈에서 추상화되며 매일 걱정하지 않아도됩니다. 추상화되지 않은 경우 엔진에 심각한 문제가 있으며 수정해야합니다. 게임을 만들 때 걱정해야 할 세부 정보가 아니기 때문입니다.

그러나 C / C ++ 다중 플랫폼 엔진의 일부 저수준 부분에서 작업하는 경우 처리해야 할 수도 있습니다. 3 개의 현재 세대 콘솔은 모두 빅 엔디안 인 PowerPC 아키텍처를 사용하는 반면 PC에서 사용되는 x86 아키텍처는 리틀 엔디안입니다. 따라서 원시 바이트를 어디서나 읽어 데이터 구조 (이진 직렬화, 네트워킹 ...)에 넣는 코드를 작성하는 경우 처리해야합니다.

예를 들어, C / C ++에서는 이런 종류의 바이트 스와핑이 작동하는 것을 보는 것이 일반적입니다 (테스트되지 않은 환영 수정).

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

다시 한 번, 이것은 저수준 코드에서 괜찮지 만 모든 곳에서 사용되는 것은 아닙니다.


3

타겟팅하는 플랫폼에 따라 다릅니다. 예를 들어, PS3는 빅 엔디안이라고 생각합니다. 만약 그것이 당신의 목표 중 하나라면, 당신이 알아야 할 것이 있습니다.

가정용 컴퓨터 공간에서 "Big 3"(Windows, Linux, Mac)은 요즘 인텔 x86 / x64 아키텍처에서 독점적으로 또는 전부 나 우수하지만, 엔디 엔 니스 문제는 더 이상 관련이 없습니다.


더 이상 관련이 없습니까? 내 경험 (두 회사와 7 년 동안 두 게임, 7 년 동안 두 MMO ... 통계적으로 유효하지는 않지만 일화 적) 각 PS 및 Xbox 시장은 Windows 시장 크기의 약 두 배이며 Mac은 작은 비율입니다. 윈도우의 수와 리눅스는 그보다 눈에 띄게 작았습니다. 게임이 단순히 콘솔에서 작동하지 않는 한, PC를 고수함으로써 수익의 80 %를 바닥에두고 있습니다. 크로스 엔디안 코드는 또한 서버가 클라이언트와 완전히 다른 시스템에있을 수 있음을 의미합니다 (예 : 모든 클라이언트-서버 콘솔 게임).
Mark Storer

@ MarkStorer-실제로 쓴 것을 다시 읽어야한다고 생각합니다.
Maximus Minimus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.