yhc509

유니티 그래픽스 최적화 스타트업 (1) - Profiling, GPU

·6 min read

프로파일링

  • FPS(구간의 평균)가 아니라 한 프레임(특정 시점)당 걸린 시간을 기준으로 보는 것이 좋다.
  • Rendering Path가 Deferred 이면 씬의 복잡도에 상관없이 기본적으로 비용이 크다.
    • 후처리 효과 (DOF, Bloom)도 기본적으로 비용이 크다.
  • 유니티 내장 프로파일러에서 WaitForTargetFPS : 쓰로틀링을 막기 위해 일부러 쉬어주는 시간
  • 수직동기화(Vsync)
    • 티어링(Tearing) : 모니터가 화면 갱신 주파수의 한계로 화면이 물결처럼 보이는 현상
    • 티어링을 방지하기 위해 모니터 주파수에 맞게끔 렌더링 퍼포먼스를 조정해준다. 프로파일링을 할 때는 끄는 것이 좋다. (Edit → Project Settings → Quality = Don`t Sync)
  • Edit → Project Settings → Quality 에서 플랫폼별 레벨 설정이 가능
  • 쓰로틀링을 고려하여 측정한다
    • 타겟 디바이스가 얼마나 빠르게 쓰로틀링 상태에 진입하는지, 어느 정도의 성능 하락이 일어나는지.
    • 배터리 잔량이 낮으면 저전력모드. 충전 중일 때는 온도가 높아질 수 있음.
    • 측정 후 다음 측정까지 5분정도의 쿨타임 필요
  • 병목이 CPU / GPU 어디에 몰리느냐를 인지해야 한다. (CPU바운드 / GPU바운드)
  • Development Build = 각종 오버헤드가 포함되어 있음
  • Device.Present = CPU가 GPU의 일처리가 끝날 때까지 기다리는 시간

GPU Debugging

  • Android : Vulkan 지원. OpenGL ES는 엔비디아와 인텔만 지원
  • iOS : XCode GPU Frame Debugger를 사용
  • 필레이트(Fillrate) : 그래픽카드가 1초에 렌더링 할 수 있는 픽셀 수.
    • 해상도를 줄이면 쉽게 해결 가능
  • 오버드로우(Overdraw) : 화면에 픽셀이 여러번 덧그려지는 현상
    • 불투명 오브젝트는 카메라를 기준으로 앞에서 뒤의 순서로 그린다.
    • 투명 오브젝트는 뒤에서 앞으로 정렬한다. 모든 픽셀에서 오버드로우가 발생한다.
    • 파티클 밀도가 높을수록 오버드로우가 발생한다.
    • 씬 뷰에서 좌측상단 Draw모드를 Overdraw로 확인할 수 있다.
  • 포스트 프로세싱(Post Processing)
    • 픽셀 단위로 처리됨 = 해상도를 줄이면 쉽게 해결 가능.
    • 종류 별로 비용이 다르다.
    • DOF(Depth Of Field)
      • 비용이 특히 크다. 컷씬이나 로비에서 사용하는 것이 좋다.
      • 프레그먼트 셰이더 뿐 아니라 드로우콜이 늘어나는 원인.
  • 업스케일링 샘플링(Upscale Sampling)
    • 해상도를 줄이면 유저가 저해상도임을 알아차리기 쉽다.
    • 꼼수로 UI는 원래 해상도, 3D씬만 낮은 해상도로 렌더링 할 수 있다.
      1. 저해상도 렌더텍스쳐를 생성한다.
      2. 3D씬을 렌더 텍스쳐에 렌더링한다.
      3. 렌더 텍스쳐를 업스케일링하여 현재 백 버퍼에 렌더링한다.
      4. 오버레이 UI를 렌더링한다.
  • 폴리곤(Polygon)
    • 버텍스 수가 많으면 = 폴리곤이 많으면 렌더링 파이프라인의 지오메트리 단계에서 병목이 발생.
    • LOD (Level Of Detail)
      • 오브젝트가 카메라에 멀리 떨어져있거나, 화면을 차지하는 비율이 적으면 디테일을 떨어뜨림.
      • 원본 메시보다 적은 수의 폴리곤을 사용해도 티가 안남.
      • LOD용 메시를 자동으로 만들어주는 툴 등을 활용하자.
      • Edit → Project Settings → Quality에서 LOD Bias(화면 내 차지 비율)를 조절
  • 텍스쳐(Texture)
    • 메모리에 큰 영향을 줌.
    • Edit → Project Settings → Quality 에서 전체 텍스쳐 해상도 조절 가능

참고 자료