지난 19일 넥스트플로어 지하연구소에서는 모바일 리듬게임 'Protocol:hyperspace Diver(이하 P:h Diver)'를 출시했다. 출시 전부터 'P:h Diver'는 1인 개발이라고는 믿기지 않는 퀄리티를 보여줘 많은 사람들의 관심을 받곤 했다. 하지만 1인 개발인 것보다 더 놀라운 사실이 있었으니, 'P:h Diver'가 김영수 개발자가 자체 개발한 엔진으로 만들어졌다는 사실이었다.

유니티, 언리얼, 코코스2D 등 다양한 상용 무료 엔진이 있는 지금, 그는 왜 자체 개발 엔진을 사용한 걸까? 자체 개발 엔진을 개발하게 된 이유에서부터 저수준의 모바일 게임 엔진 개발 노하우 등 소규모 개발자들에게 피가 되고 살이 되는 그의 강연을 들어보도록 하자.

▲ 넥스트플로어 지하연구소 노세노세팀의 김영수 개발자



■ 'P:h Diver'는 왜 자체 개발 엔진으로 개발했을까?



상용 엔진이 많음에도 왜 엔진을 개발하게 됐을까? 이 의문에 김영수 개발자는 "다양한 엔진을 분석한 결과 자체 엔진을 개발하는 게 'P:h Diver'에는 최적의 선택이었다"고 밝혔다. 리듬게임에는 크게 2개의 핵심 포인트가 있다. 첫 번째는 프레임 드랍으로 인한 입력 누락이 없어야 한다. 두 번째는 UI/UX가 뛰어난 반응성과 조작 경험을 가져야 한다.

당연히 그도 초기에는 상용 엔진의 사용을 고려했다. 유니티와 코코스2D, 그리고 넥스트플로어 자체 개발 엔진인 모데라토가 물망에 올랐다.


하지만 전부 그의 마음에 들지 않았다. 우선 유니티의 경우 본격적인 개발을 하기 전에 나온 '아이돌마스터 신데렐라 걸즈(이하 데레스테)'를 통해 어느 정도 성능을 예측할 수 있었는데 무겁고 느리다는 치명적인 단점이 있었다. 그렇다면 모데라토는 어땠을까? '드래곤 플라이트', '데스티니 차일드' 개발에 사용되며 검증된 엔진이었고 사내에 전문가가 많아 문제가 생기면 빠른 피드백을 받을 수 있단 장점이 있었다. 거기에 김영수 개발자 본인도 익숙한 엔진이었다. 그렇지만 아무래도 오래된 엔진이란 단점이 컸다. 특히 모데라토는 OpenGL ES 1.1을 썼는데 쉐이더 이용에 어려움이 있어 3D 게임인 'P:h Diver'에는 어울리지 않았다.

세 번째는 코코스2D로 가장 유력한 후보였다. 지금은 좀 잠잠하지만, 개발 당시에는 한창 발전하고 있었고 네이티브 C++ 기반이라 속도도 빠른 편이었다. 거기에 오픈소스여서 문제가 생기면 자체 해결도 가능하단 장점이 있었다. 하지만 신뢰성에 약간 문제가 있었다. 3.0 알파 버전부터 써 봤는데 자잘한 문제가 많았고 당시에는 3D 지원도 구현을 이제 막 시작하던 단계였다. 그리고 무엇보다 리듬게임의 생명인 사운드 라이브러리가 생각보다 강력하지 않다는 치명적인 단점이 있었다.

▲ 이래저래 엔진 별로 아쉬운 점들이 하나둘씩 있었다

물론 이런 이유만으로 엔진을 개발한 건 아니다. 엔진을 사용하는데 비용을 계산한 측면도 컸다. 상용 엔진을 쓸 경우 우선 엔진에 대해 배워야 하고, 최적화에 드는 비용 역시 무시할 수 없다. 한편, 자체 엔진을 개발할 경우 게임의 근간부터 개발하기에 최적화에 쉬우며 원하는 기능 역시 그때그때 만들어 쓸 수 있단 장점이 있다. 결국 이 같은 고민 끝에 'P:h Diver'는 자체 개발 엔진으로 만들게 됐다.

▲ 선택지를 통해 비교해봐도 자체개발보다 나은 선택지가 없었다

물론 자체 개발이 능사는 아니다. 김영수 개발자는 "만약 개발팀의 인력 구성이 달랐다면 다른 선택을 할 수 있었을 것"이라 말하며, "만약 타 직군과 협업까지 고려한다면 해당 직군이 사용할 수 있는 툴을 개발하는 문제도 있는 만큼 개발팀에 따라 자신들에게 최적화된 엔진을 사용하는 게 좋다"고 권했다.



■ 자체 엔진의 지향점은 뭐였을까?



자체 엔진을 개발하는 데 있어서 첫 번째로 지향한 건 플랫폼 중립성이었다. 'P:h Diver'는 스마트폰, 태블릿은 물론 아이폰, 안드로이드 등 수많은 제품에서 범용적으로 즐길 수 있어야 했다. 단순하게 본다면 모든 기기에 맞춰 한 땀 한 땀 포팅하는 방법도 있다. 그런데 이건 절대 좋은 방법이 아니다. 아니, 해선 안 되는 방법이다. 시간도 많이 들고 100개의 기기에 맞춰 포팅을 하는데 인력도 많이 든다. 그보다는 모든 기기에서 작동할 수 있도록 개발해야 한다.

이를 위해 그는 추상화를 채택했다. 플랫폼별 구동 로직을 밑에 깔고, 그 위에 플랫폼 중립적인 게임을 만드는 방식이었다. 다음으로는 어떤 언어를 쓸 지 고르는 순간이 다가왔다. iOS에서는 오브젝티브C++을 주로 쓰고, 안드로이드는 자바나 C++ via NDK를 쓰는데 C++는 양 플랫폼에서 모두 네이티브로 지원하는 만큼, 프로그래밍 언어로 C++를 선택했다.


그래픽 라이브러리로는 OpenGL을 사용했다. 모바일에선 거의 표준처럼 사용되고 있으며 OpenGL ES 2.0에서는 원하는 3D 그래픽도 표현할 수 있었다. 사운드 출력은 OpenAL을 사용했다. 꽤나 저수준의 라이브러리라 3D 사운드는 지원하지만, 오디오 포맷 디코딩을 사용자가 직접 해야 한다는 단점이 있었으나 양 플랫폼 모두를 지원한다는 장점이 있었다.

이렇게 라이브러리들을 모아 기초적인 자체 엔진을 만들고 본격적인 개발에 들어갔다. 이때 반드시 추가해야 한다고 생각한 기능이 있었으니 바로 멀티스레드 지원 기능이었다. 앞서 리듬게임은 성능이 높아야 한다고 말한 바 있다. 프레임 드랍에 특히 민감하기 때문이다. 멀티스레드 지원은 이런 프레임 문제를 해결해 줄 수 있는데, 이를 위해서는 엔진 설계 시점부터 고려해서 코드를 작성하는 게 좋다.

처음에는 없다가 차후에 멀티스레드 기능을 추가하는 건 작업량이 만만치 않기 때문이다. 아울러 처음부터 멀티스레드를 지원한다면 비동기 IO 작업과 백그라운드 작업 등을 관리하는 비용이 줄어든다는 장점이 있다.

▲ 프레임이 오르진 않아도 떨어지는 문제를 해결할 수 있다

하나둘 기능을 추가함으로써 완성에 가까워진 엔진이지만 잊지 말아야 할 게 있다. 바로 가벼운 엔진을 지향한다는 점이다. 애초에 유니티가 마음에 들지 않았던 이유가 쓰지 않는 많은 기능들이 있어 지나치게 무겁다는 점이었다. 즉, 'P:h Diver'를 개발하면서 정말 필요한 기능만으로 짜인 엔진을 만드는 게 목표였다. 한편, 이런 지향점을 갖고 개발한 엔진이다보니 따지고 보면 엔진이라기보단 프레임워크에 가까운 형태가 됐다.

라이브러리와 기능들을 추가한 이후에는 모듈 구조를 구성할 필요가 있었다. 하나의 키에 모든 기능을 넣는다면 그것만큼 번거로운 것도 없을 것이다. 필요한 기능은 필요한 모듈로 나눠서 구현하면 더 쉽게 쓸 수 있다. 사실 이런 모듈 구조는 당연한 거지만 모듈 구조를 명확하게 나눈 경우는 거의 없다.

▲ 자사의 모데라토의 경우에도 수 많은 모듈이 서로에게 종속된 형태다

이 경우 모듈을 관리하기 어렵고 자체 개발 엔진에서는 점점 쓰기 어려워지는 만큼, 그는 상위 모듈은 하위 모듈을 참조할 수 있지만, 하위 모듈은 상위 모듈의 참조를 금지함으로써 자연스럽게 모듈 간 의존성을 해결했다.



■ 자체 개발 엔진, 만족스러웠냐고요?



'P:h Diver'을 출시한 지 이제 막 일주일이 지난 지금, 과연 엔진을 자체 개발한 게 잘한 것인지 총평을 해봤다. 우선 개발 일정을 추산한 결과 4개월 만에 프로토타입을 완성할 수 있었다. 그리고 그로부터 한 달이 지나 게임에 대한 기본 기능들이 점차 추가됐다. 이 같은 빠른 구현은 자체 엔진을 쓴 덕분이라 생각한다. 원하면 그때그때 기능들을 빨리 추가할 수 있었기 때문이다.


그렇다면 만약 다른 엔진을 썼다면 어땠을까? 우선 유니티의 경우 최적화 여부를 장담할 수 없어서 최적화에 오랜 시간이 걸렸을지 모른다. 모데라토는 사운 시스템 지원이 애매한 상황인 만큼, 아마 엔진을 개발한 것처럼 기능을 새롭게 구현해야 했을 것이다. 코코스2D 역시 사운드 시스템이 미묘한 만큼, 난관에 부딪혔을지도 모른다.

물론 그렇다면 자체 엔진을 개발하는 게 무조건 좋은 건 아니었다. 엔진 개발부터 시작했기에 기능을 구현하는데 시간이 걸렸고 그로 인해 예상보다 개발 기간이 늘어났다. 또한, 엔진 레벨 개발은 꽤 높은 집중도를 요구하는 만큼, 개발 이외의 작업을 병행하는 것 역시 좋은 선택은 아니었다.

이처럼 엔진부터 개발했기에 힘든 경험을 하기도 했지만 그럼에도 김영수 개발자는 "어쨌든 완성해서 출시할 수 있었던 만큼 B점 정도는 주고 싶다"라며, "이번 강연을 통해 엔진 개발에 관심 있는 개발자들이 엔진 개발에 대해 다양한 정보들을 얻어갈 수 있었으면 좋겠다"라며 강연을 끝마쳤다.