유니티가 최신 게임 개발 기술과 노하우를 공유하는 '유니티 웨이브 2022 게임'을 10일 개최했다. 최승식 유니티 엔지니어가 '프로파일러'를 활용한 개발 최적화 기술을 소개했다. 유니티는 고객사 프로젝트를 여러 가지 방법으로 분석해 문제 유형을 추적하고 해결 전략을 제시하는 일도 한다. 최승식 엔지니어는 최근 2년간 자주 발견되면서도 비교적 해결하기 쉬웠던 유형을 '유니티 웨이브 2022'에서 발표했다.

최승식 엔지니어는 유형을 CPU 비용 최적화, GPU 비용 최적화, 메모리&에셋 비용 최적화로 나눴다. 처음 소개된 사례는 유니티 작업 화면인 캔버스 내에 움직이는 버튼이 추가될 때 CPU 비용이 크게 올라간 사례다. 그는 문제 원인을 찾기 위해 유니티 프로파일러(Unity Profiler) 상에서 비용이 높은 상수를 찾았다. 소개된 사례에서는 버튼 좌표가 변경될 때마다, 버튼이 속한 캔버스 아래의 모든 UI가 재배치되기 때문에 문제가 발생한 것으로 확인됐다. 최승식 엔지니어는 버튼을 별도 캔버스로 옮겨 영향을 주는 UI가 줄어들도록 해 문제를 해결했다.

그는 트랜스폼(Transform) 변경, UI 애니메이션, Hierarchy 등 레이아웃이 변경되는 동적인 UI 요소는 별도의 캔버스로 관리하길 권했다. 또한, 이와 같은 사례는 미리 해결하지 않으면 캔버스 안 UI 요소가 증가할수록 비용이 불어날 수 있어서 관련 프로그래머와 아티스트가 해당 내용을 함께 인지하고 해결할 필요가 있다고 강조했다.


▲ 네모가 실제 차지하는 영역은 녹색 선까지였다(왼쪽)

의도하지 않은 렌더링으로 GPU 비용 문제가 발생할 수 있다. 일반적으론 큰 이미지가 작은 이미지보다 높은 비용을 필요로 한다. 최승식 엔지니어는 사례를 해결하는 과정에서 애플이 개발한 엑스코드(Xcode)를 활용했다. 해당 사례가 아이폰7에서 발생한 문제여서다. 보통 프로파일링은 특정 기기가 이용한 앱을 통해 프로파일링하는 게 유리하다. 별도 에디터에서 프로파일링을 하면, 실제 앱에 적용되지 않은 활동과 에디터 활동이 혼용되어 제대로 된 문제를 확인하기 어려울 수 있다.

최승식 엔지니어는 Xcode로 프로파일링한 결과 의도하지 않았던 전체화면 렌더링 비용을 확인했다고 전했다. 화면상으로 작은 이미지가, 실제론 전체화면으로 반영되어서 렌더링 비용이 높게 나타났다. 전체화면에서 보이는 작은 이미지를 제외하면 나머지는 낭비되는 영역이 된다. 문제는 전체화면 사이즈였던 원본 이미지를 필요한 사이즈만큼으로 줄여 해결할 수 있었다.

최승식 엔지니어는 "개발 편의를 위해 전체화면으로 디자인해서 그리는 경우는 프래그먼트(fragment) 비용을 증가시키기 때문에 해당 내용을 인지하고 되도록 필요한 위치에 필요한 영역만큼만 그려 구현해야 한다"고 전했다.

에셋 번들이 추가되는 문제는 메모리 프로파일러(Memory Profiler)의 캡쳐(capture) 기능으로 메모리 정보를 얻고, 중복으로 의심되는 에셋들을 목록에서 찾을 수 있다. 이름이 같거나, 용량이 같은 경우를 의심해볼 수 있다. 최승식 엔지니어는 특히 에셋번들브라우드(AssetBundleBrowser) 경고를 잘 살펴보길 권했다.


최승식 엔지니어는 "주기적으로 코드를 들여다보지 않고, 프로파일링하지 않으면 나중에 문제가 발생할 때 해결하기 굉장히 어려워질 수 있다"라며 "작은 할당이 일어나는 모든 곳을 관찰해야 문제 원인을 찾을 수 있다"고 말했다.