WWolves Den

DirectX 11 · 약 3분

엔진 없이 2D 게임을 시작할 때 직접 맡게 되는 일

Direct2D·Direct3D 11·Win32의 역할을 구분하고, 엔진 없이 창과 사각형을 그리는 작은 프로그램부터 학습 범위를 정합니다.

Wolfgadeok · 업데이트

이 연재의 출발점은 Direct2D

이 연재는 Direct2D의 ID2D1HwndRenderTarget으로 사각형과 격자를 그리는 데서 시작합니다. Direct3D 11의 정점 버퍼와 셰이더를 직접 구성하는 작업과는 학습 범위가 다릅니다. 둘 다 Windows 그래픽 개발과 관련 있지만 필요한 초기화와 그리기 방식이 같지는 않습니다. 먼저 어떤 API가 창을 만들고 어떤 API가 그림을 그리는지 구분해 두면 예제를 따라가기 쉽습니다.

Win32는 창과 메시지 같은 운영체제 인터페이스를 제공합니다. Direct2D는 2차원 도형과 이미지 등을 그리는 API이며, DirectWrite는 텍스트, WIC는 이미지 디코딩에 사용합니다. Direct3D 11은 그래픽 파이프라인을 더 직접적으로 구성할 때 다룹니다. Direct2D와 Direct3D를 연결할 수도 있지만 처음부터 모든 계층을 한 번에 배울 필요는 없습니다.

게임 엔진이 대신 해주던 것을 하나씩 분리하기

유니티나 언리얼 없이 시작하면 창 만들기, 입력 수집, 시간 측정, 자원 로딩, 그리기, 오류 처리와 해제를 직접 연결합니다. 그 다음에야 장면 전환, 충돌, 카메라, UI 같은 게임 기능을 쌓습니다. 완성된 RPG를 한 번에 만들려 하기보다 ‘창을 닫을 수 있고 사각형을 움직일 수 있다’는 작은 목표부터 검증하는 편이 학습 효과가 좋습니다.

자체 프레임워크를 만드는 목적은 엔진보다 무조건 빠르기 때문이 아닙니다. 어느 층에서 어떤 상태가 바뀌는지 직접 관찰할 수 있다는 장점이 있습니다. 반면 도구와 안정화 비용도 직접 부담해야 합니다. 상용 엔진은 작은 팀 전용, 특정 장르에는 부적합하다는 식의 결론은 내리지 않습니다. 프로젝트의 요구와 팀의 유지보수 능력을 기준으로 선택합니다.

  1. Win32 창을 만들고 종료 메시지가 정상 처리되는지 확인합니다.
  2. Direct2D로 배경과 사각형 하나를 그립니다.
  3. 창 크기를 바꾸고 최소화·복원하여 렌더링 수명 주기를 점검합니다.
  4. 시간 기반 이동을 붙인 뒤 이미지, 장면, 충돌 기능을 순서대로 확장합니다.

성능과 이식성은 측정할 대상

Direct2D가 내부적으로 다른 그래픽 계층과 연동한다고 해서 언제나 Direct3D보다 느리다고 결론낼 수는 없습니다. 그릴 도형과 텍스트의 종류, 배치 방식, 자원 생성 횟수와 드라이버 환경에 따라 병목이 달라집니다. 사각형 몇 개를 그리는 단계에서는 API를 바꾸기보다 매 프레임 불필요한 객체를 만드는지부터 확인할 수 있습니다.

또한 Windows용 코드를 다른 플랫폼으로 옮기는 일은 함수 이름 몇 개를 치환하는 작업이 아닙니다. 게임 규칙을 창·그래픽·입력 코드와 나누면 포팅 범위를 줄일 수 있지만 자원 형식과 생명주기도 검토해야 합니다. 이 연재에서는 우선 Windows에서 책임 경계가 명확한 작은 프로그램을 만드는 데 집중합니다.

참고 자료