Version: 2022.3
언어: 한국어
그래픽스 퍼포먼스 및 프로파일링
드로우 콜 최적화

그래픽스 퍼포먼스 기초

이 페이지에는 애플리케이션에서 렌더링 성능을 최적화하기 위한 몇 가지 간단한 가이드라인이 포함되어 있습니다.

시작하기 전에: 문제의 발견과 이해

변경하기 전에 애플리케이션을 프로파일링하여 문제의 원인을 식별해야 합니다. 원인을 파악하기 전에 성능 문제를 해결하려고 하면 시간을 낭비하거나 문제를 더 악화시킬 수 있습니다. 또한 CPU 또는 GPU에서 렌더링 관련 성능 문제가 발생할 수 있습니다. 이러한 문제를 해결하기 위한 전략은 매우 다양하므로 조치를 취하기 전에 문제가 어디에 있는지 파악하는 것이 중요합니다.

Unity Learn 사이트에 있는 다음 문서에는 그래픽스 성능에 대한 종합적인 소개와 문제 식별 및 수정에 대한 정보가 포함되어 있습니다.성능 문제 수정.아직 이 주제에 익숙하지 않다면 이 페이지의 조언을 따르기 전에 문서를 읽어 보십시오.

렌더링의 CPU 비용 감소

일반적으로 CPU 렌더링 시간에 가장 크게 기여하는 요소는 렌더링 커맨드를 GPU로 보내는 비용입니다. 렌더링 커맨드에는 드로우 콜(지오메트리를 드로우하는 커맨드)과 지오메트리를 드로우하기 전에 GPU에서 설정을 변경하는 커맨드가 포함됩니다. 이 경우 다음 옵션을 고려하십시오.

  • Unity에서 렌더링하는 오브젝트의 수를 줄일 수 있습니다.
    • 씬의 전체 오브젝트 수를 줄이는 것을 고려합니다. 예를 들어 스카이박스를 사용하여 원거리 지오메트리 효과를 만들 수 있습니다.
    • Unity가 오브젝트를 더 적게 드로우하도록 엄격한 컬링을 수행합니다. Unity가 다른 오브젝트 뒤에 숨겨진 오브젝트를 드로우하는 것을 방지하려면 오클루전 컬링을 사용하고 카메라의 원거리 클립 평면을 줄여 더 멀리 있는 오브젝트가 절두체 밖으로 떨어지도록 합니다. 또는 오브젝트를 별도의 레이어에 넣고 Camera.layerCullDistances를 사용하여 레이어별 컬링 거리를 설정하는 더 세분화된 접근 방식이 있습니다.
  • Unity가 각 객체를 렌더링하는 횟수를 줄일 수 있습니다.
    • 라이트매핑을 사용하여 적절한 경우 조명과 그림자를 "베이크" (사전 계산)합니다. 이렇게 하면 빌드 시간, 런타임 메모리 사용량, 스토리지 공간이 증가하지만 런타임 성능이 향상될 수 있습니다.
    • 애플리케이션에서 포워드 렌더링을 사용하는 경우 오브젝트에 영향을 미치는 픽셀당 실시간 광원 수를 줄입니다. 자세한 내용은 포워드 렌더링 경로를 참조하십시오.
    • 실시간 그림자는 매우 리소스 집약적일 수 있으므로 신중하고 효율적으로 사용합니다. 자세한 내용은 그림자 문제 해결: 그림자 퍼포먼스를 참조하십시오.
    • 애플리케이션에서 반사 프로브를 사용할 경우 최적화하여 사용해야 합니다. 자세한 내용은 반사 프로브 성능을 참조하십시오.
  • Unity가 렌더링 커맨드를 준비하고 전송하기 위해 수행해야 하는 작업의 양을 줄일 수 있습니다. 일반적으로 커맨드를 더 효율적인 “배치”로 GPU에 보내면 됩니다. 이를 달성하기 위한 몇 가지 방법이 있습니다. 자세한 내용은 드로우 콜 최적화를 참조하십시오.

이러한 접근 방식 중 대부분은 GPU에 필요한 작업도 줄여줍니다. 예를 들어 Unity가 프레임에서 렌더링하는 전체 오브젝트 수를 줄이면 CPU와 GPU의 워크로드가 모두 줄어듭니다.

렌더링의 GPU 비용 감소

GPU가 프레임을 렌터링하는 작업을 제 시간에 완료하지 못하는 이유는 크게 세 가지가 있습니다.

애플리케이션이 필레이트에 의해 제한되면 GPU는 처리할 수 있는 것보다 더 많은 프레임당 픽셀을 드로우하려고 합니다. 이 경우 다음 옵션을 고려하십시오.

  • 애플리케이션에서 오버드로우를 식별하고 줄입니다. 오버드로우의 가장 일반적인 원인은 UI, 파티클, 스프라이트와 같은 투명 요소가 겹치는 것입니다. Unity 에디터에서 오버드로우 드로우 모드를 사용하여 해당 문제가 있는 영역을 식별합니다.
  • 프래그먼트 셰이더의 실행 비용을 줄입니다. 셰이더 성능에 대한 자세한 내용은 셰이더 성능 페이지를 참조하십시오.
  • Unity의 빌트인 셰이더를 사용하는 경우 Mobile 이나 Unlit 의 카테고리에서 선택합니다. 비모바일 플랫폼에서도 작동은 하지만 복잡한 셰이더를 단순화시키고 비슷하게 만듭니다.
  • 다이내믹 해상도는 개별 렌더 타겟을 동적으로 확대/축소할 수 있는 Unity 기능입니다.

애플리케이션이 메모리 대역폭에 의해 제한되면 GPU는 프레임에서 처리할 수 있는 것보다 더 많은 데이터를 전용 메모리에 읽고 쓰려고 합니다. 이것은 일반적으로 텍스처가 너무 많거나 텍스처가 너무 크다는 것을 의미합니다. 이 경우 다음 옵션을 고려하십시오.

  • 런타임 시 카메라와 거리가 변하는 텍스처(예: 3D 씬에서 사용되는 대분분의 텍스처)에 대해 밉맵을 활성화합니다. 이렇게 하면 해당 텍스처의 메모리 사용량과 스토리지 공간이 증가하지만 런타임 GPU 성능이 향상될 수 있습니다.
  • 적합한 압축 포맷을 사용하여 메모리의 텍스처 크기를 줄이고 이에 따라 로딩 시간과 메모리 사용을 줄이며 GPU 렌더링 성능을 향상시킬 수 있습니다. 압축 텍스처는 비압축 텍스처에 필요한 메모리 대역폭과 비교해보았을 때 일부분을 사용하는 정도에 그칩니다.

애플리케이션이 버텍스 프로세싱에 의해 제한되는 경우 이것은 GPU가 프레임에서 처리할 수 있는 것보다 더 많은 버텍스를 처리하려고 함을 의미합니다. 이 경우 다음 옵션을 고려하십시오.

  • 버텍스 셰이더의 실행 비용을 줄입니다. 셰이더 성능에 대한 자세한 내용은 셰이더 성능 페이지를 참조하십시오. 지오메트리 최적화: 필요 이상으로 삼각형을 사용하지 않고 UV 매핑의 경계 부분과 하드 에지(버텍스가 두 배)의 수를 가능한 적게 유지합니다. 자세한 내용은 최적의 성능을 위한 모델 생성을 참조하십시오.
  • 디테일 수준(LOD) 시스템을 사용합니다.

렌더링의 빈도 감소

경우에 따라 렌더링 프레임 속도를 줄이는 것이 애플리케이션에 도움이 될 수 있습니다. 또한 단일 프레임을 렌더링하는 CPU나 GPU 비용은 줄어들지 않지만 다른 작업(예; 스크립트 실행)의 빈도에 영향을 주지 않고 Unity가 렌더링하는 빈도를 줄일 수 있습니다.

애플리케이션의 일부 또는 전체 애플리케이션의 렌더링 프레임 속도를 줄일 수 있습니다. 렌더링 프레임 속도를 줄여 불필요한 전력 사용을 방지하고 배터리 수명을 연장하며 기기 온도가 CPU 주파수가 제한될 수 있는 지점까지 상승하는 것을 방지합니다. 이 제한은 핸드헬드 기기에서 특히 유용합니다.

프로파일링 결과 렌더링 시 애플리케이션 리소스의 상당 부분을 소비하는 것으로 판명된 경우 애플리케이션의 어떤 부분에서 이점을 얻을 수 있는지 따져봐야 합니다. 일반적인 사용 사례로는 메뉴나 일시 중지 화면, 게임이 입력을 기다리고 있는 턴제 게임, 자동차 UI와 같이 대부분의 콘텐츠가 정적인 애플리케이션이 해당합니다.

입력 지연을 방지하기 위해 입력 중에 렌더링 프레임 속도을 일시적으로 높여 반응성이 유지되도록 할 수 있습니다.

렌더링 프레임 속도를 조정하려면 OnDemandRendering API를 사용합니다. API는 Adaptive Performance 패키지에서 특히 잘 작동합니다.

참고: VR 애플리케이션은 온디맨드 렌더링을 지원하지 않습니다. 프레임마다 렌더링하지 않으므로 시각 요소가 머리 움직임과 일치하지 않게 되고, 이로 인해 멀미가 발생할 수도 있습니다.

그래픽스 퍼포먼스 및 프로파일링
드로우 콜 최적화