1. ‘게임 프로그래밍 패턴’ 개요
게임 프로그래밍을 공부함에 있어서 책을 읽는게 도움이 되는가에 좀 뭐라 해야할지 모르겠다. 프로그래밍이라는 분야를 공부하고 있는 중이다. ‘[플밍] 경일게임IT아카데미 온라인 부트캠프 8개월 게임 개발자 과정 수료‘에서 기초적인 것을 배웠다고 생각한다.
요번에 간단 책리뷰를 하고 있는 ‘게임 프로그래밍 패턴’의 경우 앞선 교육을 통해서 도움이 되는 책이라고 소개를 받아서 읽어보았다. 결론부터 말하자면 아직은 나에게 좀 흡수가 되기 어려웠던 책이였다.

모든게 거부된 것은 아니지만 공감이나 책의 내용을 받아 들이는 것에 많은 구멍을 느낄 수 있었다. 더군다나 C++로 되어 있는 소스 코드이기에 내가 1년 동안 접한 C#과는 작성되어 있는게 달라서 받아 들이는게 쉽지 않았다.
더군다나 뭔가 주석으로 글 이외에 내용을 아래에 적어두는 방식의 책은 읽기가 이상하게 번거롭고 어렵다. 집중이 좀 떨어지는 느낌을 받았다. 책 자체는 선배로서 스스로 겪었던 부분을 공유해주고 패턴을 선정함에 있어서 도움을 주고자 하는 의도는 알겠는데 그 선택에서 공감을 끌어내는데 어려움이 있었다.

그리고 일단은 게임 엔진을 사용하는 것을 바탕으로 하는 것이 아니라서 좀 날 것의 느낌을 받아서 그 부분이 흡수가 어려웠다. 싱글턴 패턴이 무엇인지 그리고 흔히들 너무 싱글톤에 의지하면 안된다는 것과 사용을 줄일 때의 다른 방법 등 여러 제안을 한다.
결론적으로 말하자면 방대한 양을 간략하게 맛을 살짝 보여주는 방법으로 대부분의 내용이 진행되었다. 그중에서 좀 인상적인 부분을 출여서 본문에서 좀 주제로 띄워두고 생각을 정리해 보고자 한다.
2. ‘게임 프로그래밍 패턴’ 본문
400 페이지의 20가지 패턴이라 이건 정말 우겨넣었다는 느낌을 받는다. 지금 읽은 후여도 뭔가 남아서 내재화 되어 사용할 수 있는 것이 거의 남지 않았다. 인상만 남았다고 해야하나? 활용까지 얻어진게 없다는게 좀 아쉽다.
프로그래머여서 그런걸까? 틀을 잡아두고 내용을 틀에 넣다보니까 자연스러움이 조금 덜 느껴졌다. 설명하자면 문과와 이과 그 사이 애매한 위치에서 붕뜬 느낌이다. 즉, 이 책의 리뷰는 붕뜬 느낌을 그나마 현재 리뷰로써 표현이 가능한 수준까지 만들 수 있느냐가 현재로서는 관건이다.

일단 패턴 설명에 들어가기 전에 프로그래머로서 협업 및 개발과 관련해서 코드의 작성과 관련해서 작가의 생각을 알 수 있는 부분이 있다. 처음에 해당 장에서는 프로그래머의 고충을 들을 수 있었다. 그 중에서 반복되고 인상적으로 들렸던 것은 유지보수와 디커플링이다.
커플링이 되어 있다면 유지보수가 어렵다는 것이 지속적으로 받아들여졌던 내용이다.
아무튼 다음으로 일단 첫번째 명령 패턴이다. 읽은바 활용으로는 입력과 관련해서 사용할 수 있는 패턴으로 판단된다. 단축키를 변경할 수 있는 게임의 기능을 넣을때 이용할 수 있는 패턴이라는 것까지는 인지를 했다. 그러나 구현까지는 뭔가 이해의 깊이가 미치지 않고 넘어갔다.
두번째는 경량 패턴이다. 이해한 바로는 반복되는 부분과 같은 부분에서는 통합해서 메모리를 아끼고 확장성을 가져가는 패턴이라고 이해했다. 객체의 생성에 더 적은 메모리와 연산이 사용되게 되는 패턴으로 받아 들여진다.

셋쩨 관찰자 패턴이다. 한글로는 관찰자인데 옵저버 패턴이 아닌가 생각이 드는데 이벤트를 활용하는 것과 다른 건가? 생각이 들었는데 뭐가 다른지 인지하고 구별하는게 쉽지 않다. 솔직히 받아들이는 단계까지 이르지 못했다.
넷째 프로토타입이다. 해당 타입은 여러 비슷한 오브젝트를 생성하는 것을 도움을 주는 패턴이다. 기존에 들었던 팩토리 패턴, 빌더 패턴 등과 정확히 무엇이 차이가 있는지 좀 오래전에 보아서 잘 가늠이 안 간다.
다섯째 싱글턴이다. 책에서는 싱글턴이라 되어 있다. 싱글턴이 맞는 표기인가 지금까지 잘못 사용하고 있었는가 반성하게 된다. 한개의 클래스 인스턴스만 사용하고 전역적인 접근을 보장하는 패턴이다. 책에서는 남용을 경계하고 다른 대안들을 제안한다. 다만 읽어보고 생각해 보아도 게임 시스템에 관련한 클래스를 싱글턴으로 만들지 않을 수가 없다는 자신만의 결론이 나와서 좀 당황스러웠다.

여섯째 상태 패턴이다. 유한 상태 기계(Finite State Machine, FSM) 개념이 나온다. 상태 패턴을 활용하려고 했을때 가장 고민인 부분은 상태들의 결합이 되는 부분을 어떻게 하는가에 관한 고민이 있었다. 책에서는 총을 예시로 지상에서의 공중에서의 총을 쏜다는 것을 어떻게 구현하는지 ‘병행 상태 기계’, ‘계층형 상태 기계’, ‘푸시다운 오토마타’를 제안해주었다.
일곱째 이중 버퍼 패턴이다. 그래픽과 관련된 패턴이다. 이 패턴을 보면서 수직 동기화가 생각나는 패턴이다. 원리가 거의 같은 건가 생각된다. 다만 나의 경우에는 아직까지 그래픽 출력과 관련해서 심도있게 살펴보지를 않아서 와 닫지가 않았다. 그래픽 출력에 있어서 완성된 이미지를 출력하게 한다는 것에 관한 전략이다. 성능에 따라서 프레임 출력의 조절과 사이클 관련 내용이 포함되어 있다. 한편으로는 유니티(Unity)에서는 어떻게 구성되어 있는지 확인할 필요성을 느낀다.
여덟째 게임 루프 패턴이다. 유니티(Unity)에서는 라이프 사이클로 돌아가는 게임이 켜져 있다면 무한 루프를 돌고 있는 부분이다. 책에서는 게임에 필요한 패턴을 하나만 선택하자면 해당 패턴을 선택해야 한다고 한다. 게임의 시간과 실제 시간을 처리하는 부분에 집중되어 있다. 유니티(Unity) 라이프 사이클을 접하면 알 수 있는 부분이라 일단은 직접 구현하는데 어떠한 사고가 철학이 들어가 있는지 확인해 보았다.

아홉째 업데이트 메서드 패턴이다. 유니티(Unity)에서는 업데이트를 3개로 구분해서 처리(Fixed Update, Update, LateUpdate)하고 있다고 알고 있을 것이다. 해당 패턴 설명에서는 객체들의 변화에 따른 처리를 언제 처리할 것인가에 관한 고민이 보인다. 처리 순서에 따라서 총을 맞고 안맞고가 결정되는 부분이기 때문이다. 읽으면서 느끼는 것은 역시나 패턴을 사용할 것인가 안할 것인가는 결국은 활용 및 편의성 측면이 존재해 보인다.
열번째 바이트코드 패턴이다. 책에서 읽은 부분에서 제일 이해하기 난해하고 사용할 일이 있는 것인가 생각되는 파트였다. 느낌적인 느낌으로는 비트를 가지고 다룬다는 것인가? 생각이 들다가도 언어를 만든다라는 영역까지 뭔가 설명을 하셔서 이건 뭐지? 라는 생각이 들게 하는 부분이였다. 게임 구현에 사용한 언어로는 구현하기 어려울때 바이트코드 패턴을 사용한다는데 아직까지 나로서는 사용하기 벅찬 부분으로 보인다.
열한번째 하위 클래스 샌드박스 패턴이다. 이 패턴은 왠지 앞서 언급된 프로토타입 패턴과 같이 여러 객체를 생성하는데 도움을 주는 패턴으로 판단된다. 설명으로 초능력자 생성으로 하위에 분화 되어 여러 초능력자를 포함하는 구성으로 설명을 진행한다.

열두번째 타입 객체 패턴이다. 이는 객체를 관리하는데 타입을 활용해서 관리하는 방법에 관해서 설명해준다. 미묘한 차이들이 설명되어 있다. 실제로 사용하면서 얻어지는 지식들을 책에 넣어 두었지만 아직 프로그래밍에 경험이 부족한 독자로서는 흡수되지가 않았다.
열세번째 컴포넌트 패턴이다. 유니티(Unity)를 사용하면 알 수 있는 그 컴포넌트와 같은 역할이다. 디커플링 패턴으로 설명되어 있으며 유니티(Unity)에서 사용하는 것과 같은 역할을 하는 것으로 판단된다. 기능을 빼놓고 그 기능을 객체 등에 붙여서 사용할 수 있는 것으로 판단된다.
열네번째 이벤트 큐 패턴이다. 단순히 이벤트를 활용하는 관찰자 패턴이랑은 좀 다른 느낌을 받았다. 이벤트 큐는 이벤트에 순차성을 주는 것으로 판단된다. 책에서도 관찰자 패턴이랑 무엇이 다른지 설명이 존재한다. 사용에 핵심은 메시지를 보내는 시점과 받는 시점을 분리하고 싶을 때만 큐가 필요하다고 설명한다. 주의 사항으로는 피드백 루프에 빠지는 것을 언급해준다. A 이벤트에 B 이벤트가 발생하는데 B 이벤트처리에 A 이벤트가 필요한 경우라 할 수 있겠다.

열다섯번째 서비스 중개자 패턴이다. 서비스 중개자 패턴은 무엇인가 생각하면 서비스들을 중재 해준다는 측면에서 기존 프로젝트에서 매니저들을 관리해주는 매니저가 생각났다. 다만 중개자는 좀 더 수평적인 관계 측면이 강해서 관리한다는 측면보다는 전달해준다는 측면으로 다가왔다. 책에서는 싱글턴과 마친가지로 좀 절제해서 사용해야 한다고 언급한다.
열여섯번째 데이터 지역성 패턴이다. CPU의 연산 처리와 관련해서 설명이 나오며 메모리 위치에 따른 일반적인 CS(Computer Sicence)가 설명된다. 개체 배열을 통한 개체를 참조시에 내부에서 컴포넌트를 포인터로 추적하며서 해당 컴포넌트들이 데이터 지역성이 깨져 있다는 것을 언급하며 각 컴포넌트 별로 배열을 구성하는 패턴을 설명해준다. 그러므로서 포인터 추적이라고 불리는 포인터가 데이터를 복잡하게 돌아다는 현상을 줄여주고자 한다.(캐시 미스를 줄일려는 의도)
다만 게임 엔진을 사용하는 입장에서 어떤 구성으로 되어 있는지가 궁금하지만 아마도 내부적으로 최적화를 위해서 구성이 되어 있지 않을까 생각된다. 컴포넌트를 어떻게 구성할 것인지 그 구성에 따라서 어떻게 동작이 달라지고 어떤 장당점이 있는지 알려준다.

열일곱번째 더티 플래그 패턴이다. 다수의 객체들이 서로 상호작용을 일으키고 있을때 어떻게 연산을 처리하게 코드를 작성하는가에 관한 패턴이다. 예제로는 바다 위에 있는 배에 망루에 있는 해적과 그 어깨에 있는 앵무새다. 바다, 배, 해적에 움직임에 앵무새의 위치가 변화한다는 것으로 배만 이동해도 모든 위치가 재계산 되어야 한다는 것이다. 계산을 너무 자주 반복하지 않게 계산을 여러 객체에서 하는 것이 아니라 플래그를 세워 한번에 처리해서 나중에 뿌려준다는 개념으로 판단된다.
열여덟번째 객체 풀 패턴이다. 일반적으로 게임 프로그래밍 교육에서 나오는 오브젝트 풀 패턴도 나왔다. 뭔가 색다른게 있는가 싶었는데 객체의 초기화를 어떻게 할 것인가에 관한 고민이 담겨 있었다. 객체 풀 내부에서 초기화 하는가 외부에서 초기화를 해주는 가에서 장단점과 주의 사항을 알려준다.
열아홉번째 공간 분할 패턴이다. 간단하게 공간 분할을 통해서 각 개체간의 상호작용에 메모리를 사용해서 연산처리를 단순화 시킨다는 목적이 있다. 책에서는 해당 패턴의 관해서는 기초적인 것을 전달하고 독자들 스스로 찾아서 추가적으로 공부하기를 추천하는 방식으로 내용 전달을 마무리 지었었다.

3. ‘게임 프로그래밍 패턴’ 마무리
게임 프로그래밍에 패턴을 사용하면서 패턴이라고 풀리지만 일정한 규칙을 정해서 그러한 규칙에 의해서 작성되는 통용되는 코드의 틀일 것이다. 다만 실제 현장에서 사용하는데 그 틀을 정말로 딱 맞춰서 작성할 수 있는 가에 어려움이 산재할 것이다.
패턴을 사용하는데 멀티스레드가 포함될 경우 복잡성이 증가하고 패턴 적용에 고려해야 하는 점이 매우 증가하는 경향을 책을 읽으면서 느낄 수 있었다. 또한 책을 읽으면서 전달해주는 프로그래밍 언어가 C++인데 그 약간의 차이 만으로 흡수하는데 좀 어려움을 느꼈다.
그나마 C#으로 객체지향을 배우고 특성들을 알고 있어서 이해할 수 있는 부분에서는 이해 할 수 있었느나 코드를 보면서 받아들이는 것이 힘들어서 약간은 아쉬움이 남았다.

작가의 입장에서는 게임 프로그래밍에 사용되는 여러가지 패턴이 무엇인지 간략하게 설명한다는 측면에서 책을 작성했다고는 하지만 방대한 내용을 담느라 나름 정제가 들어갔다고 해도 받아 들이는 입장에서는 날 것의 맛이 느껴졌다.
나의 프로그래밍 능력에 의한 받아들이는 한계일 수도 있다. 결국은 무슨 패턴이 있다는 알 수 있지만 실제로 사용해 본 것이 많았어야 공감하고 더 좋은 방식을 생각해 보는 기회가 있지 않았을까 아쉬움이 남는다.
아직까지는 이 독자에게는 허들이 존재하는 책이였고 읽는데 좀 어려움이 있었다. 그럼에도 도움이 되었기를 내심 바라고 읽었던 내용을 정리하였다. 이상입니다.
- [PC게임 리뷰] 산소 미포함(OXYGEN NOT INCLUDED)
- [유튜브 리뷰] Travel Tube, 트럼프가 초대형 한국 프로젝트를 추진하자 환호하는 한국상황 “대한민국 역사상 최초로 이뤄지나, 주변국들은 질색“ – 2020. 8. 13.
- [유튜브 리뷰] 에스오디 SOD, 한국 아줌마의 위엄… 답은 우리 주위에 있다! 100년 만에 대학생이 풀어낸 물리학계의 난제! – 2020. 8. 6.
- [유튜브 뉴스 리뷰] ‘한국 기상청 못 믿어’…해외 기상 예보 찾는 ‘망명족’ / SBS
- [책 리뷰]① 현명한 투자자(THE INTELLIGENT INVESTER)-벤저민 그레이엄 리뷰전편


