PART3.병목(Bottleneck)
도서 "유니티 그래픽스 최적화 스타트업"을 읽고 개인공부용으로 간단하게 정리한자료입니다.
- 병목의개념
병목이란 일반적으로 음료수병이나 페트병의 입구는 좁게 만들어져 있는데 이는 물병안의 공간이 크더라도 작은 병목을 통하여 나오는 물양을 조절할수 있게 하기 위함인데 이러한 현상에 빗대어
전체 프로세스가 갑자기 느려지거나 막혀서 정지하는 원인이나 장소를 병목이라고 부르며 전체 시스템의 성능이나 용량이 특정 구성 요소로 인해 제한되는 현상이 발생하면 병목현상이 발생했다고 한다.
성능 최적화를 위해 가장 우선되어야 할 사항은 병목을 탐지하느것으로 병목을 고려하지 않고 최적화하는것은 효율이 떨어진다.
- FPS VS Frame Time
프로파일링 할때는 FPS보다는 한 프레임을 처리하는데 걸리는 시간을 측정하는 프레임 타임을 프로파일링하는것이 좋다.
-프레임 타임이란 ?
프레임이 시작되면 해당 프레임에 필요한 연산을 수행하고 최종적으로 화면에 출력하는데 걸린 총시간
- 구간 측정
FPS로만 확인하면 성능의 최종 결과만 알 수 있지만 프레임 타임으로 측정하면 구간당 걸린 시간을 나누어 생각 할 수 있다. 예를 들어 A,B,C의 함수가 실행될때 A : 1ms, B : 2ms, C : 10ms 가 걸렸다고 하면 C를 최적화하는것이 가장 효율적이라는 결론이 나온다.
- 선형 측정
가장 보편적이고 손쉽게 성능을 측정할 수 있는 기준은 FPS이긴 하나 FPS측정 값은 결과 분석에 혼동을 줄수있다
예를들어 오브젝트 1개에서 90FPS였는데 오브젝트 2개가되니 45FPS 3개가 되니 30FPS 이런식으로 감소했다고 할때
FPS로만 판단하면 비 선형적으로 비용이 증가한것처럼 보이지만 실제로 프레임타임으로 환산해본다면
1개 : 90FPS = 1000/90.0 = 11.1ms
2개 : 45FPS = 1000/45.0 = 22.2ms
3개 : 30FPS = 1000/30.0 = 33.3ms
이와같이 오브젝트 1개당 프레임타임이 11.1ms씩 일정하게 선형적으로 증가하지만 FPS로만 볼경우 45 15씩 비선형적으로 감소하는것처럼 보이게된다.
이런 혼동을 방지하기 위해 오브젝트로인한 프레임 변화량을 정확하게 측정하려면 프레임타임으로 측정해야 한다.
- Traget Frame Rate
모바일 디바이스는 쓰로틀링 상태로 진입하는 상황이 빈번하기때문에 쓰로틀링 상태가 가급적 되지 않도록 게임을 최적화 시키는부분이 중요하다. 단적인 예로 성능이 충분히 나오더라도 최대 FPS를 40으로 강제로 고정시켜 프로세서가 잠시 쉬는 시간을 주는 경우의 최적화도 존재한다.
유니티에서는 Application.targetFrameRate = 40 이런식으로 설정하면 최고 FPS를 강제로 설정할 수 있다.
- CPU 바운드 VS GPU 바운드
게임의경우 연산이 CPU와GPU 모두에서 일어나므로 병목이 CPU에서 발생할수도 GPU에서 발생 할 수도있다. 병목이 GPU에 몰려있으면 GPU바운드 CPU에 몰려있으면 CPU바운드라 표현한다.
따라서 게임 및 리얼타임 렌더링 어플리케이션에서 병목을 파악알때는 CPU 바운드인지 GPU 바운드인지부터 시작해야한다.