Version: 2023.1
언어: 한국어
밉맵 소개
밉맵 스트리밍 시스템 API

밉맵 스트리밍 시스템

밉맵 스트리밍 시스템을 사용하여 Unity가 밉맵을 로드하는 방법을 제어할 수 있습니다.

이 페이지는 다음에 관한 정보를 제공합니다.

API를 사용하여 텍스처 스트리밍 시스템의 기능을 확장하는 방법에 대한 자세한 내용은 밉맵 스트리밍 시스템 API를 참조하십시오.

개요

텍스처 스트리밍 시스템은 Unity가 기본적으로 모든 밉맵을 로드하는 대신, 현재 카메라 포지션을 렌더링하는 데 필요한 밉맵을 로드하도록 합니다. 이렇게 하면 약간의 CPU 리소스를 소모하여 잠재적으로 매우 많은 GPU 메모리를 절약할 수 있습니다.

애플리케이션의 모든 텍스처에 대해 총 메모리 제한을 설정할 수 있습니다. 텍스처 스트리밍 시스템은 메모리 할당량을 넘지 않도록 밉 레벨을 자동으로 낮춥니다.

Unity의 Viking Village 데모 프로젝트에서는 밉맵 스트리밍 시스템이 카메라 위치에 따라 텍스처 메모리를 25–30% 절감합니다.

시작

밉맵 스트리밍 활성화

밉맵 스트리밍을 활성화하려면 Unity의 품질 설정(Edit > Project Settings > Quality)으로 이동하여 Texture Streaming 체크박스를 활성화합니다.

이 설정을 활성화하면 품질 설정 창에 밉맵 스트리밍 시스템과 관련된 설정이 표시됩니다. 각 설정에 대한 자세한 내용은 품질 설정 문서를 참조하십시오.

기본적으로 이 설정은 프로젝트에서 모든 카메라에 대한 밉맵 스트리밍을 활성화합니다.

밉맵 스트리밍 시스템과 함께 작동하는 텍스처 생성

이제 개별 텍스처에 밉맵 스트리밍을 설정할 수 있습니다.텍스처 에셋을 선택하고 인스펙터 창으로 이동하여 텍스처 임포트 설정을 확인합니다.Advanced 설정을 열고 Mip Streaming 체크박스를 활성화합니다.

Android용 개발인 경우 빌드 설정을 열어 Compression MethodLZ4 또는 LZ4HC 로 설정해야 합니다. 이 압축 방식 중 하나를 밉맵 스트리밍 시스템이 기반을 두는 비동기 텍스처 로딩에 사용해야 합니다.

Unity는 메모리 할당량을 관찰하는 동안 가능한 한 가장 높은 해상도의 밉을 로드합니다.Texture Import Settings에서 Mip Streaming > Priority 설정으로 텍스처의 우선순위를 설정할 수 있습니다.

Unity는 이 설정을 사용하여 다음을 결정합니다.

  • 리소스를 할당할 때 텍스처의 우선순위
  • 메모리 할당량에 맞는 밉 레벨을 선택할 때 밉 바이어스 값. 예를 들어 우선순위가 2인 경우 밉맵 스트리밍 시스템은 우선순위가 0인 텍스처보다 높은 밉 레벨이 2인 밉맵을 사용하려고 합니다.

양수는 더 높은 우선순위를 부여합니다. 유효한 값의 범위는 –128에서 127 사이입니다.

스트리밍 라이트맵

밉맵 스트리밍 시스템을 사용하여 라이트맵의 밉 레벨을 스트리밍할 수 있습니다.

다른 텍스처와 동일한 방식으로 라이트맵 에셋의 밉맵 스트리밍 설정을 편집할 수 있지만 Unity가 라이트맵을 다시 생성하면 기본값으로 재설정됩니다. 이 문제를 해결하려면 Unity가 라이트맵을 생성할 때 이러한 값을 적용하도록 지시할 수 있습니다. 플레이어 설정(Edit > Project Settings > Player)은 생성된 라이트맵에 대해 스트리밍과 우선 순위를 설정할 수 있도록 두 가지 제어 옵션, 즉 Lightmap Streaming EnabledStreaming Priority 를 제공합니다.

밉맵 스트리밍을 활성화하고 우선순위를 설정하면 일반 텍스처와 동일한 방식으로 라이트맵에 작동합니다.

밉맵 스트리밍 설정

Unity 에디터에서 기본 설정으로 설정한 다음 필요한 경우 밉맵 스트리밍 API를 사용하여 이 설정을 오버라이드할 수 있습니다.

메모리 할당량 설정

Memory Budget 프로퍼티는 Unity가 텍스처에 소모하는 최대 메모리 양을 정합니다. 가용 메모리 할당량이 너무 작으면 Unity가 씬 내 텍스처의 해상도를 낮추며, 이로 인해 텍스처가 건너뛰기되거나 느리게 로드될 수 있습니다. 단, 가용 메모리는 다른 리소스에게도 메모리가 돌아가도록 가능한 한 작게 설정해야 합니다.

Texture Streaming > Memory Budget 프로퍼티를 사용하여 Quality Settings 창에서 메모리 할당량을 설정합니다.

메모리 할당량이 가득 차면 Unity는 사용하지 않는 밉맵을 폐기하여 사용할 공간을 확보합니다. Max Level Reduction 으로 사용하지 않은 밉맵을 얼마나 많이 폐기할지 제어할 수 있습니다.

이 값은 밉맵 스트리밍 시스템이 시작할 때 처음 로드하는 밉맵 레벨이기도 합니다. 예를 들어 이 값을 2로 설정하면 Unity는 첫 번째 로드 시 가장 높은 두 개의 밉맵을 건너뜁니다.

Texture Streaming > Max Level Reduction 프로퍼티를 사용하여 Quality Settings 창에서 이 값을 설정합니다.

참고: Unity는 메모리 할당량보다 Max Level Reduction 값을 우선합니다. 텍스처 메모리가 할당량을 초과하더라도 Max Level Reduction 값보다 더 많은 밉맵을 폐기하지 않습니다.

메모리 할당량에는 밉맵 스트리밍을 사용하지 않는 텍스처가 포함됩니다. 예를 들어 메모리 할당량이 100MB이고 밉맵 스트리밍을 사용하지 않는 텍스처가 90MB인 경우 Unity는 나머지 10MB에 모든 스트리밍 밉맵을 맞추려고 합니다. 그렇지 않으면 낮은 해상도로 로드합니다. Unity는 메모리 할당량을 초과하더라도 전체 해상도에서 밉맵 스트리밍을 사용하지 않는 텍스처를 항상 로드합니다.

적절한 가용 메모리를 파악하려면 다음을 수행하십시오.

  1. 프로젝트 실행 중 Texture.desiredTextureMemory 값을 확인합니다.
  2. Memory Budget 값을 Texture.desiredTextureMemory 값보다 조금 더 높게 설정합니다.

이렇게 하면 씬에서 가장 리소스가 많이 소요되는 영역을 위한 텍스처 메모리를 충분히 확보할 수 있으며, 텍스처의 해상도가 저하되는 일을 방지할 수 있습니다. 여유 메모리가 있다면 Unity가 씬에서 보이지 않는 텍스처 데이터를 스트리밍 캐시 내에 유지할 수 있도록 가용 메모리를 좀 더 크게 설정해도 됩니다.

카메라 설정

기본적으로 밉맵 스트리밍 시스템을 활성화하면 Unity가 모든 카메라에 대해 활성화합니다. 원하는 경우 이 설정을 비활성화할 수 있습니다.

Unity가 Texture Streaming > Add All Cameras 프로퍼티를 사용하여 Quality Settings 창에서 모든 카메라에 대한 밉맵 스트리밍을 활성화할지를 설정합니다.

특정 카메라를 제외하려면 해당 카메라에 Streaming Controller 컴포넌트를 추가한 다음 비활성화합니다.

Add All Cameras를 비활성화하면 카메라별 밉맵 스트리밍을 활성화해야 합니다. 이렇게 하려면 Streaming Controller 컴포넌트를 Camera 컴포넌트와 동일한 게임 오브젝트에 추가합니다.

이 컴포넌트를 사용하면 카메라별 밉 바이어스 설정을 조정할 수도 있습니다.

Streaming Controller 컴포넌트
Streaming Controller 컴포넌트

에디터 스트리밍 설정 지정

Edit > Project Settings > Editor에 있는 스트리밍 설정
Edit > Project Settings > Editor에 있는 스트리밍 설정

에디터의 밉맵 스트리밍(텍스처 스트리밍이라고도 함)은 기본적으로 활성화되어 있지만, Quality Settings에서 Texture Streaming을 활성화하고 텍스처 에셋의 임포트 설정 중 하나 이상에서 Mipmap Streaming을 활성화한 경우에만 효과가 나타납니다.

Unity가 에디터에서 플레이 모드와 편집 모드 모두에서 밉맵 스트리밍을 사용할지를 개별적으로 제어할 수 있습니다.이렇게 하려면 Project Settings > Editor > Streaming Settings로 이동합니다.

에디터에서 밉맵 스트리밍을 한 모드에서만 활성화하고 다른 모드에서는 활성화하지 않은 경우, 플레이 모드를 시작하고 종료하는 데 시간이 약간 더 걸립니다.밉맵 스트리밍을 두 모드에서 모두 활성화하면 Unity가 밉맵 데이터를 언로드 및 재로드하지 않아도 되며, 플레이 모드를 시작하고 종료하는 속도가 빨라집니다.

“Load texture data on demand” 설정을 활성화하면 밉맵 스트리밍이 활성화된 텍스처에 대해 에디터에서 추가 최적화를 수행할 수 있습니다.

  • 디스크에서 메모리에 텍스처 데이터를 비동기적으로 로드
  • 현재 카메라 뷰에 필요한 밉맵 레벨만 로드
  • 현재 품질 설정에 대한 텍스처 스트리밍 메모리 할당량 내에서 작업을 시도

이러한 최적화를 통해 일부 멈춤 현상을 방지하고 로딩 속도를 증가시키며 CPU 메모리 사용량을 줄입니다.그러나 이 설정을 사용하면 고해상도 버전이 로드되는 동안 밉맵 텍스처가 일시적으로 낮은 해상도로 보일 수 있습니다. 이 기능은 CPU에 약간의 오버헤드를 발생시키므로 텍스처가 메모리에 한 번에 모두 들어가지 않거나 스트리밍하도록 설정된 텍스처가 없는 경우 이 기능을 비활성화하는 것이 좋습니다.

밉맵 스트리밍 디버깅

Unity에는 빌트인 밉맵 스트리밍 디버깅 뷰 모드가 있습니다. 이 모드에 액세스하려면 씬 뷰 컨트롤 드롭다운을 클릭한 후 Texture Streaming 을 선택하십시오. 이 뷰 모드는 밉맵 스트리밍 시스템의 상태에 따라 게임 오브젝트에 다음 컬러를 입힙니다.

  • 녹색 : 밉맵 스트리밍 시스템으로 인해 밉맵 수가 감소한 텍스처.
  • 빨간색: 밉맵 스트리밍 시스템에 모든 밉맵을 로드할 만큼 리소스가 충분하지 않아서 적은 수의 밉맵을 가진 텍스처.
  • 파란색 : 스트리밍이 설정되지 않은 텍스처. 또는 밉 레벨을 계산할 렌더러가 없음.

디버깅 API를 사용하여 직접 커스텀 디버그 툴 및 시각화를 작성할 수도 있습니다.

중요 :MainTexture 속성을 사용하여 설정된 메인 텍스처는 텍스처 스트리밍 디버깅 뷰 모드 또는 커스텀 디버그 툴을 사용하는 경우 게임 뷰에 표시되지 않습니다.

Unity에서 필요한 밉 레벨을 계산하는 방법

밉맵 스트리밍을 사용하는 텍스처의 경우 Unity는 다음 방법 중 하나를 사용하여 올바른 밉 레벨을 계산합니다.

  • Unity Renderer 컴포넌트에서 사용하는 머티리얼에 텍스처를 할당하면 Unity가 자동으로 밉 레벨을 계산합니다.
  • 그렇지 않으면 Texture2D.requestedMipmapLevel을 사용하여 수동으로 밉 레벨을 요청해야 합니다.

이러한 방법 중 하나를 사용하지 않으면 Unity가 올바른 밉 레벨을 계산할 수 없습니다. 그러면 Unity가 저품질 밉을 사용하여 텍스처를 로드하게 되고 흐릿하게 보일 수 있습니다.

참고: 다음 시스템은 스탠다드 Renderer 컴포넌트를 사용하지 않으므로 해당 시스템을 위한 필수 밉을 수동으로 설정해야 합니다.

  • 데칼 프로젝터 텍스처.
  • 반사 프로브 텍스처: 저해상도 밉은 거칠기의 룩업 테이블입니다. 따라서 Unity는 낮은 밉맵 레벨을 사용하는 경우 잘못된 거칠기를 사용하여 머티리얼을 렌더링합니다.
  • Mesh.uv(UV0이라고도 함) 이외의 채널에서 UV 텍스처 좌표를 사용하는 셰이더 또는 셰이더에서 텍스처 좌표를 변경하는 셰이더. 단, 스케일 및 변환 변경은 예외입니다(아래 참조).

제한 사항

  • Unity는 터레인 텍스처에서 밉맵 스트리밍을 지원하지 않습니다. Unity가 터레인 텍스처를 타일화하고 블렌딩하려면 터레인 텍스처가 항시 전체 해상도로 제공되어야 하기 때문입니다.
  • Renderer 컴포넌트가 활성화되면 해당 메시는 원하는 밉 레벨을 계산하기 위해 유효한 UV 배포 지표를 요구합니다. Unity는 메시 임포트 프로세스의 일환으로 배포 지표를 자동 계산합니다.

    코드에서 메시를 생성하는 경우 Unity는 분포 지표를 자동으로 계산하지 않으므로 잘못된 밉 레벨을 로드합니다.UV 분포 지표 계산을 수동으로 트리거하려면 Mesh.RecalculateUVDistributionMetrics를 사용합니다. Unity가 API(예: Graphics.DrawMeshNow로 스트리밍된 텍스처를 직접 렌더링하는 경우 시스템에 밉 레벨을 계산하기 위한 렌더러 바운드 또는 기타 정보가 없습니다.즉, 텍스처 밉 레벨을 수동으로 설정하거나 이 텍스처에 대한 밉맵 스트리밍을 비활성화해야 합니다.Unity가 로드하는 밉맵 레벨을 수동으로 설정하는 방법에 대한 자세한 내용은 Texture2D.requestedMipmapLevel을 참조하십시오.
  • Unity는 텍스처의 밉 레벨을 계산할 때 셰이더에서 플래그된 텍스처와 이름이 같은 _ST 값에서 해당 텍스처의 스케일과 변환을 찾습니다. 예를 들어 _MainTex를 사용하여 셰이더에 있는 텍스처를 레퍼런스하면 Unity는 _MainTex_ST를 찾습니다.
밉맵 소개
밉맵 스트리밍 시스템 API