← 블로그 목록

WinAPI로 시작하는 게임 개발은 창 띄우기보다 메시지 루프를 이해하는 데서 시작된다

WinAPI로 게임 개발을 시작할 때 가장 먼저 이해해야 할 것은 창 만드는 함수가 아니라, 메시지를 받아 윈도우 프로시저로 보내는 Win32의 흐름 자체다. Win32와 Winsock은 자주 함께 등장하지만 역할이 다르므로 분리해서 익히는 편이 낫다. 입문자는 거대한 설계보다 작은 루프부터 직접 움직여 보는 순서를 정리한다.

WinAPI로 시작하는 게임 개발은 창 띄우기보다 메시지 루프를 이해하는 데서 시작된다

WinAPI로 시작하는 게임 개발은 창 띄우기보다 메시지 루프를 이해하는 데서 시작된다

WinAPI라고 하면 많은 초보자가 막연히 “윈도우용 프로그램을 만드는 저수준 함수 모음” 정도로 받아들인다. 틀린 말은 아니지만, 입문 시점에는 이 표현만으로는 감이 잘 오지 않는다. 실제로 더 먼저 이해해야 하는 것은 Windows 프로그램이 어떤 흐름으로 돌아가는가다.

Microsoft의 Win32 입문 문서도 첫 단계에서 창을 띄우는 코드보다, 윈도우 프로시저와 메시지 루프가 어떻게 프로그램의 흐름을 만든다고 설명한다. 키보드 입력, 마우스 클릭, 창 크기 변경 같은 이벤트는 모두 메시지로 들어오고, 프로그램은 그 메시지를 꺼내서 적절한 처리 함수로 보내는 식으로 움직인다.

즉 WinAPI 입문은 “화면에 뭔가 그려 보기” 이전에, 이 프로그램은 왜 이런 구조를 가지는가를 이해하는 쪽이 더 중요하다.

Win32와 Winsock은 같은 것이 아니다

초보자가 많이 헷갈리는 지점이 여기다. Win32 API와 Winsock은 둘 다 Windows 프로그래밍에서 자주 만나지만 역할이 다르다.

Microsoft의 Winsock 시작 문서도 이를 단계별 네트워크 프로그래밍 가이드로 소개한다. 즉 창을 만들고 이벤트를 처리하는 구조를 배우는 것과, 소켓을 열고 연결하고 데이터를 주고받는 구조를 배우는 것은 분리해서 보는 편이 낫다.

게임 개발 입문 관점에서도 이 구분은 중요하다. 카드 게임이나 간단한 네트워크 게임을 만들겠다고 해서 처음부터 WinAPI와 Winsock을 한 덩어리처럼 배우면 금방 정신이 없다. 보통은 화면과 입력을 다루는 축과 통신을 다루는 축을 따로 익히는 편이 훨씬 낫다.

WinAPI 공부의 핵심은 메시지 기반 사고에 익숙해지는 것이다

Microsoft 문서를 보면 Win32 프로그램의 중심에는 메시지 루프가 있다. 메시지를 꺼내고, 번역하고, 디스패치하고, 윈도우 프로시저가 그에 반응한다. 이 구조를 이해하면 왜 긴 작업을 윈도우 프로시저 안에 오래 붙잡아 두면 안 되는지도 자연스럽게 이해된다.

실제로 Microsoft는 윈도우 프로시저 안에서 오래 걸리는 작업을 하면 같은 스레드의 다른 메시지 처리를 막아 UI가 멈출 수 있다고 경고한다. 그래서 네트워크 대기, 큰 파일 로딩, 무거운 계산은 별도 스레드나 비동기 방식으로 빼는 것이 일반적이다.

게임을 만들 때도 이 감각은 그대로 이어진다. 입력 처리, 렌더링, 게임 상태 갱신, 네트워크 통신을 한 함수에 다 우겨 넣으면 구조가 금세 꼬이기 쉽다.

입문자는 거대한 설계보다 작은 루프를 먼저 만들어 보는 편이 낫다

학생이나 초보자가 WinAPI로 카드 게임 같은 프로젝트를 시작할 때 흔히 UML, 패턴, 대형 설계를 한 번에 해결하려고 한다. 물론 설계는 중요하다. 하지만 너무 이른 시점의 거대한 설계는 오히려 구현 경험이 부족한 사람에게 부담만 줄 수 있다.

더 현실적인 순서는 이렇다.

  1. Win32로 창을 띄우고 메시지 루프를 이해한다.
  2. 입력과 화면 갱신을 분리해 본다.
  3. 게임 상태를 표현하는 최소한의 데이터 구조를 만든다.
  4. 그 뒤에야 네트워크가 필요하면 Winsock을 붙인다.

즉 설계는 중요하지만, 초반에는 동작하는 작은 구조를 직접 만들어 보면서 무엇이 필요한 설계인지 감을 잡는 편이 낫다.

핵심 정리

WinAPI로 게임 개발을 시작할 때 가장 먼저 이해해야 하는 것은 창을 띄우는 함수 이름보다 Win32의 메시지 루프와 윈도우 프로시저다. Windows 프로그램은 메시지를 받아 처리하는 구조 위에 서 있고, 이 구조를 이해해야 입력, 렌더링, 상태 관리도 덜 헷갈린다.

또한 Win32와 Winsock은 함께 자주 등장하지만 같은 것이 아니다. 하나는 데스크톱 프로그램 구조를, 다른 하나는 네트워크 통신을 담당한다. 처음에는 둘을 분리해서 배우고, 작은 프로그램을 직접 움직여 보면서 설계를 키워 가는 편이 더 오래 간다.

참고 자료

← 목록으로
Related

함께 읽으면 좋은 글

게임 개발프로그래밍리스프
고차 함수와 데이터 분리는 게임 로직의 변경 비용을 낮춘다

고차 함수와 데이터·로직 분리는 프로그램을 똑똑하게 만드는 마법이 아니라, 반복되는 패턴을 함수로 묶고 자주 바뀌는 설정을 코드 밖으로 빼서 변경 비용을 낮추는 추상화에 가깝다. SICP와 Unity ScriptableObject 사례를 함께 보면서, 게임처럼 규칙과 예외가 계속 늘어나는 환경에서 무엇을 코드로 두고 무엇을 데이터로 뺄지 가르는 기준을 정리한다.

함수형 프로그래밍게임 개발불변성
함수형 프로그래밍이 게임 개발에서 유용한 곳은 상태를 없애는 곳이 아니라 상태 변화를 분리하는 곳이다

함수형 프로그래밍은 게임 코드를 전부 다시 쓰라는 명령이 아니다. 불변 데이터와 순수 함수의 관점을 이용해 규칙 계산, 상태 전이, 서버 메시지 처리처럼 변화를 분리해야 하는 영역을 더 다루기 쉽게 만든다.

리팩토링기술 부채프로그래밍
게임 프로젝트에서 리팩토링이 생존을 결정한다

출시 직전에 터지는 버그, 기능 추가할 때마다 무너지는 구조. 게임 프로젝트에서 리팩토링을 미루면 어떤 일이 벌어지는지, 그리고 실전에서 리팩토링을 언제, 어떻게 해야 하는지를 경험을 바탕으로 정리한다.