[언리얼서밋] '이카루스M' 최적화 & 퀄리티를 위한 TA 고군분투기

게임뉴스 | 윤홍만 기자 | 댓글: 1개 |



어느 게임이나 마찬가지겠지만, 게임의 완성도를 얘기할 때 최적화를 떼놓고 얘기할 수 없다. 제아무리 뛰어난 퀄리티와 연출을 자랑한다고 해도 최적화가 미흡해 제대로 즐길 수 없다면 무용지물이나 마찬가지이기 때문이다. 이는 PC와 콘솔, 모바일 특정 플랫폼에 국한된 문제가 아니다. 그런 가운데 특히 최적화에 신경 써야 하는 플랫폼이 있다. 바로 모바일이다.

스마트폰의 성능이 나날이 발전하고 있지만, 여전히 모바일은 PC나 콘솔과 비교해 제약이 많다. 좀만 퀄리티를 올리라치면 최적화가 발목을 잡는다. 업그레이드할 수 있는 것도 아니기에 이를 해결하기 위해선 개발자들이 밤낮없이 고민할 수밖에 없다.

이 고민을 해결해주기 위해서 위메이드 이카루스의 유명조 TA 파트장이 언리얼서밋에 나섰다. 개발 자체가 최적화와의 싸움이랄 수 있던 모바일 MMORPG '이카루스M'의 사례를 통해 게임의 퀄리티를 유지하면서 최적화라는 두 마리의 토끼를 잡은 그의 노하우가 이날 공개됐다.



▲ 위메이드 이카루스 유명조 TA 파트장

유명조 TA 파트장은 본격적인 최적화 방법에 대한 이야기에 앞서 최적화를 할 수밖에 없었던 상황에 대한 이야기부터 시작했다. '이카루스M'은 원래 유니티 엔진으로 개발 중이던 쿼터뷰 MORPG였다. 하지만 그러던 게 언리얼 엔진으로 엔진을 바꾸더니 장르 역시 MMORPG로 바뀌면서 여러 문제들이 발생했다. 게임의 퀄리티를 더 올려야 하는 건 물론이고 MORPG와 달리 수많은 오브젝트가 한 화면에 들어가는 MMORPG이기에 최적화에도 더 신경을 써야 했다.

이를 위해 그는 가장 먼저 쉐이더와 마테리얼을 정비했다. 유니티 엔진으로 개발할 때 쓰던 쉐이더와 마테리얼을 언리얼 엔진으로 컨버팅하는 일이었다. 하지만 여기서부터 문제가 발생했다. 쓰던 방식이기에 익숙했으나 세부적인 파라미터 옵션이 많아서 언리얼 엔진에서 쓰기엔 너무 복잡한 거였다. 여기에 최종 이미지를 엔진 에디터를 통해서만 확인할 수 있었기에 번거로웠을 뿐더러 시간도 많이 잡아먹었다. 결국 캐릭터 파트에서 PBR(Physically Based Rendering, 물리 기반 렌더링)을 쓸 수 있도록 해달라는 개선 요청이 들어왔고 그 결과 서브스턴스 페인터를 도입하게 됐다.




다행히 서브스턴스 페인터를 도입하자 여러 문제가 해결됐다. 실시간으로 이미지를 확인할 수 있었고 Metalic, Roughness도 정상적으로 사용할 수 있게 됐다. 제작 공정이 한결 개선된 거였다. 개발 편의성을 어느 정도 확보한 후에는 본격적인 최적화 작업에 들어갔다. 우선 몬스터와 NPC 컬러를 제외한 이미지들을 하나의 타일맵으로 통합했다. 이를 통해 이미지 관리의 편의성은 물론이고 약간이나마 로딩 속도를 향상시킬 수 있었다.

다만, 여기서도 문제는 발생했다. 합친 이미지를 포토샵으로 제작해야 했는데 만드는 것도 어려웠지만 수정하기도 어려웠다. 이 문제에 대해 유명조 TA 파트장은 타일맵 전용 툴을 제작해 해결했다고 설명했다.

다음으로는 마테리얼 노드를 정리하는 작업에 들어갔다. 기존의 마테리얼 노드는 한눈에 보기 어려운 방식이었다. 그래서 문제 발생 시 원인을 찾기도 쉽지 않았고 너무 복잡했기에 줌 인, 줌 아웃을 반복하면서 확인해야 했다. 이 문제를 해결하기 위해 마테리얼을 기능별로 함수화하자 보기 편했을 뿐 아니라 재활용하기도 수월해졌다.

본격적인 최적화 작업에 대해 설명하면서 유명조 TA 파트장은 마테리얼의 메쉬 타입에 대한 사용 여부를 명확히 설정하는 게 좋다고 조언했다. 이렇게 함으로써 컴파일 수와 메모리가 감소하고 결국은 앱의 용량도 줄일 수 있다는 거였다.

이에 대한 자세한 설명으로 그는 '이카루스M'을 한창 개발할 때를 회상했다. '이카루스M'은 우버 쉐이더 형식으로 마테리얼 하나에 모든 기능을 넣었는데 이렇게 오버라이드 스위치 노드를 남발한 결과 앱 용량이 2기가가 넘는 상황이 발생했다. 마테리얼이 800메가를 넘게 차지한 거였다. 이 문제는 마테리얼을 마스터 마테리얼, 서브 마테리얼, 그리고 인스턴스로 각각 구분해서 씀으로써 해결했고, 인스트럭션 역시 36개에서 32개로 줄일 수 있었다.




이렇게 최적화 작업을 어느 정도 끝내자 이어서 그래픽 문제가 튀어나오기 시작했다. 가장 대표적인 문제는 바로 그림자였다. 언리얼 엔진에서는 실내 그림자와 캐릭터 그림자가 자연스럽게 합쳐지는데 외관상 둘을 분리할 필요가 있었다. 이를 위해 Stationary Light Cascade Shadow와 Lightmap 그림자가 분리되도록 코드를 수정했다. 이렇게 하자 실내에서도 캐릭터의 그림자를 제대로 확인할 수 있었다.

하지만 해결할 것들은 여전히 많았다. 예를 들어 라이팅을 적용할 때 배경과 캐릭터, 각각 최적화된 값이 있다. 하지만 어느 한 쪽에 맞추면 다른 쪽에서 불만이 나왔기에 커스텀 쉐이딩 모델을 만들어서 배경과 캐릭터의 라이팅을 분리할 수 있었다고 유명조 TA 파트장은 설명했다.

실제로 커스텀 쉐이딩 모델 덕에 여러 문제를 해결할 수 있었다. 기존에는 캐릭터 스킨 쉐이더에 그림자가 생길 경우 자글자글해 어딘가 부자연스럽고 보기 안 좋았는데 커스텀 쉐이딩 모델을 통해 한결 자연스럽게 수정할 수 있었다.






▲ 퀘스텀 쉐이더 모델을 통해 원하는 그림자를 표현할 수 있었다

커스텀 쉐이딩 모델을 작업한 후 유명조 TA 파트장은 로딩 시 발생하는 히칭 현상(프레임이 급격히 떨어지는 현상)을 해결하는 작업에 착수했다. 그가 한 방법은 예상외로 단순했다. 쉐이더 캐싱을 사용해 쉐이더 로딩 과정을 미리 기록해 히칭 현상을 방지한 거였다. 하지만 이 방법도 완전하진 않았다. 우선 쉐이더가 변경되면 캐싱 파일도 업데이트해야 했고 수집을 위해서 일일이 게임 플레이를 해야 했다. 매번 캐싱 데이터를 수집해야 하니 장시간 플레이해야 하는 문제도 뒤따랐다.

이 문제를 해결하기 위해 유명조 TA 파트장은 쉐이더 캐싱만을 위한 별도의 프로젝트를 만들어서 해결했다. 프로젝트에 사용하는 마스터와 서브 마테리얼을 새 프로젝트로 옮겼는데 마테리얼만 있으니 패키징도 속도도 빨랐고 덕분에 하루종일 걸렸던 게 30분이면 끝나게 됐다.

쉐이더와 마테리얼 최적화에 이어서는 레벨(맵) 최적화에 대한 설명이 이어졌다. '이카루스M'은 MMORPG이기에 방대한 맵을 자랑한다. 초기에는 500m였지만 현재는 2km로 점점 증가하는 추세다. 당연히 맵이 커질수록 메모리 용량과 드로우콜이 증가할 뿐 아니라 로딩 시간도 길어진다. 이 문제를 해결하기 위해 유명조 TA 파트장은 레벨 스트리밍을 사용했다고 설명했다. 간단히 말해 플레이 중 10개~20개로 분리된 레벨을 비동기적으로 로드, 언로드하는 기법이다. 이를 통해 '이카루스M'은 초기 레벨 로딩 시간이 2~3초 감소했을 뿐 아니라 RHI 메모리 역시 평균 30~60메가나 줄일 수 있었다.







드로우콜을 줄이기 위해선 컬 디스턴스 볼륨이 사용됐다. 메쉬 렌더링 옵션을 통해 컬 디스턴스에 제외할지 구분할 수 있게 됐으며, 여기에 오브젝트 볼륨이 많을 경우 액터 병합을 함으로써 드로우콜을 줄였다.

'이카루스M'은 디렉셔널 라이트와 다수의 스태틱 라이트로 구성됐는데 실외와 실내가 혼합된 지역의 경우 Stationary Light를 사용해 그림자를 베이킹했다. 이를 통해 '이카루스M'은 최적화는 물론 더욱 정교한 라이트와 그림자를 구현했다.

퀄리티를 올리기 위한 작업은 이 뿐만이 아니었다. 리플렉션 캡처에도 변형을 줬는데 기존의 경우 캡처 위치에 따른 캐릭터의 이미지 편차가 큰 편이었다. 이를 해결하기 위해서 우선 맵 별 큐브맵을 제작하고 베이킹한 후 다시 환경 맵으로 만드는 식으로 작업을 진행해 원하는 재질감을 살릴 수 있었다.

이외에도 시점이 프리 카메라로 바뀌다보니 하늘을 표현하는 데 있어서 욕심이 났다고 유명조 TA 파트장은 설명했다. 기본적으로 제공하는 스피어 돔 메쉬는 어딘가 단조로웠다. 그래서 별도의 메쉬, 머트리얼 추가 없이 HDRI 이미지 구름을 제작한 후 2개의 UV 블랜딩으로 높이를 조절해 보다 정교한 하늘을 구현해냈다. 여기에 버텍스 컬러를 이용하면 텍스쳐를 아끼면서도 그럴듯한 퀄리티의 플로우 맵을 만들 수 있다고 조언했다.




이어서 유명조 TA 파트장은 블루프린트를 이용할 때 메모리를 절약할 수 있는 팁을 소개했다. 블루프린트를 쓸 경우 자동으로 콜리전이 설정되는 경우가 많다. 그렇기에 스태틱 메쉬일 경우 콜리전을 끄는 게 메모리 사용량을 줄일 수 있다는 거였다.

UI 최적화는 어떻게 해야 할까? 단순히 저퀄리티로 만들어선 안 된다. 유명조 TA 파트장은 "UI는 겉으로 보이는 굉장히 중요한 요소"라며, "별도의 TA가 최소 1명은 붙어서 퀄리티와 퍼포먼스를 잡아야 한다"고 중요성을 강조했다. 실제로 '이카루스M'의 경우 초기 UI를 비롯해 2D 스프라이트는 상당히 고용량, 고퀄리였다. 로딩 이미지만 14메가가 넘었다. 단순히 로딩 이미지 하나만을 위해 할애하기엔 너무 많은 용량이다. 이를 해결하기 위해 POT 방식으로 텍스쳐를 바꾼 후 언리얼 마테리얼로 복원하도록 해 86% 줄어든 2메가로 최적화할 수 있었다.

단순히 용량만 줄이고 끝난 게 아니다. 텍스쳐 폰트 함수를 제작해 모든 자리 수를 한 번에 출력하도록 해 적용 전 250개에 달하던 드로우 콜을 25개로 최적화했다. 90%나 줄인 셈이었다.







이렇게 최적화를 해도 여전히 최적화할 요소는 남아있다. 어찌 보면 가장 중요한 일인 미사용 어셋 제거다. 실제로 만들긴 했지만 프로젝트에 사용하지 않은 마테리얼이나 리소스는 많다. 문제는 이걸 하나하나 제거하기하려면 끝이 없다는 부분이다. 유명조 TA 파트장은 레퍼런스 체크 툴을 제작, 자동화해서 시간을 절약했다고 설명했다.

끝으로 유명조 TA 파트장은 프로파일링 툴을 적극적으로 사용할 것을 권유했다. 최적화라는 건 결국 메모리나 드로우 콜이 어떤 때 발생하는 지 파악하는 게 우선이다. 원인을 알아야 해결할 수 있기 때문이다. '이카루스M' 역시 이러한 프로파일링 툴을 이용한 덕에 전체 렌더링 드로우 콜을 비롯해 각종 수치를 쉽게 파악할 수 있었다며, 이날 강연을 끝마쳤다.

코멘트

새로고침
새로고침

기사 목록

1 2 3 4 5