목차
왜 만들었는가
게임 엔진 구조를 파악해 더 최적화된 환경을 제공하고 싶었다거나, 엔진 개발자가 되고 싶어서 시작한 프로젝트는 아니었다. 사실 가장 큰 이유는 단순했다. 재미있어 보였다.
게임은 많이 만들어봤지만 엔진이 실제로 어떻게 동작하는지는 잘 몰랐고, 렌더러와 애니메이션, 물리 시스템이 어떻게 연결되어 하나의 게임이 되는지 궁금했다. 또 하나는 Vulkan에 대한 개인적인 호기심이었다. 당시 즐겨하던 게임 중 하나가 레인보우식스 시즈였는데, 어느 순간 Vulkan 버전이 추가되었다. 같은 게임인데도 체감될 정도로 훨씬 부드럽게 동작했던 기억이 있다.
왜 빨라졌는지는 몰랐지만 그 경험이 Vulkan이라는 이름을 기억하게 만들었고, 나중에 엔진 프로젝트를 시작할 때 자연스럽게 Vulkan을 선택하게 된 이유 중 하나가 되었다. 돌아보면 이 프로젝트는 좋은 엔진을 만들겠다는 목표보다는 '엔진을 직접 뜯어보고 이해해보고 싶다.' 에 가까운 프로젝트였다.
가장 어려웠던 점
가장 어려웠던 것은 Vulkan 자체였다. 삼각형 하나를 그리는 공식 튜토리얼만 해도 수천 줄에 가까운 코드가 등장한다. 처음에는 오히려 재미있었다.
하나하나 따라 만들면서 화면에 결과가 나오는 과정이 신기했고, 낮은 수준의 그래픽 API가 어떻게 동작하는지 배우는 것 자체가 즐거웠다. 하지만 프로젝트에 실제 기능을 넣기 시작하면서부터 상황이 달라졌다.
무언가 하나를 추가하려고 하면 Descriptor Set, Buffer, Pipeline, Command Buffer까지 영향을 받는 경우가 많았고, 어디가 문제인지 찾는 것 자체가 쉽지 않았다. 특히 애니메이션용 Bone Matrix 데이터를 별도의 UBO로 분리하려고 시도했지만 결국 해결하지 못했다.

당시에는 Descriptor Set 구조와 Resource Binding 흐름을 충분히 이해하지 못했고, 프로젝트 기간 안에 해결하기 어렵다고 판단해 기존 구조에 통합하는 방향으로 마무리했다. 지금도 언젠가 다시 도전해보고 싶은 부분 중 하나다.
생각이 바뀐 부분
프로젝트 전에는 게임 엔진의 성능 차이가 그렇게 크다고 생각하지 않았다. 하지만 엔진을 직접 만들어보면서 생각이 많이 바뀌었다. 특히 Vulkan처럼 개발자가 거의 모든 것을 직접 관리하는 환경에서는 작은 구조 차이도 성능에 큰 영향을 줄 수 있다는 점이 인상 깊었다.
또 물리 업데이트 주기, 렌더링 방식, 애니메이션 처리 구조 등을 직접 구현해보면서 왜 대형 게임 회사들이 Unreal Engine이나 Unity를 그대로 사용하는 것이 아니라 자신들의 프로젝트에 맞게 수정해서 사용하는지 조금은 이해할 수 있게 되었다. 예전에는 단순히 "기능이 있으니까 쓰는 것"이라고 생각했다면, 지금은 엔진 구조 자체가 게임의 성능과 개발 경험을 결정하는 중요한 요소라는 것을 느끼게 되었다.
팀 프로젝트 경험
기존에 알고 지내던 팀원과 그 지인의 소개로 합류하게 된 프로젝트였다. 다만 개인 일정 문제로 다른 팀원들보다 늦게 참여하게 되었고, 그 부분은 지금도 조금 아쉽게 생각한다. 조금 더 일찍 합류했다면 애니메이션과 스크립팅 외에도 더 많은 부분에 기여할 수 있었을 것 같다.
함께한 팀원들은 모두 자신의 분야에 진심이었고 실력도 뛰어났다. 프로젝트 막바지에는 우리가 정한 마감 기한을 맞추기 위해 며칠 동안 거의 붙어서 작업했던 기억이 난다.
각자 맡은 시스템을 개발하다가 하나의 엔진으로 통합하는 과정은 생각보다 훨씬 어려웠지만, 동시에 가장 많이 배운 시간이기도 했다. 특히 혼자 만드는 프로젝트에서는 느끼기 어려운 시스템 간 인터페이스 설계와 통합 과정의 중요성을 몸소 경험할 수 있었다.
다시 만든다면
가장 먼저 개선하고 싶은 부분은 이벤트 시스템이다. 현재 구조에서는 충돌이나 상호작용 상태를 각 컴포넌트가 직접 확인해야 했기 때문에 규모가 커질수록 결합도가 높아지는 문제가 있었다. 만약 다시 만든다면 Collision이나 Interaction 같은 이벤트를 별도의 Event Layer에서 관리하고, 각 스크립트는 필요한 이벤트만 구독하는 구조로 만들고 싶다.
또 프로젝트 당시 해결하지 못했던 Animation Bone Matrix UBO 분리 문제도 다시 도전해보고 싶다. 마지막으로 Vulkan의 Frame in Flight 구조도 적용해보고 싶다. 당시에는 시간과 기술적인 한계로 구현하지 못했지만, 여러 프레임을 동시에 처리하는 구조는 Vulkan의 핵심 개념 중 하나이기 때문에 언젠가는 직접 구현해보고 싶다.
마무리
돌아보면 기술적으로 완성도가 높은 엔진은 아니었다. 해결하지 못한 문제도 있었고, 지금 다시 본다면 개선하고 싶은 구조도 정말 많다. 그럼에도 불구하고 이 프로젝트는 지금까지 진행했던 프로젝트 중 가장 기억에 남는 프로젝트다.
게임 엔진이라는 거대한 시스템을 처음부터 직접 만들어보고, 렌더러와 애니메이션, 스크립트, ECS가 하나의 프로그램 안에서 함께 동작하는 과정을 경험한 것만으로도 충분히 의미 있는 시간이었다. 무엇보다 재미있었다.
처음에는 단순한 호기심으로 시작했지만, 프로젝트를 마칠 즈음에는 게임을 바라보는 시각 자체가 많이 달라져 있었다. 앞으로 다시 엔진을 만든다면 더 좋은 구조를 만들 수 있을 것이라는 자신감도 생겼고, 그만큼 아직도 배우고 싶은 것이 많은 프로젝트로 기억에 남아 있다.