본문 바로가기

카테고리 없음

[게임 개발] 노가다를 줄여주는 마법의 오토 타일링과 비트마스킹

 

테라리아(Terraria)에서 흙을 캘 때, 블록들이 자연스럽게 연결되는 모습을 기억하시나요? 혹은 스타듀밸리(Stardew Valley)에서 울타리를 칠 때 알아서 모서리가 다듬어지며 연결되는 모습은요?

 

2D 게임에서 이러한 블록 간의 자연스러운 연결은 시각적 디테일을 위해 매우 중요한 부분입니다. 하지만 개발자가 수많은 연결 경우의 수를 일일이 하드코딩으로 지정할 수는 없었겠죠. 이 문제를 우아하게 해결하기 위해 도입된 시스템이 바로 오토 타일링(Auto-tiling)이며, 그 핵심 원리로 비트마스킹(Bitmasking)이 사용됩니다.

비트마스킹(Bitmasking)이란?

비트마스킹은 말 그대로 컴퓨터가 처리할 수 있는 가장 작은 데이터 단위인 비트(0과 1)에 마스크를 씌워, 특정 비트만 걸러내거나 조작하는 행위입니다.

여러 개의 참/거짓(True/False) 상태를 하나의 정수(Integer)로 압축하여 저장하고, 비트 논리 연산자를 활용해 이를 아주 빠르게 제어하는 프로그래밍 기법입니다.

왜 배열이나 변수 대신 비트마스킹을 쓸까?

타일의 상태를 제어할 때 굳이 비트마스킹을 활용하는 데에는 명확한 이유가 있습니다.

만약 타일의 상하좌우 4면의 연결 상태를 확인하기 위해 4개의 boolean 변수를 만들었다고 가정해 봅시다.

  • 메모리도 4배를 차지할 뿐만 아니라,
  • if문으로 모든 경우의 수를 검사하려면 코드가 걷잡을 수 없이 지저분해질 것입니다.

하지만 비트마스킹을 사용하면 단 하나의 정수만으로 이 4가지 상태를 모두 기억할 수 있습니다. 비트는 0과 1로 이루어져 있기 때문에, 각 자릿수에 상태를 할당하는 방식으로 데이터를 압축하는 것이죠.

마법의 규칙: 각 자릿수가 곧 상태를 의미한다

비트마스킹의 핵심은 이진수의 각 자릿수마다 고유한 상태를 맡긴다는 것입니다.

상하좌우 타일의 유무를 확인하기 위해서는 4개의 자리가 필요합니다. 여기에 2의 거듭제곱($2^0, 2^1, 2^2, 2^3$)을 부여하면 각각 1, 2, 4, 8이라는 고유한 값을 가지게 됩니다.

  • 상 (Top): 1
  • 우 (Right): 2
  • 하 (Bottom): 4
  • 좌 (Left): 8

주변에 타일이 존재할 때마다 해당 방향의 숫자를 더해주기만 하면 됩니다. 예를 들어 위(1)와 오른쪽(2)에 타일이 있다면 두 값을 더해 3이라는 결과가 나옵니다. 이 규칙을 적용하면 0부터 15까지 어떠한 상태도 서로 겹치지 않고 고유한 숫자를 만들어냅니다.

그리고 이렇게 도출된 상태 값(숫자)을 타일셋 이미지 배열의 인덱스 번호로 그대로 사용합니다. 연산 결과가 곧 가져와야 할 타일의 번호가 되는 아주 효율적인 구조입니다.

압도적인 퍼포먼스

비트마스킹이 게임 개발에서 적극적으로 사용되는 또 다른 결정적 이유는 압도적인 연산 속도입니다.

비트 연산은 컴퓨터의 CPU가 가장 직접적이고 빠르게 처리할 수 있는 하위 레벨(Low-level) 연산입니다. 실시간으로 청크(Chunk) 단위의 맵이 로드되거나, 한 번에 많은 양의 흙이나 광석 타일이 부서지고 생성되는 환경에서는 연산 속도 최적화가 필수적입니다. 비트마스킹은 이러한 무거운 지형 업데이트 작업을 지연 없이 부드럽게 처리할 수 있도록 돕는 일등 공신입니다.