CPU 또는 GPU의 렌더링 작업 줄이기
이 페이지에는 애플리케이션에서 렌더링 성능을 최적화하기 위한 몇 가지 간단한 가이드라인이 포함되어 있습니다.
시작하기 전에: 문제의 발견과 이해
변경 사항을 적용하기 전에 애플리케이션을 프로파일링하여 문제의 원인을 식별해야 합니다. 원인을 이해하기 전에 성능 문제를 해결하려고 하면 시간을 낭비하거나 문제를 악화시킬 수 있습니다. 또한 CPU 또는 GPU에서 렌더링 관련 성능 문제가 발생할 수 있습니다. 이러한 문제를 해결하기 위한 전략은 매우 다양하므로 어떤 조치를 취하기 전에 문제가 있는 부분을 이해하는 것이 중요합니다.
Unity Learn 사이트의 다음 문서에서는 그래픽스 퍼포먼스에 대한 포괄적인 소개를 제공하며, 문제를 식별하고 해결하는 방법에 대한 정보를 제공합니다. 성능 문제 해결 문서를 참조하십시오. 이 주제에 대해 아직 익숙하지 않다면 이 페이지의 조언을 따르기 전에 문서를 읽으십시오.
렌더링의 CPU 비용 감소
일반적으로 CPU 렌더링 시간에 가장 큰 영향을 미치는 요소는 렌더링 커맨드를 GPU로 전송하는 비용입니다. 렌더링 커맨드는 드로우 콜(지오메트리 드로우 커맨드)과 지오메트리를 드로우하기 전에 GPU의 설정을 변경하는 커맨드가 포함됩니다. 이 경우 다음 옵션을 고려하십시오.
- Unity에서 렌더링하는 오브젝트의 수를 줄일 수 있습니다.
- 씬의 전체 오브젝트 수를 줄이는 것을 고려합니다. 예를 들어 스카이박스를 사용하여 원거리 지오메트리 효과를 만들 수 있습니다.
- Unity가 오브젝트를 더 적게 드로우하도록 더 엄격한 컬링을 수행합니다. Unity가 다른 오브젝트 뒤에 숨겨진 오브젝트를 드로우하는 것을 방지하려면 오클루전 컬링을 사용하고 카메라의 원거리 클립 평면을 줄여 더 멀리 있는 오브젝트가 절두체 밖으로 떨어지도록 합니다. 또는 오브젝트를 별도의 레이어에 넣고 Camera.layerCullDistances를 사용하여 레이어별 컬링 거리를 설정하는 더 세분화된 접근 방식이 있습니다.
- Unity가 각 오브젝트를 렌더링하는 횟수를 줄일 수 있습니다.
- 해당하는 경우 조명과 그림자를 ‘베이크’(사전 계산)하려면 라이트매핑을 사용하십시오. 이렇게 하면 빌드 시간, 런타임 메모리 사용량, 스토리지 공간이 늘어나지만 런타임 성능이 향상될 수 있습니다.
- 애플리케이션에서 포워드 렌더링을 사용하는 경우 오브젝트에 영향을 미치는 픽셀당 실시간 광원의 수를 줄입니다. 자세한 내용은 포워드 렌더링 경로를 참조하십시오.
- 실시간 그림자는 리소스를 매우 많이 소모할 수 있으므로 최소한으로, 효율적으로 사용하십시오. 자세한 내용은 그림자 문제 해결: 그림자 성능을 참조하십시오.
- 애플리케이션에서 반사 프로브를 사용하는 경우 반사 프로브 사용을 최적화해야 합니다. 자세한 내용은 반사 프로브 성능을 참조하십시오.
- 일반적으로 더 효율적인 ‘배치’로 GPU에 렌더링 커맨드를 전송하여 Unity가 준비하고 전송해야 하는 작업량을 줄일 수 있습니다. 이를 위한 몇 가지 방법이 있습니다. 자세한 내용은 드로우 콜 최적화를 참조하십시오.
이러한 접근 방식 중 대부분은 GPU에 필요한 작업도 줄여줍니다. 예를 들어 Unity가 프레임에서 렌더링하는 전체 오브젝트 수를 줄이면 CPU와 GPU의 워크로드가 모두 줄어듭니다.
렌더링의 GPU 비용 감소
GPU가 프레임을 렌터링하는 작업을 제 시간에 완료하지 못하는 이유는 크게 세 가지가 있습니다.
애플리케이션이 필 레이트에 의해 제한되면 GPU는 처리할 수 있는 것보다 더 많은 프레임당 픽셀을 드로우하려고 합니다. 이 경우 다음 옵션을 고려하십시오.
- 애플리케이션에서 오버드로우를 식별하고 줄입니다. 일반적으로 오버드로우에 가장 큰 영향을 미치는 요소는__ UI__(사용자 인터페이스) 사용자가 애플리케이션과 상호 작용하도록 해 줍니다. Unity는 현재 3개의 UI 시스템을 지원합니다. 자세한 정보
See in Glossary, 파티클, 스프라이트와 같은 투명 요소의 중복입니다. Unity 에디터에서 이 문제가 있는 영역을 식별하려면 Overdraw Draw 모드를 사용합니다.
- 프래그먼트 셰이더의 실행 비용을 줄입니다. 셰이더 성능에 대한 자세한 내용은 셰이더 성능 페이지를 참조하십시오.
- Unity의 빌트인 셰이더를 사용하는 경우, Mobile 또는 Unlit 카테고리 중에서 선택하십시오. 모바일이 아닌 플랫폼에서도 작동하지만, 더 복잡한 셰이더의 단순화 및 근사화된 버전입니다.
-
다이내믹 해상도는 개별 렌더 타겟을 동적으로 확대/축소할 수 있는 Unity 기능입니다.
애플리케이션이 메모리 대역폭으로 제한되는 경우 GPU는 프레임에서 처리할 수 있는 것보다 더 많은 데이터를 전용 메모리에 읽고 쓸 수 있습니다. 이는 일반적으로 텍스처가 너무 많거나 너무 크다는 의미입니다. 이 경우 다음 옵션을 고려하십시오.
- 런타임 시 카메라와의 거리가 달라지는 텍스처(예: 3D 씬에서 사용되는 대부분의 텍스처)에 대해 밉맵을 활성화합니다. 이렇게 하면 이러한 텍스처의 메모리 사용량과 스토리지 공간이 증가하지만 런타임 GPU 성능이 향상될 수 있습니다.
- 메모리에 있는 텍스처의 크기를 줄이려면 적절한 압축 포맷을 사용하십시오. 이렇게 하면 로드 시간이 단축되고 메모리 사용량이 줄어들며 GPU 렌더링 성능이 향상될 수 있습니다. 압축된 텍스처는 압축되지 않은 텍스처에 필요한 메모리 대역폭의 일부만 사용합니다.
애플리케이션이 버텍스 프로세싱에 의해 제한되는 경우 이는 GPU가 프레임에서 처리할 수 있는 것보다 더 많은 버텍스를 처리하려고 함을 의미합니다. 이 경우 다음 옵션을 고려하십시오.
- 버텍스 셰이더의 실행 비용을 줄입니다. 셰이더 성능에 대한 자세한 내용은 셰이더 성능 페이지를 참조하십시오.
- 지오메트리 최적화: 필요 이상으로 삼각형을 사용하지 않고 UV 매핑의 경계 부분과 하드 에지(버텍스가 두 배)의 수를 가능한 한 적게 유지합니다. 자세한 내용은 최적의 성능을 위한 모델 생성을 참조하십시오.
-
디테일 수준(LOD) 시스템을 사용합니다.
렌더링의 빈도 감소
경우에 따라 렌더링 프레임 속도를 줄이는 것이 애플리케이션에 도움이 될 수 있습니다. 또한 단일 프레임을 렌더링하는 CPU나 GPU 비용은 줄어들지 않지만 다른 작업(예: 스크립트 실행)의 빈도에 영향을 주지 않고 Unity가 렌더링하는 빈도를 줄일 수 있습니다.
애플리케이션의 일부 또는 전체 애플리케이션의 렌더링 프레임 속도를 줄일 수 있습니다. 렌더링 프레임 속도를 낮추면 불필요한 전력 사용을 방지하고 배터리 수명을 연장하며, CPU 주파수가 스로틀링될 수 있는 지점까지 기기 온도가 올라가지 않습니다. 이는 핸드헬드 기기에서 특히 유용합니다.
프로파일링을 통해 렌더링이 애플리케이션의 리소스를 상당히 많이 소모한다는 사실을 파악했다면, 애플리케이션의 어떤 부분에서 이점을 얻을 수 있는지 생각해 보십시오. 일반적인 사용 사례로는 메뉴나 일시 정지 화면, 게임이 입력을 대기하는 턴제 게임, 콘텐츠가 대부분 정적인 애플리케이션(예: 자동차 UI)이 있습니다.
입력 지연을 방지하기 위해 입력 중에 렌더링 프레임 속도을 일시적으로 높여 반응성이 유지되도록 할 수 있습니다.
렌더링 프레임 속도를 조정하려면 OnDemandRendering API를 사용합니다. 이 API는 특히 Adaptive Performance 패키지와 잘 작동합니다.
참고: VR 애플리케이션은 온디맨드 렌더링을 지원하지 않습니다. 프레임마다 렌더링하지 않으므로 시각적 요소가 머리 움직임과 일치하지 않게 되고, 이로 인해 멀미가 발생할 수도 있습니다.
추가 리소스