unity 메모리 프로파일링과 메모리 최적화

메모리 프로파일링
요즘 출시되는 안드로이드 스마트폰의 경우 2GB를 장착한 모델이 출시되고 있다. 하지만 최신 모델에만 동작하는 게임을 만들지 않는다면 다양한 하드웨어 사양의 스마트폰에 동작하도록 메모리 사용량을 최적화해야 한다. 최적화의 가장 첫 번째 작업으로 프로파일링을 하게 되는데 iOS, 안드로이드 모두 시스템 메모리 프로파일링이 가능하도록 툴을 제공하고 있다. iOS의 경우 Xcode의 Intruments를 통해(Product → Profile → Allocations 선택), 안드로이드의 경우 DDMS 내에서나 adb shell dumpsys meminfo를 통해 확인할 수 있다.

비디오 메모리의 경우 iOS는 역시 Xcode를 통해(Product → Profile → OpenGL ES Driver 선택, Gart Used Bytes 설정) 확인할 수 있지만 안드로이드의 경우 상황이 좋진 않다. 지원하는 GPU별로 Profiler를 제공하기도 하지만 사용상 제약사항이 있어서 실질적으로 많이 사용되진 않는다. 이를 직접 해보고 싶다면 참고자료에 명시된 NVIDIA의 PerfHUD ES나 Qualcomm의 Adreno Profiler의 링크에서 확인해 보길 바란다.
유니티 메모리 최적화
유니티 스크립트 중에 최적화란 관점에서는 중요한 두 가지 함수가 존재한다. 명시적으로 GC를 호출하는 System.gc.collect와 현재 사용하지 않는 리소스를 해제하는 Resources.Unload UnusedAssets란 함수다. 보통 scene이 바뀌거나 메모리를 한번 비우고 가고 싶을 때 호출하게 되는데 두 함수만 열심히 호출한다고 해서 모든 문제가 해결되는 것은 아니다.

특히 비디오 메모리의 경우 정확한 가용 메모리에 대한 파악이 어려워 일단 문제가 발생하면 화면에 출력되는 모델과 텍스처의 화질을 낮추는 식의 접근을 하게 된다. 필자 또한 비슷한 접근방법을 취했었으나 쉽게 해결되지 않았다. 프로파일링을 거듭한 결과 원인을 발견할 수 있었다.

필자가 개발하던 게임에서는 GUI를 위한 여러 텍스처들이 사용되고 있었는데 몇 개의 텍스처가 NPOT(non power of two)로 제작돼 있었다. OpenGL ES2를 지원하는 최근의 디바이스들은 NPOT 텍스처를 제한적으로 지원하고 있으나 유니티는 호환성을 위해 NPOT 텍스처의 경우 내부적으로 별도의 처리를 하는 것으로 보인다.

프로파일링 결과 POT 대비 2배의 메모리를 사용하는 것으로 생각되는데, 비디오 메모리를 많이 사용하는 게임에서는 특히 유념해야 할 부분이다.

Post a Comment

다음 이전