본문 바로가기

유니티/최적화

[유니티 최적화] 반사 프로브 성능 및 최적화

728x90
반응형

반사 프로브 큐브맵 렌더링은 다음과 같은 이유로 상당한 프로세서 시간이 소요됩니다.

 

  1. 큐브맵의 여섯 면을 각각 프로브의 원점에서 “카메라”를 사용하여 개별적으로 렌더링해야 합니다.
  2. 각 반사 바운스 레벨마다 각기 다른 시간에 프로브를 렌더링해야 합니다. 자세한 내용은 고급 반사 프로브 문서를 참조하십시오.
  3. 광택 반사를 표현하려면 큐브맵의 여러 밉맵 레벨이 블러링 프로세스를 거쳐야 합니다.

프로브를 렌더링하는 데 소요되는 시간은 에디터의 베이크 워크플로는 물론 더 중요한 플레이어의 런타임 성능에 영향을 미칩니다. 

아래에서는 반사 프로브가 성능에 미치는 영향을 최소화하기 위한 유용한 팁을 몇 가지 소개합니다.

 

1. 일반적인 팁

다음과 같은 문제는 오프라인 베이크와 런타임 성능 모두에 영향을 미칩니다.

 

1.1 해상도

큐브맵의 해상도가 높을수록 렌더링 시간이 길어집니다. 

반사 디테일이 덜 중요한 부분에는 낮은 해상도를 설정하여 프로브를 최적화할 수 있습니다. 

예를 들어 반사 오브젝트가 작거나 멀리 있는 경우 자연히 디테일이 더 적게 표시됩니다. 

디테일이 눈에 띄는 위치에는 높은 해상도를 사용해야 합니다. 

 

1.2 컬링 마스크

Culling Mask 프로퍼티를 사용하여 중요하지 않은 오브젝트가 렌더링되지 않도록 하는 기본적인 방법으로 일반 카메라의 성능을 개선할 수 있습니다. 

이 방법은 반사 프로브에도 효과적입니다. 

예를 들어 씬에 여러 작은 오브젝트(예: 바위나 식물)가 있는 경우 모든 오브젝트를 같은 레이어에 배치한 후 컬링 마스크를 사용하여 오브젝트가 반사에서 렌더링되지 않도록 할 수 있습니다.

1.3 텍스처 압축

텍스처 압축을 사용하면 렌더링 시간을 최적화하고 GPU 메모리 소모량을 줄일 수 있습니다.

베이크된 반사 프로브의 텍스처 압축을 제어하려면 Lighting 창(메뉴: Window > Rendering > Lighting Settings)에서 Environmental Lighting > Reflections 로 이동하여 Compression 드롭다운 메뉴를 사용합니다.

실시간 반사 프로브는 메모리에 압축되지 않고, 메모리에 저장되는 프로브의 크기는 해상도와 HDR 설정에 따라 결정됩니다.

그렇기 때문에 실시간 반사 프로브 샘플링에는 베이크된 반사 프로브 샘플링보다 일반적으로 리소스가 더 많이 사용됩니다.

2. 실시간 프로브 최적화

일반적으로 에디터에서 베이크된 프로브보다 실시간 프로브를 렌더링하는 데 리소스가 훨씬 더 많이 사용됩니다. 

업데이트가 자주 필요할 수 있으므로 제대로 관리하지 않으면 프레임 속도가 저하될 수 있습니다. 

이를 감안하여, 실시간 프로브에는 프로브 렌더링을 최대한 효율적으로 처리하기 위해 사용할 수 있는 다음과 같은 프로퍼티가 있습니다.

2.1 새로고침 모드

Refresh Mode 에서는 프로브가 업데이트될 시점을 선택할 수 있습니다. 

프로세서 시간이라는 관점에서 리소스가 가장 많이 소모되는 옵션은 Every Frame 입니다. 

이 옵션을 선택하면 가장 자주 업데이트되고 프로그래밍 작업이 최소화되지만, 모든 프로브에 이 모드를 사용하면 성능 문제가 발생할 수 있습니다.

모드를 On Awake 로 설정하면 프로브가 런타임 시점에 업데이트되지만 씬이 시작될 때 딱 한 번만 업데이트됩니다. 

씬이 (또는 씬의 일부가) 런타임 시점에 설정된 후 전체 수명 동안 변경되지 않는 경우에 유용합니다.

마지막 모드인 Via Scripting 에서는 스크립트를 통해 프로브 업데이트를 제어할 수 있습니다. 

이 방식을 사용하면 스크립트 코딩 작업이 필요하지만 조금 더 효율적으로 최적화할 수 있습니다. 

예를 들어 지나가는 오브젝트의 가시적인 크기에 따라 프로브를 업데이트할 수 있습니다. 

즉, 작은 오브젝트나 멀리 떨어져 있는 큰 오브젝트를 업데이트하지 않을 수 있습니다.

2.2 시간 분할

위에서 설명한 Refresh Mode 를 Every Frame 으로 설정하면 상당한 처리 부하가 발생할 수 있습니다. 

Time Slicing 을 사용하면 업데이트에 사용되는 리소스를 여러 프레임으로 분산시켜 특정 시점에 가해지는 부하를 줄일 수 있습니다. 

이 프로퍼티에는 다음 세 가지 옵션이 있습니다.

1. All Faces at Once 를 선택하면 큐브맵의 여섯 면이 (같은 프레임에서) 즉시 렌더링되지만, 여섯 개의 첫 번째 레벨 밉맵에 대한 블러 작업이 각각 서로 다른 프레임에서 수행됩니다. 

나머지 밉맵은 단일 프레임에서 블러되고 결과물이 다른 프레임의 큐브맵으로 복사됩니다. 

따라서 전체 업데이트를 완료하는 데 아홉 프레임이 소요됩니다.

2. Individual Faces 는 각 큐브맵 면의 초기 렌더링이 (첫 프레임의 여섯 면에서 모두 수행되지 않고) 전용 프레임에서 수행된다는 점을 제외하고 All Faces at Once 와 작동 방식이 같습니다. 

전체 업데이트를 완료하는 데 14개 프레임이 소요됩니다. 

프레임 속도에 미치는 영향이 가장 적은 옵션이지만, 예를 들어 (전등을 갑자기 껴는 등) 조명 환경이 갑자기 변할 경우 업데이트 시간이 상대적으로 길어질 수 있습니다.

3. No Time Slicing 을 선택하면 시간 분할(time slicing) 작업이 완전히 비활성화되므로 각 프로브 업데이트가 단일 프레임 안에서 수행됩니다. 

따라서 반사가 주위 오브젝트의 형상과 정확하게 동기화되지만 처리에 리소스가 너무 많이 사용되어 실용적이지 않을 수 있습니다.

다른 최적화와 마찬가지로, 반사가 상대적으로 덜 중요한 부분에는 품질이 낮은 옵션을 사용하고 No Time Slicing 옵션은 디테일이 눈에 띌 수 있는 부분에만 집중적으로 사용하는 것이 좋습니다.

728x90
반응형