이론/그래픽스

병목(Bottleneck)

tsyang 2021. 11. 3. 00:53

최적화

게임의 성능 최적화를 위해서는 다음의 작업들을 고려할 수 있다.

 

  • 메시의 버텍스 줄이기
  • 텍스처 크기 줄이기
  • 가벼운 쉐이더 사용
  • 드로우콜 줄이기
  • 게임 로직 최적화
  • 물리 연산 줄이기
  • 기타 등등

 

그러나 위 작업들을 수행하기 전에 어디서 병목이 일어나는지를 알아야 한다. 왜냐면 병목이 일어나는 곳 외에서 최적화를 해봤자 전반적인 수행 속도는 크게 바뀌지 않기 때문이다.

 


목표 설정

 

게임의 최적화 목표를 설정할 때 60FPS냐 30FPS냐를 정하는 것을 목표로 삼을 수 있다. 그러나 먼저 기준이 되는 하드웨어 스펙을 정해야 한다. 예를 들어 만드는 게임이 퍼즐게임이라면 가능한 다양한 기기에서 이용 가능하도록 해야 할 것이다. 또한 더 좋은 디바이스라고 해서 병목이 덜 발생할 것이라고 생각할 수 있지만 사실은 그렇지 않다. 가령 최신의 디바이스는 더 높은 해상도를 가지고 있는데 이로 인해서 이전의 기기들과는 다른 곳에서 병목이 발생 할 수 있다.


CPU바운드 vs GPU바운드 

 

병목이 CPU에 있으면 CPU바운드, GPU에 있으면 GPU바운드라고 부른다. 게임 개발 중 발생한 병목이 CPU바운드냐 GPU바운드인지를 파악하는 게 가장 먼저 해야 할 일이다. 

 

CPU와 GPU는 병렬처리 방식이다. 만약 CPU가 GPU보다 일을 먼저 처리했다면 GPU가 일을 끝마칠 때 까지 기다린다.


GPU 병목 탐지

 

1. 필레이트(Fillrate)

GPU에 병목이 발생했다면 높은 확률로 필레이트가 원인이다. 필레이트는 그래픽 카드가 1초에 스크린에 렌더링 할 수 있는 픽셀의 수를 의미한다. 

 

게임 렌더링에서는 픽셀 처리에 대한 부담들을 의미하기도 한다. 즉, 게임 렌더링에서 필레이트란

  • 화면의 픽셀 수
  • 프래그먼트 쉐이더 복잡도
  • 오버드로우

들을 포함한 개념이다.

 

렌더링해아 하는 픽셀이 너무 많거나, 처리해야 하는 프레그먼트 쉐이더가 무거우면 래스터라이저 스테이지에서 병목이 발생되는데 이러한 경우 필레이그 병목이 된다고 말한다.

 

필레이트 병목을 확인하는 방법은 디스플레이의 해상도를 변경해보면 된다. 만약 해상도를 낮췄는데 성능이 대폭 향상된다면 필레이트가 병목일 확률이 높아진다.

 

2. 오버드로우

오버드로우는 화면에 렌더링 되는 픽셀이 여러 번 덧그려지는 현상을 의미한다. 이 때 Z버퍼가 오버드로우를 방지하는데 많은 도움을 준다. 그러나 투명 오브젝트의 경우 필연적으로 오버드로우가 발생한다. 따라서 투명 오브젝트는 가급적 줄이는 것이 좋다. 파티클 역시 오버드로우가 과도하게 발생하는 원인 중 하나이다.

 

3. 포스트 프로세싱

프래그먼트 쉐이더가 무거워지는 요인 중 하나는 바로 포스트 프로세싱이다. 포스트 프로세싱은 픽셀 단위의 처리를 하기 때문에 프래그먼트 쉐이더가 무거워진다.

 

포스트 프로세싱이 주된 병목 원인이라면 해상도를 줄이는 것이 가장 쉬운 해결책 중 하나이다. 

 

4. 업스케일링 샘플링

해상도를 줄이면 여러 병목현상을 쉽게 해결할 수 있지만 게임이 구려보이기 쉽상이다. 이를 보완하기 위해서 UI는 원래 해상도로 렌더링 하고 3D 씬만 낮은 해상도로 렌더링하는 트릭을 사용할 수 있는데 이것을 업스케일링 샘플링이라고 말한다. 

 

저가형 모바일 디바이스의 경우 해상도에 비해 GPU 성능이 낮아 필레이트 병목이 잘 일어나게 된다. 이런 경우에 업스케일링 샘플링이 효과적일 수 있다.

 

5. 폴리곤

씬에 렌더링 되는 버텍스의 수가 많으면(즉, 폴리곤이 많으면) 지오메트리 스테이지에서 병목이 생기게 된다. 버텍스가 많다는 것은 GPU에서 버텍스 쉐이더를 그만큼 많이 수행해야 한다는 뜻이기 때문이다.

 

이 경우에도 버텍스를 줄여서 성능이 크게 향상된다면 버텍스가 병목일 확률이 높아진다고 할 수 있다.

 

LOD(Level of Detail)은 오브젝트의 디테일(=버텍스의 수)를 여러 단계로 나누는 것을 의미한다. 보통 멀리 있는 오브젝트의 경우 LOD를 높혀 처리해야 하는 버텍스 수를 줄여 GPU의 부담을 덜어준다.

 

6. 텍스쳐

텍스쳐가 병목의 원인일 수 있다. 이 경우에는 텍스쳐의 크기가 메모리의 대역폭이 소화할 수 있는 것보다 큰 것이 원인이 된다. 이 경우 텍스처 메모리의 부담을 줄여 해결해야 한다.

 


 

'이론 > 그래픽스' 카테고리의 다른 글

컬링(Culling)  (0) 2021.12.14
배칭(Batching)  (2) 2021.11.15
드로우콜(Draw Call)  (3) 2021.11.13
렌더링 파이프라인  (1) 2021.10.26
곡선(Curve) & 스플라인(Spline)  (2) 2021.07.11