[Unity]유니티 최적화 기법 병목 파악하기
이 글은 오지현 님의 '유니티 그래픽스 최적화 스타트업'의 내용을 보고 정리한 내용입니다.
유니티 최적화 기법 병목 파악하기
병목이란?
물병 안의 공간이 크더라도 작은 병목을 통하면 적은 양의 물이 나오게 된다.
이러한 현상에 빗대어 전체 프로세스가 갑자기 느려지거나 막혀서 정지하는 원인이나 장소를 병목(bottleneck)이라고 부르며, 전체 시스템의 성능이나 용량이 하나의 구성 요소로 인해 제한받는 현상이 발생하면 병목 현상이 발생했다고 한다.
타깃 선정
게임 성능은 60 FPS로 맞추는 게 일반적이긴 하지만 아닌 경우도 있고 요새는 퀄리티를 선택하고 프레임을 포기하는 경우도 있다.
최적화 방향을 결정할 때 가장 중요한 것은 FPS값보다는 게임의 타깃 기기를 결정하는 게 더 중요함.
흔히 더 좋은 디바이스에서 동일한 게임이 더 높은 성능이 나올 거라 생각하지만, 반드시 그렇지는 않다.
한 사례로 어떤 게임은 아이패드2와 아이패드3에서 게임을 테스트해 본 결과, 더 높은 스펙인 아이패드3에서 오히려 게임 성능이 낮게 나왔다. 하드웨어 스펙은 더 높음에도 불구하고 말이다.
원인은 해상도에 있었다. 해상도가 1024768에서 10481536으로 업그레이드됨으로써 처리해야 할 픽셀의 수가 늘어나게 된 것이다. 즉 아이패드3에서는 픽셀 처리가 병목이 된 것이다.
FPS vs Frame Time
FPS(Frame per second) : 1초 동안 보여주는 화면의 수
Frame Time : 1 프레임을 처리하는데 걸리는 시간
프로파일링 할 때는 FPS(Frame per second)보다는 한 프레임을 처리하는데 걸리는 시간을 측정하는 프레임 타임(Frame Time)으로 프로파일링을 하는 것이 좋다.
FPS : 자동차에 비유하면 출발지에서 도착 지점으로 이동하는 데 얼마나 많은 시간이 걸리는가를 측정하는 것과 같다. 예를 들어 30km를 이동하는데 30분이 걸렸다면 평균 시속은 60km가 되는 것.
즉 이러한 경우 FPS로만 확인하면 성능의 최종 결과만 알 수 있다.
하지만 프레임 타임으로 측정하면 구간당 걸린 시간을 나누어 측정할 수 있다.
한 프레임 동안 A함수, B함수, C함수가 순차적으로 실행된다고 가정하면 A함수 1ms, B함수 2ms, C함수 10ms가 걸리는 것으로 확인이 된다면 C함수를 최적화하는 것이 가장 효율적이라는 결론을 도출할 수 있지만 FPS로 했을 때 이러한 항목별 측정이 불가능하다. 그래서 Frame Time이 좋다.
선형적 측정
보편적이고 손쉽게 성능을 측정하는 기준이 FPS이긴 하다. 하지만 FPS측정값은 결과 분석을 헷갈리게 할 수 있다.
Frame Time 보는 게 더 직관적이다 왜냐?
FPS를 성능 측정값으로 쓸 때 가장 큰 문제점은 이 수치가 비선형적이기 때문이다.
예를 들면.
게임이 90 FPS로 구동되고 있다. → 오브젝트를 하나 추가함 → 30FPS → 하나 더 추가 → 22.5 FPS → 하나 더 추가 → 18 FPS
오브젝트를 추가할 때마다 성능 변화량이 45 FPS, 15 FPS, 7.5 FPS, 4.5 FPS로 변화한 것이다. 변화량이 일정하지 않다. 동일한 오브젝트를 추가했지만 성능 변화량이 동일하지 않다면 이것은 예상한 결과랑 다를 것이다.
사실 이런 경우도 오브젝트가 2개 추가되든 4개 추가되든 오브젝트 하나당 소모되는 비용은 똑같다.
FPS를 Frame Time으로 환산해보면 다음과 같다.
우선 30FPS는 1초에 30프레임을 그린다는 의미이고, 즉 한 프레임을 그릴 때 평균적으로 1/30초가 걸린다는 뜻이다. 프레임 타임은 한 프레임을 그리는 데 걸리는 시간은 1을 FPS값으로 나눈 값이 되는 것이다.
frame time : 1000 / FPS
오브젝트 1개 : 90FPS = 1000/90.0 = 11.1ms
오브젝트 2개 : 45.0FPS = 1000/45.0 = 22.2ms
오브젝트 3개 : 30.0FPS = 1000/30.0 = 33.3ms
오브젝트 4개 : 22.5FPS = 1000/22.5 = 44.4ms
프레임타임으로 측정할 경우 오브젝트 하나가 추가될 때마다 11.1ms씩 일정하게 선형적으로 증가하는걸 볼 수 있다. 하지만 이를 FPS로 보게 되면 일정한 수치가 아닌 비선형적인 수치로 보이게 된다.
FPS와 프레임 타임 수치에는 차이가 있다.
코드나 씬 구성 변화에 따른 성능 변화를 측정할 때 FPS 수치를 기준으로 삼는다면 비선형적인 수치로 인해 혼동을 초래할 수 있다. 따라서 프레임 타임으로 측정해야 제대로 측정이 가능하다.
https://github.com/ozlael/FPSCheckerSample