스터디 그룹

스터디 한 것

게임엔진 아키텍처 3판 3장 - “게임을 위한 소프트웨어 엔지니어링 기초” 중

데이터, 코드, 메모리 레이아웃

수 표현

부동소수점 표현법

기본적인 데이터 타입

C/C++는 기본적으로 여러가지 데이터 타입을 지원. 표준 가이드라인이 있지만, 하드웨어의 최적 성능을 위해 컴파일러에 따라 어느정도 변화를 주기 도 함.

  • char : 보통은 8bit.
  • int : 대상 플랫폼에서 가장 효율적으로 처리 할 수 있는 크기의 부호있는 정수 타입. 보통은 32bit.
  • short : int 보다 작은 수. 보통 16bit.
  • long : int 와 같거나 더 클 수도 있음. 32bit 아니면 64bit.
  • float : 대부분 컴파일러에서 32bit IEEE-754 부동소수를 사용.
  • double : 2배 정밀도 IEEE-754 부동소수.
  • bool : true/false 표현. 크기는 컴파일러, 하드웨어마다 다름. 1bit 로 하지는 않음. 8bit 이거나 32bit 이거나.
이식 가능한 크기 타입

특정 변수가 정확히 몇 bit 로 되어 있는지 알아야만 할 때가 있음.

C++11 나오기 전에는 컴파일러가 제공하는 이식성 없는 크기의 타입을 쓸 수밖에 없었음.

`VS 컴파일러에서 제공하는 __int8, __int16, __int32, __int64 같은 것`

컴파일러마다 차이가 존재해서 거의 모든 게임엔진은 이식성을 위해 직접 자신의 크기 타입을 정의.

`너티독은 F32, U8~64, I8~64, U32F, I32F`
<cstdint>

C++11 표준 라이브러리는 표준화 된 크기의 정수 타입을 도입. <stdint> 헤더에 선언되어 있음.

  • std::int8_t, std::int16_t, std::int32_t, std::int64_t
  • std::uint8_t, std::uint16_t, std: :uint32_t, std::uint64_t

멀티바이트 데이터와 엔디언

1byte(8bit) 보다 큰 값들을 멀티바이트 값이라고 함.

정수 4660 = 0x1234 는 최상위 바이트(MSB:Most Significant Byte) 0x12 와 최하위 바이트(LSB:Least Significant Byte) 0x34 이렇게 2byte.

32bit 0xABCD1234 는 MSB 가 0xAB, LSB 가 0x34.

멀티바이트 정수가 메모리에 저장되는 방식은 두 가지. 마이크로프로세서 마다 다를 수 있음.

  • 리틀 엔디언
    • LSB 가 MSB 보다 낮은 메모리 주소에 저장.
    • 0xABCD1234 는 낮은 바이트 순서에 따라 0x34, 0x12, 0xCD, 0xAB 로 저장.
  • 빅 엔디언
    • MSB 가 LSB 보다 낮은 메모리 주소에 저장.
    • 0xABCD1234 는 낮은 바이트 순서에 따라 0xAB, 0xCD, 0x12, 0x34 로 저장.

게임프로그래머는 이 부분을 신경 써야 함.

개발 시에는 리틀 엔디언인 인텔 계열 에서 하는데, 게임은 빅 엔디언인 기기에서 돌아가는 경우가 있음.

데이터 파일 로드 시 순서가 달라짐. 0xABCD1234 가 0x3412CDAB 로 로드 됨.

이 문제를 해결하는 방법은 적어도 두 가지.

  1. 모든 데이터 파일을 텍스트로 저장, 멀티바이트 숫자는 한 숫자가 한 바이트가 되게 십진수 형태로 저장. 디스크 용량 관점에서는 비효율. 적어도 제대로 돌아가기는 함.
  2. 툴에서 디스크에 저장하기 전 엔디언을 바꾸게 하는 방법. 무조건 타겟 디바이스를 따르게 하는 방법.