반사 프로브 큐브맵 렌더링은 다음과 같은 이유로 상당한 프로세서 시간이 소요됩니다.
큐브맵의 여섯 면을 각각 프로브의 원점에서 “카메라”를 사용하여 개별적으로 렌더링해야 합니다.
각 반사 바운스 레벨마다 각기 다른 시간에 프로브를 렌더링해야 합니다. 자세한 내용은 고급 반사 프로브 문서를 참조하십시오.
광택 반사를 표현하려면 큐브맵의 여러 밉맵 레벨이 블러링 프로세스를 거쳐야 합니다.
프로브를 렌더링하는 데 소요되는 시간은 에디터의 베이크 워크플로는 물론 더 중요한 플레이어의 런타임 성능에 영향을 미칩니다. 아래에서는 반사 프로브가 성능에 미치는 영향을 최소화하기 위한 유용한 팁을 몇 가지 소개합니다.
다음과 같은 문제는 오프라인 베이크와 런타임 성능 모두에 영향을 미칩니다.
큐브맵의 해상도가 높을수록 렌더링 시간이 길어집니다. 반사 디테일이 덜 중요한 부분에는 낮은 해상도를 설정하여 프로브를 최적화할 수 있습니다. 예를 들어 반사 오브젝트가 작거나 멀리 있는 경우 자연히 디테일이 더 적게 표시됩니다. 디테일이 눈에 띄는 위치에는 높은 해상도를 사용해야 합니다.
Culling Mask 프로퍼티를 사용하여 중요하지 않은 오브젝트가 렌더링되지 않도록 하는 기본적인 방법으로 일반 카메라의 성능을 개선할 수 있습니다. 이 방법은 반사 프로브에도 효과적입니다. 예를 들어 씬에 여러 작은 오브젝트(예: 바위나 식물)가 있는 경우 모든 오브젝트를 같은 레이어에 배치한 후 컬링 마스크를 사용하여 오브젝트가 반사에서 렌더링되지 않도록 할 수 있습니다.
To optimize the rendering time and lower the GPU memory consumption, use texture compression. To control texture compression for baked Reflection Probes, open the Lighting window (menu: Window > Rendering > Lighting), navigate to Environmental Lighting > Reflections and use the Compression drop-down menu. Note that real-time Reflection Probes are not compressed in memory, and their size in memory depends on Resolution and HDR settings. Because of this, sampling real-time Reflection Probes is usually more resource-intensive than sampling baked Reflection Probes.
일반적으로 에디터에서 베이크된 프로브보다 실시간 프로브를 렌더링하는 데 리소스가 훨씬 더 많이 사용됩니다. 업데이트가 자주 필요할 수 있으므로 제대로 관리하지 않으면 프레임 속도가 저하될 수 있습니다. 이를 감안하여, 실시간 프로브에는 프로브 렌더링을 최대한 효율적으로 처리하기 위해 사용할 수 있는 다음과 같은 프로퍼티가 있습니다.
Refresh Mode 에서는 프로브가 업데이트될 시점을 선택할 수 있습니다. 프로세서 시간이라는 관점에서 리소스가 가장 많이 소모되는 옵션은 Every Frame 입니다. 이 옵션을 선택하면 가장 자주 업데이트되고 프로그래밍 작업이 최소화되지만, 모든 프로브에 이 모드를 사용하면 성능 문제가 발생할 수 있습니다.
모드를 On Awake 로 설정하면 프로브가 런타임 시점에 업데이트되지만 씬이 시작될 때 딱 한 번만 업데이트됩니다. 씬이 (또는 씬의 일부가) 런타임 시점에 설정된 후 전체 수명 동안 변경되지 않는 경우에 유용합니다.
마지막 모드인 Via Scripting 에서는 스크립트를 통해 프로브 업데이트를 제어할 수 있습니다. 이 방식을 사용하면 스크립트 코딩 작업이 필요하지만 조금 더 효율적으로 최적화할 수 있습니다. 예를 들어 지나가는 오브젝트의 가시적인 크기에 따라 프로브를 업데이트할 수 있습니다. 즉, 작은 오브젝트나 멀리 떨어져 있는 큰 오브젝트를 업데이트하지 않을 수 있습니다.
위에서 설명한 Refresh Mode 를 Every Frame 으로 설정하면 상당한 처리 부하가 발생할 수 있습니다. Time Slicing 을 사용하면 업데이트에 사용되는 리소스를 여러 프레임으로 분산시켜 특정 시점에 가해지는 부하를 줄일 수 있습니다. 이 프로퍼티에는 다음 세 가지 옵션이 있습니다.
All Faces at Once 를 선택하면 큐브맵의 여섯 면이 (같은 프레임에서) 즉시 렌더링되지만, 여섯 개의 첫 번째 레벨 밉맵에 대한 블러 작업이 각각 서로 다른 프레임에서 수행됩니다. 나머지 밉맵은 단일 프레임에서 블러되고 결과물이 다른 프레임의 큐브맵으로 복사됩니다. 따라서 전체 업데이트를 완료하는 데 아홉 프레임이 소요됩니다.
Individual Faces 는 각 큐브맵 면의 초기 렌더링이 (첫 프레임의 여섯 면에서 모두 수행되지 않고) 전용 프레임에서 수행된다는 점을 제외하고 All Faces at Once 와 작동 방식이 같습니다. 전체 업데이트를 완료하는 데 14개 프레임이 소요됩니다. 프레임 속도에 미치는 영향이 가장 적은 옵션이지만, 예를 들어 (전등을 갑자기 껴는 등) 조명 환경이 갑자기 변할 경우 업데이트 시간이 상대적으로 길어질 수 있습니다.
No Time Slicing 을 선택하면 시간 분할(time slicing) 작업이 완전히 비활성화되므로 각 프로브 업데이트가 단일 프레임 안에서 수행됩니다. 따라서 반사가 주위 오브젝트의 형상과 정확하게 동기화되지만 처리에 리소스가 너무 많이 사용되어 실용적이지 않을 수 있습니다.
다른 최적화와 마찬가지로, 반사가 상대적으로 덜 중요한 부분에는 품질이 낮은 옵션을 사용하고 No Time Slicing 옵션은 디테일이 눈에 띌 수 있는 부분에만 집중적으로 사용하는 것이 좋습니다.
Unity 5.6에서 업데이트됨
2017–06–06 페이지 게시됨