Version: 2022.2
언어: 한국어
그래픽스 퍼포먼스 기초
GPU 인스턴싱

드로우 콜 최적화

스크린에 지오메트리를 드로우하기 위해 Unity는 그래픽스 API에 드로우 콜을 실행합니다. 드로우 콜은 그래픽스 API가 그릴 내용과 그릴 방법을 알려줍니다. 각 드로우 콜에는 텍스처, 셰이더, 버퍼에 대한 정보와 같이 그래픽스 API가 스크린에 그려야할 모든 정보가 포함되어 있습니다. 드로우 콜은 리소스를 많이 소모하지만 간혹 드로우 콜 자체보다 드로우 콜에 대한 준비가 더 많은 리소스를 소모하기도 합니다.

드로우 콜을 준비하려면 CPU는 리소스를 설정하고 GPU에 대한 내부 설정을 변경합니다. 이러한 설정을 전체적으로 렌더 상태라고 부릅니다. 다른 머티리얼로 전환하는 것과 같이 렌더 상태를 변경하는 것은 그래픽스 API가 수행하는 작업 중 리소스 소모가 가장 큰 작업입니다.

렌더 상태 변경에 리소스가 많이 소모되기 때문에 이를 최적화하는 것이 중요합니다. 렌더 상태 변경을 최적화하는 주요 방법은 수를 줄이는 것입니다. 다음의 두 가지 방법으로 렌더 상태 변경 수를 줄일 수 있습니다.

  • 드로우 콜 전체 수를 줄입니다. 드로우 콜 수를 줄이면 드로우 콜 간의 렌더 상태 변경 수도 줄어듭니다.
  • 드로우 콜을 렌더 상태 변경 수를 줄이는 방식으로 구성합니다. 그래픽스 API가 동일한 렌더 상태를 사용하여 다수의 드로우 콜을 수행하는 경우 드로우 콜을 그룹화하여 렌더 상태 변경 수만큼 작업을 수행하지 않아도 됩니다.

드로우 콜과 렌더 상태 변경을 최적화하면 애플리케이션에 많은 이점이 생깁니다. 주로 프레임 횟수를 향상시키지만 또한 다음의 이점도 발생합니다.

  • 애플리케이션에 필요한 전력량을 줄입니다. 배터리를 사용하는 기기의 경우 이는 배터리가 소모되는 속도를 줄여줍니다. 또한 기기에서 애플리케이션 실행 시 발열량을 줄여줍니다.
  • 애플리케이션의 향후 개발에 대한 유지보수성을 향상시킵니다. 드로우 콜과 렌더 상태 변경을 더 일찍 최적화하고 최적화 레벨에서 유지하면 성능에 오버헤드를 크게 발생하지 않고도 씬에 더 많은 게임 오브젝트를 추가할 수 있습니다.

드로우 콜과 렌더 상태 변경을 최적화하기 위해 Unity에서 사용할 수 있는 몇 가지 메서드가 있습니다. 일부 메서드는 다른 메서드보다 특정 씬에 더욱 적합합니다. 다음은 Unity에서 사용할 수 있는 메서드입니다.

  • GPU 인스턴싱: 동시에 동일한 메시 사본을 여러 개 렌더링합니다. GPU 인스턴싱은 나무나 덤불과 같이 씬 내에 여러 번 나타나는 지오메트리를 그리는 데 유용합니다.
  • 드로우 콜 배칭: 메시를 결합하여 드로우 콜을 줄입니다. Unity는 다음과 같은 빌트인 드로우 콜 배칭 타입을 제공합니다.
    • 정적 배칭: 정적 게임 오브젝트의 메시를 미리 결합합니다. Unity는 결합된 데이터를 GPU로 보내지만 결합 상태인 각 메시를 개별적으로 렌더링합니다. Unity는 여전히 메시를 개별적으로 컬링할 수 있지만 각 드로우 콜은 데이터 상태가 전혀 변경되지 않았기 때문에 리소스를 더 적게 소모합니다.
    • 동적 배칭: CPU에서 메시 버텍스를 변환하고 동일한 설정을 공유하는 버텍스를 그룹화하여 하나의 드로우 콜로 렌더링합니다. 버텍스는 동일한 수와 타입의 속성을 저장할 경우 동일한 설정을 공유합니다. 예를 들어 positionnormal이 있습니다.
  • 메시 수동 결합: Mesh.CombineMeshes 함수를 사용하여 여러 메쉬를 단일 메쉬로 수동 결합합니다. Unity는 결합된 메시를 메시당 하나의 드로우 콜 대신 단일 드로우 콜로 렌더링합니다.
  • SRP 배처: 프로젝트에서 스크립터블 렌더 파이프라인(SRP)을 사용하는 경우 SRP 배처를 사용하여 Unity가 동일한 셰이더 배리언트를 사용하는 머티리얼에 대한 드로우 콜을 준비하고 디스패치하는 데 필요한 CPU 시간을 줄입니다.

최적화 우선순위

동일한 씬에서 여러 드로우 콜 최적화 메서드를 사용할 수 있지만 Unity는 특정 순서로 드로우 콜 최적화 메서드의 우선 순위를 지정합니다. 두 개 이상의 드로우 콜 최적화 메서드를 사용하도록 게임 오브젝트를 표시하면 Unity는 가장 높은 우선 순위 메서드를 사용합니다. 이에 대한 유일한 예외는 SRP 배처입니다. SRP 배처를 사용할 때 Unity는 SRP 배처와 호환되는 게임 오브젝트에 대한 정적 배칭도 지원합니다. Unity는 다음 순서로 드로우 콜 최적화의 우선 순위를 지정합니다.

  1. SRP 배처와 정적 배칭
  2. GPU 인스턴싱
  3. 동적 배칭

정적 배칭을 위해 게임 오브젝트를 표시하고 Unity가 성공적으로 배치하면 렌더러가 인스턴싱 셰이더를 사용하더라도 해당 게임 오브젝트에 대해 GPU 인스턴스싱을 비활성화합니다. 이 경우 인스펙터 창에 정적 배칭을 비활성화하라는 경고 메시지가 표시됩니다. 마찬가지로 Unity가 메시에 GPU 인스턴싱을 사용할 수 있는 경우 해당 메시에 대한 동적 배칭을 비활성화합니다.

그래픽스 퍼포먼스 기초
GPU 인스턴싱