32
GPG 1.10 간간간간 간간 간간 간간 Devrookie, http://cafe.naver.com/devrookie 간간간

[Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

  • Upload
    -

  • View
    3.026

  • Download
    2

Embed Size (px)

DESCRIPTION

데브루키스터디(http://cafe.naver.com/devrookie) 발표 자료

Citation preview

Page 1: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

GPG 1.10간단하고 빠른 비트 배열

Devrookie, http://cafe.naver.com/devrookie

박민근

Page 2: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

비트단위 연산을

빠르고 유용하게

사용할 수 있는 비트

배열 클래스의 소개

및 사용

Page 3: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

비트단위 연산이란 ?

Page 4: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

0 과 1 로 이루어진 1 비트 값들의 배열을 일종의 플래그 (true/false) 의 집합으로 사용하는 자료 구조 테크닉

Page 5: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

복수개의 플래그를

설정할 때 주로

유용하게 사용된다 .

Page 6: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

충돌 체크 유무알파 블렌딩 체크 컬링 제외픽킹 제외높이 체크 유무기타 등등 ... 쓸때는 졸라 많다 .

Page 7: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

기본적인 비트단위 연산

Page 8: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

비트 플래그의 정의// 일반 비트 연산을 사용할 때#define COLLISION_CHECK 0x00000001 // or 1#define NOT_PICKING 0x00000010 // or 2#define NOT_CULLING 0x00000100 // or 4#define LOVE_AGEBREAK 0x00001000 // or 8

// 쉬프트 연산을 사용할 때#define COLLISION_CHECK_SFT 0#define NOT_PICKING_SFT 1#define NOT_CULLING_SFT 2#define LOVE_AGEBREAK_SFT 3

Int nBitFlag; // 비트 플래그를 저장할 변수

Page 9: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

비트 플래그 ON// 비트 연산bBitFlag |= COLLISION_CHECK;

// 쉬프트 연산bBitFlag |= 1 << COLLISON_CHECK_SFT;

Page 10: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

비트 플래그 OFF// 비트 연산bBitFlag &= ~COLLISION_CHECK;

// 쉬프트 연산bBitFlag &= ~(1 << COLLISON_CHECK_SFT);

Page 11: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

비트 플래그 사용

if(bBitFlag & COLLISION_CHECK){

플래그가 켜져있으면 할 행동}

Page 12: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

비트 단위 연산의 장점

Page 13: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

자료 효율성Int 형 1 개로 (4byte) 로 32 개의

플래그를중복하여 설정할 수 있다 . (bool 형의 크기는 1byte. 4byte 로는 4 개의 플래그만 설정 가능하다 )성능비트 단위의 연산은 수행 속도가 빠르다 .

Page 14: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

비트 단위 연산의 단점

Page 15: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

프로그래머의 실수에 따른 에러 가능성이 크다

컴퓨터의 WORD 크기에 의존적이다 .

Page 16: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

커스텀비트 배열

Page 17: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

• BitArray : 간단한 1차원 비트 배열

• BitArray2D : 2 차원 비트 배열

• TwoBitArray : 0~3 까지의 정수값을 원소로하는 2 비트 배열

Page 18: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

• 명료한 구문 검사• 이식성• 범위 검사• Const 의 적절한 사용• 고성능

Page 19: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

STL 비트셋VS

비트 배열

Page 20: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

STL 비트셋 비트 배열• STL 의 비트 배열은 기능이

풍부하다

• 많은 컴파일러에서 매우 복잡하게 구현되어 있음

• 확장하거나 수정하기가 대단히 어렵다

• C++ 표준들에 의존하는데 그런 것들을 지원하지 않는 컴파일러도 존재한다 .

• 비트 배열 클래스는 상대적으로 간단하다

• 기존 코드와 통합이 쉽다

• 게임 개발에 유용한 추가 기능을 지원한다

• Endian 에 독립적이다

• 확장 및 수정이 용이하다

Page 21: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

BitArray

Page 22: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

• 동적인 배열 크기 조정

• 추가적인 연산자 제공 (ex. AllBits-

False() )

• 표준적인 비트 연산자 제공 (&, |, ^,

&=, |=. ^=, ~)

• Shift 연산자는 지원하지 않는다 .

Page 23: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

• 빠른 속도를 위해서 , 생성시 초기화

하지 않는다 . (Clear() 메서드 )

• WORD 하나에 들어갈 정도의 크기의

배열은 추가 메모리를 할당하지 않는다 .

• 내부는 Proxy 클래스를 사용하여

구현된다 .

Page 24: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

비트 배열의사용

Page 25: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

// 플래그 설정BitArray bits(32);bits[10] = true;

bool val = bits[10];일반적인 배열 사용하듯이 사용하면 된다 !

직관적이다 !

Page 26: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

BitArray2D

Page 27: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

BitArray2D bits(10, 20);

Bits[3][4] = true;

Page 28: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

다른 2 차원 배열과 거의 동등한

방식으로 작동한다 .

1 차원 배열첨자 연산자는 ArrayProxy

를 반환한다 .

따라서 BitArray2D 의 행은 BitArray 로

취급할 수 없다 .

Page 29: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

TwoBitArray

Page 30: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

2 비트 값들의 배열을 제공한다 .

조금만 수정하면 3 비트 , 4

비트등으로 확장 가능

더 많은 플래그 값을 지원하는

아주 편리한 수단을 제공한다 .

Page 31: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

응용

Page 32: [Gpg1권 박민근] 1.10 간단하고 빠른 비트 배열

• 캐릭터 및 오브젝트의 상태 플래그

• 렌더링 플래그

• 2 차원 , 3 차원 타일맵에서 맵

상태 정보 플래그

• 스트림 저장 / 로드 기능 추가