▲ 슈퍼크리에이티브 강기현 대표

[인벤게임컨퍼런스(IGC) 발표자 소개] 1996년 텍스트 머드 게임 '무한대전'을 시작으로 '킹덤언더파이어', '샤이닝로어'등 굵직한 국내 타이틀 개발에 참여했던 베테랑 중의 베테랑. 현재 '슈퍼크리에이티브'의 대표로 얼마 전 '에픽세븐'을 출시했다.


"천성이 개발자다."

지난 8월, '에픽세븐' 출시를 앞두고 슈퍼크리에이티브의 강기현 대표를 만났을 때 든 생각이다. 보통 게임 출시를 앞두고 인터뷰를 진행하게 되면, 다들 준비했던 멘트와 게임의 장점을 풀어내는 데 여념이 없다. 개발사 대표 정도 되는 인물들에게 인터뷰는 숨 쉬는 것처럼 자연스러운 일이고, 게임을 알릴 좋은 기회니 말이다.

하지만 강기현 대표는 사뭇 달랐다. 잠을 자도, 출근해도 무방할 편한 옷차림에 필요한 말만 딱 하는 말주변. 지금 당장 어떤 개발사의 어떤 자리에 넣어 놔도 그림이 나오는 개발자의 모습 그 자체였다. 직접 말해보니 내공도 만만치 않다. '게임'이라는 미디어에 대한 인사이트도 탁월하고, 상용 엔진으로 목표를 구현하기 어렵자 아예 엔진을 만들어버리는 기염을 토했다.

그렇게 '에픽세븐'이 출시되고 두 달이 되어가는 시점에, 강기현 대표가 IGC 무대에 올랐다. 화자에 따라 좋은 강연이 되기도, 혹은 뻔한 말이 되기도 하는 포스트모템이지만, 오늘은 조금 다르다. 자칫 잘못하면 추억 팔이로 끝날 수도 있는 포스트모템이 이렇게 수준 높은 기술강연일 수가 있나?. 정신이 번쩍 들었다. 간만에 학생의 마음으로 돌아왔다. 어떻게든 강연을 그대로 옮겨야 하는 상황이니 말이다.




■ 강연주제: 유나 엔진 최적화 포스트모템

⊙ '에픽세븐' 개발의 핵심, 유나 엔진

먼저, '유나 엔진'이 어떤 엔진인지를 알아야 한다. 강기현 대표는 '에픽세븐'을 기획하면서 몇 가지 목표를 세웠다.

▲ 다 성공하진 못했다.(512gb는 오타)

초기 로딩에만 분 단위로 걸리는 게임이 넘쳐나는 지금, 쉬운 목표는 아니다. 그리고 솔직히 말하면, 강기현 대표는 이 모든 목표를 달성하진 못했다. 세 번째 목표였던 512mb의 메모리 안에서 구동하는 어플리케이션은 달성할 수가 없었다. OS가 이미 100mb는 차지하고, 로그인에 필요한 SDK에서 이미 또 수십mb의 메모리를 차지해버리니 게임 구동에 필요한 최소 메모리 확보가 될 수가 없었다.

하지만 쾌적한 게임 플레이를 만들어내기 위한 강기현 대표의 노력은 헛되지 않았다. 모두 달성하진 못했지만, 적어도 앞선 두 가지 목표는 이뤄냈기 때문이다. 이유는 단순했다. 강기현 대표 또한 모바일 게임에 헤비한 과금을 하는 코어 유저인데, 게임 플레이마다 로딩과 랙이 그렇게 거슬렸단다. 본인이 직접 만드는 게임에서는 이런 짜증 요소들을 없애고 싶었던 거다.

그 목표를 이뤄내기 위해 만들어진 엔진이 '유나 엔진'이다. 유나 엔진은 개발 파이프라인을 아예 뒤집어야 할 정도로 상용 엔진과는 다른 엔진인데, 이미지와 게임 DB, 애니메이션의 포맷도 완벽히 다른 포맷을 쓰고 자체적으로 이펙트, 연출 편집기와 멀티스레드 관리자 도구까지 포함되어 있다. 몇몇 부분을 제외하고는 유나 엔진만으로 대부분의 게임 구성 요소를 개발할 수 있을 정도다.

▲ 다양한 도구가 포함된 '유나 엔진'

물론, 단순히 개발 과정을 바꾸려고 유나 엔진을 만든 것은 아니다. 당시 상용화 엔진은 강기현 대표의 목표치에 부합하기에는 여러모로 걸리는 점이 많았다. 이를테면 이런 것들이다.

1. 멀티 코어의 100% 활용이 힘들다.
2. 기기별, 제조사 부품별 최적화가 힘들다.
3. 그래픽 디바이스에 직접 접근하기가 힘들다.
4. 로딩과 랙을 없애기 위해 저수준 제어가 필요한데, 이 또한 힘들다.


물론, 엔진을 새로 만든다고 목표가 '짠'하고 달성되는 것은 아니다. 강기현 대표는 유나 엔진을 만들면서 게임의 개발 방향성을 확실히 정했다. 먼저 그는 대부분의 모바일 기기가 가지는 공통된 특성을 파악했다. 현재 상용화된 대부분의 모바일 기기는 4코어의 CPU를 사용하며, SSD를 저장 매체로 활용한다. 유나 엔진은 이에 맞춰졌다. 시대의 뒤안길로 사라져가는 ODD와 싱글 코어에 대한 지원은 과감히 포기하고, HDD 지원도 포기했다. PC/콘솔 등 멀티플랫폼을 과감히 포기하고 모바일에 집중한 것이다.

▲ PC/콘솔은 깔끔하게 포기


⊙ '최적화'의 공식

강기현 대표가 말하는 최적화의 기본 방법은 꽤 일반론적인 내용에 가까웠다.

1. 실제로 사용하지 않는 리소스는 로딩하지 않는다.
2. 필요한 시점까지 최대한 로딩을 미룬다.
3. 데이터 리드를 하면 후처리 없이 바로 쓸 수 있도록 최대한 사전 처리를 해둔다.
4. 리소스 사용 타이밍을 예측해 백그라운드 스레드에서 병렬적으로 로딩을 진행한다.
5. 한번 로딩한 리소스는 캐싱해둔다.


일반론이라는 게 쉬운 것이라는 건 아니다. 대체로 최적화 작업은 스스로와의 싸움이다. 이쯤에서 만족할 것인지, 아니면 더 쥐어짤지에 대한 고민이 끝도 없이 이어진다. 참고 또 참아야 하는 이 과정을 반복하면서, 강기현 대표는 여러 가지 해법을 도입했다.

먼저, '이미지 포맷'을 바꿨다. 셀 애니메이션 스타일의 아트를 사용하다 보니 압축 포맷은 외곽선이 뭉개지는 문제가 생겨 사용할 수 없었다. 그 때문에 여러 픽셀 포맷을 혼용하고, 필요에 따라서는 디더링을 거쳐 적절한 변환하는 작업을 거쳤다. 유나 엔진에 맞춘 새로운 포맷을 도입하면서 png 포맷의 이미지를 사용하는 것에 비해 5배 이상 디코딩 속도가 빨라졌고, 파일의 인풋/아웃풋을 고려하면 세 배가량 속도가 빨라졌다.

▲ 이미지 포맷을 아예 만들었다.

하지만 모든 파일을 독자 포맷으로 변환하는 것은 사실상 불가능했고, 관리상의 이유로 png 포맷도 함께 사용하고는 있다. 여기서도 최적화 과정을 한번 거쳤는데 유료 파일 변환 서비스를 이용해 'tinypng'로 손실압축을 진행했다. 평균적으로 70% 이상 용량이 감소했고, 이에 따라 로딩도 빨라졌다. 비용은 걱정하지 않아도 된다. 에픽세븐에서 필요한 만큼의 모든 이미지를 변환하고도 비용은 10만 원 남짓 소모되었으니 말이다.

애니메이션 포맷도 이미지와 마찬가지로 바꿔버렸다. 에픽세븐의 특징 중 하나가 고퀄리티의 연출을 지향한다는 점인데, 이 특징이 최적화의 발목을 잡았다. 에픽세븐의 애니메이션은 따로 '키 프레임'이 없다. 일반적으로 애니메이션을 제작할 땐 용량과 작업량을 줄이기 위해 키 프레임을 정하고, 그 사이에 보간을 넣는다. 하지만 퀄리티를 끌어올리기 위해 에픽세븐은 보간을 넣지 않고 모든 프레임을 키 프레임으로 구성해버렸다.

▲ 퀄리티도 놓칠 수 없었다.

여기서 문제가 생긴다. 이렇게 만들어진 애니메이션이 개당 50mb ~ 100mb의 용량이 되고, 로딩 시간은 최대 10초나 잡아먹는다. 퀄리티와 퍼포먼스를 동시에 잡으려면 특단의 대책이 필요했고, 결국 강기현 대표는 애니메이션의 포맷과 런타임을 아예 새로 만들어버렸다. 'Spine editor'에서 json 파일로 추출한 후 독자 포맷으로 변환했고, 이를 통으로 메모리에 올려 후가공이 필요없게 만들었다. 통짜 키 프레임 애니메이션 구성에 맞춰 런타임을 재작성한 건 덤이다.

이렇게 만들어진 포맷 덕에 애니메이션 하나의 용량은 5분의 1로 줄어들었고, 로딩 속도는 10분의 1로 줄었다. 최대 1초의 로딩이면 실시간 로딩을 해도 딱히 체감이 안 되는 속도다. 해당 시퀀스에서 사용이 예상되는 이펙트는 아예 병렬 처리로 미리 로딩을 거치게 하여버려 특정 씬 진입 시 로딩할 필요를 없애버렸다.

이미지와 애니메이션 뿐만 아니라 게임 DB도 이와 같은 작업을 거쳤다. SSD의 랜덤 엑세스가 빠르다는 점을 이용해 데이터 사용 시 그때마다 필요한 부분만 블록 단위로 읽도록 만들었고, 한번 읽은 데이터는 다시 인풋/아웃풋 과정이 필요없도록 자동으로 캐싱 되도록 만들었다.

결과적으로는 모든 리소스가 앞서 말한 '최적화의 공식'을 따랐다. 메인 스레드에서 로딩을 최소화했고, 멀티코어를 모두 활용할 수 있도록 만들었으며, 포맷 디코딩을 포함해 텍스처 비디오 메모리의 업로딩까지 백그라운드 스레드에서 병렬 처리가 되게끔 했다. 게임 진행과 연계해 사용이 예상되는 리소스는 미리 프리로딩이 이뤄질 수 있게 하는 것은 마침표였다.

▲ 일반론은 쉽지만, 실행은 어렵다.


⊙ 최적화 이상의 '초최적화'

물론 이게 끝이 아니다. 최적화 과정이야 게임 개발에서 늘 빠지지 않는 과정이니 말이다. 다양한 처리를 통해 최적화를 이룬 후에도 강기현 대표는 마치 집착하듯 더 많은 영역에서 최적화를 이어갔다.

'발열' 문제의 처리가 대표적인 예다. 발열은 어찌 보면 모바일 게임에 당연히 따라오는 문제지만, 그 발열 때문에 스로틀링이 생기면 당연한 문제가 아니게 된다. 열 전도체 역할을 해주는 금속제 프레임을 사용하는 iOS 기기야 발열 문제가 비교적 적지만, 유리나 플라스틱 마감재에 가죽 케이스까지 덮이곤 하는 안드로이드 폰은 발열에서 절대 자유롭지 않다.

▲ 나아가 발열까지 잡기로 했다.

강기현 대표는 가장 열이 많이 나는 부분이 'SSD 컨트롤러'임을 파악하고, SSD에 부하를 주는 I/O(인풋/아웃풋) 과정을 최대한 줄여나갔다. 많은 리소스가 존재하는 부분은 LZ4 압축을 최대한 활용했고, 처리 부하를 SSD 컨트롤러가 아닌 CPU로 돌렸다. 동적 아틀라스도 사전 생성된 UI 아틀라스를 사용하지 않고 고해상도 텍스쳐에 필요한 이미지를 실시간으로 첨삭하는 방법을 사용해 드로우콜과 I/O를 모두 줄였다. 이 과정을 거치다 보니, 뜨겁던 핸드폰이 미지근해졌다.

여기서 끝이 아니다. 미지근한 폰을 서늘하게 만들기 위해 강기현 대표는 '가변 프레임' 시스템을 도입했다. 에픽세븐을 플레이해보면 알겠지만, 늘 화면이 바삐 움직이는 것은 아니다. 강기현 대표는 여관에서의 대기 씬이나 메뉴 씬 등, 정적인 화면이 유지될 때에만 프레임을 강제로 낮춰 시스템 부하를 더 줄였다. 모바일 게임의 UI는 변동이 크지 않은 경우가 많아 발열 억제가 어렵지 않다. 유저가 눈치채지만 못하게 하면 된다.

▲ 프레임이 낮아도, 모르면 문제가 없다.


⊙ 만족할 순 없지만, 최선을 다 했다.

거듭된 최적화의 결과물은 '에픽세븐'이란 이름표를 달고 세상에 나왔다. 물론, 아쉬웠던 점도 있었다. 강기현 대표는 최적화 과정에서 '안드로이드'와 내내 씨름했다. 몇몇 기기에 한해 이해할 수 없는 크래시가 나기도 했고, 애초에 안드로이드는 정해진 규격 없이 부품이 혼합된 경우가 많았기에 이 모든 경우의 수에 대비하는 과정이 쉽지 않았다.

그렇다고 결과가 묻힌 것은 아니었다. 강기현 대표는 20년이 넘는 개발 인생에서 처음으로 게이머들에게 '프로그래밍을 잘한다'는 칭찬을 들었다. 눈앞에서 하는 입에 발린 말이 아닌, 익명의 공간에서 이뤄진 진실한 칭찬이다. 이 말을 듣고 나니 기사 서두에 썼던 그때 그 감정이 다시 생각났다. 이 사람은 천생이 개발자다.

▲ 처음으로 '프로그래밍'으로 게이머에게 칭찬을 들었다.

한시간 채 안 되는 강연 시간에 들어도 쉽지 않은 과정이었는데, 여기서 끝나는 것도 아니다. 강기현 대표는 앞으로 웹 어셈블리를 활용해 유나 엔진을 웹 브라우저에 포팅하거나, 유나 엔진 전용 캐릭터 애니메이션 에디터를 만들어보려는 계획까지 이미 세우고 있었다. 아이고 또 생각난다. 천생이 개발자시다.

강기현 대표의 강연은 이렇게 마무리되었다. 강연 말미에 잠깐의 짬을 이용해 슈퍼크리에이티브의 구인 공고도 진행했는데, 프로그래머가 아닌지라 확신할 순 없어도 일단 팀에 합류하는 순간 '최적화'만큼은 장인 칭호를 달게 되리라 느꼈다. 지금 강기현 대표와 함께 일하는 프로그래머들도 보통 실력자가 아닐 것이 뻔히 보이니 말이다.