Upload
-
View
3.026
Download
2
Embed Size (px)
DESCRIPTION
데브루키스터디(http://cafe.naver.com/devrookie) 발표 자료
Citation preview
GPG 1.10간단하고 빠른 비트 배열
Devrookie, http://cafe.naver.com/devrookie
박민근
비트단위 연산을
빠르고 유용하게
사용할 수 있는 비트
배열 클래스의 소개
및 사용
비트단위 연산이란 ?
0 과 1 로 이루어진 1 비트 값들의 배열을 일종의 플래그 (true/false) 의 집합으로 사용하는 자료 구조 테크닉
복수개의 플래그를
설정할 때 주로
유용하게 사용된다 .
충돌 체크 유무알파 블렌딩 체크 컬링 제외픽킹 제외높이 체크 유무기타 등등 ... 쓸때는 졸라 많다 .
기본적인 비트단위 연산
비트 플래그의 정의// 일반 비트 연산을 사용할 때#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; // 비트 플래그를 저장할 변수
비트 플래그 ON// 비트 연산bBitFlag |= COLLISION_CHECK;
// 쉬프트 연산bBitFlag |= 1 << COLLISON_CHECK_SFT;
비트 플래그 OFF// 비트 연산bBitFlag &= ~COLLISION_CHECK;
// 쉬프트 연산bBitFlag &= ~(1 << COLLISON_CHECK_SFT);
비트 플래그 사용
if(bBitFlag & COLLISION_CHECK){
플래그가 켜져있으면 할 행동}
비트 단위 연산의 장점
자료 효율성Int 형 1 개로 (4byte) 로 32 개의
플래그를중복하여 설정할 수 있다 . (bool 형의 크기는 1byte. 4byte 로는 4 개의 플래그만 설정 가능하다 )성능비트 단위의 연산은 수행 속도가 빠르다 .
비트 단위 연산의 단점
프로그래머의 실수에 따른 에러 가능성이 크다
컴퓨터의 WORD 크기에 의존적이다 .
커스텀비트 배열
• BitArray : 간단한 1차원 비트 배열
• BitArray2D : 2 차원 비트 배열
• TwoBitArray : 0~3 까지의 정수값을 원소로하는 2 비트 배열
• 명료한 구문 검사• 이식성• 범위 검사• Const 의 적절한 사용• 고성능
STL 비트셋VS
비트 배열
STL 비트셋 비트 배열• STL 의 비트 배열은 기능이
풍부하다
• 많은 컴파일러에서 매우 복잡하게 구현되어 있음
• 확장하거나 수정하기가 대단히 어렵다
• C++ 표준들에 의존하는데 그런 것들을 지원하지 않는 컴파일러도 존재한다 .
• 비트 배열 클래스는 상대적으로 간단하다
• 기존 코드와 통합이 쉽다
• 게임 개발에 유용한 추가 기능을 지원한다
• Endian 에 독립적이다
• 확장 및 수정이 용이하다
BitArray
• 동적인 배열 크기 조정
• 추가적인 연산자 제공 (ex. AllBits-
False() )
• 표준적인 비트 연산자 제공 (&, |, ^,
&=, |=. ^=, ~)
• Shift 연산자는 지원하지 않는다 .
• 빠른 속도를 위해서 , 생성시 초기화
하지 않는다 . (Clear() 메서드 )
• WORD 하나에 들어갈 정도의 크기의
배열은 추가 메모리를 할당하지 않는다 .
• 내부는 Proxy 클래스를 사용하여
구현된다 .
비트 배열의사용
// 플래그 설정BitArray bits(32);bits[10] = true;
bool val = bits[10];일반적인 배열 사용하듯이 사용하면 된다 !
직관적이다 !
BitArray2D
BitArray2D bits(10, 20);
Bits[3][4] = true;
다른 2 차원 배열과 거의 동등한
방식으로 작동한다 .
1 차원 배열첨자 연산자는 ArrayProxy
를 반환한다 .
따라서 BitArray2D 의 행은 BitArray 로
취급할 수 없다 .
TwoBitArray
2 비트 값들의 배열을 제공한다 .
조금만 수정하면 3 비트 , 4
비트등으로 확장 가능
더 많은 플래그 값을 지원하는
아주 편리한 수단을 제공한다 .
응용
• 캐릭터 및 오브젝트의 상태 플래그
• 렌더링 플래그
• 2 차원 , 3 차원 타일맵에서 맵
상태 정보 플래그
• 스트림 저장 / 로드 기능 추가