Version: 2017.2
절차적 머티리얼
절차적 메시 지오메트리

절차적 머티리얼 - 메모리 사용 및 캐싱 동작(Procedural Materials - Memory Usage and Caching Behaviour)

서브스턴스(Unity의 절차적 머티리얼 엔진)는 두 가지 형태의 캐싱을 활용하며 절차적 머티리얼을 사용할 때 메모리와 디스크 사용을 관리하기 위해서는 두 가지 형태를 모두 이해하는 것이 중요합니다.

1) ‘런타임’ 메모리 캐시

서브스턴스는 적은 양의 데이터로 동적 텍스처(파라미터 집합을 따르는 텍스처)를 생성하게 해줍니다. 하지만 서브스턴스가 바이너리 데이터와 파라미터 값에서 텍스처를 생성하려면 원하는 출력 텍스처를 ’재구성’할 때 중간 비트맵의 저장을 위해 일부 메모리를 할당할 필요가 있습니다.

텍스처를 생성하는 동안 서브스턴스가 사용할 수 있는 메모리의 양은 ProceduralMaterial.cacheSize에 의해 제어됩니다.

절차적 머티리얼의 텍스처가 생성되고 cacheSize의 현재 값에 따라 서브스턴스 엔진이 중간 결과 중 일부를 메모리에 유지하여 사용자가 하나 또는 여러 파라미터의 값을 변경하는 경우 나중에 후속 텍스처 계산 속도를 높일 수 있습니다.

이 작업이 완료되면 ProceduralMaterial.ClearCache()는 서브스턴스 엔진이 할당했던 메모리를 해제하고, 입력 비트맵의 ​​데이터를 저장하는 데 사용된 스토리지를 해제합니다.

따라서 텍스처가 계산된 후 서브스턴스 엔진의 메모리 사용량을 줄이는 가장 빠른 방법은 다음과 같습니다.

procMat.cacheSize = ProceduralCacheSize.None;
procMat.ClearCache();

이 함수는 머티리얼 별로 호출할 수 있으며, 이렇게 전제하는 것이 좋습니다. 하지만 실제로 서브스턴스는 머티리얼이 공유하는 부분을 재사용하는 방식으로 공간 사용을 최적화할 수 있습니다. 예를 들어, 기본적인 노이즈 패턴이 두 개의 머티리얼에서 사용되는 경우, 이를 재사용할 수 있습니다. 이와 더불어 빌드 과정과 런타임 로드 중 에셋이 직렬화되는 순서, 또는 게임이나 앱이 실행되는 장치의 성능에 따라 에셋 합병이 항상 발생한다고 할 수는 없습니다. 따라서 각 머티리얼이 사용하는 메모리 용량을 세심하게 확인하고자 한다면, 이 정보를 통해 설명이 어려운 결과를 해석할 수 있습니다.

2) 온디바이스 디스크 및 플래시 캐시

게임 및 앱이 시작할 때마다 텍스처 생성에 시간을 들이지 않기 위해 에디터에서 절차적 머티리얼이 캐싱 로드 동작을 활용하도록 설정할 수 있습니다.

서브스턴스 머티리얼용 인스펙터의 로드 동작 옵션
서브스턴스 머티리얼용 인스펙터의 로드 동작 옵션

이 옵션을 사용하면 텍스처가 처음으로 생성될 때(에셋이 처음으로 로드될 때나 사용자가 처음으로 스크립트 호출로 텍스처 계산을 트리거할 때) 생성된 텍스처가 캐시되는 방식, 서브스턴스 데이터를 메모리에 유지하여 런타임 시점에 수정과 재생성이 가능하도록 할지 여부를 제어할 수 있습니다.

가능한 옵션은 다음과 같습니다.

옵션 이름 설명
Do nothing 텍스처를 생성하지 않습니다. 텍스처를 생성하려면 RebuildTextures() 또는 RebuildTexturesImmediately()를 호출해야 합니다.
Do nothing and cache 텍스처를 생성하지 않습니다. RebuildTextures() 또는 RebuildTexturesImmediately()를 호출해야 합니다. 텍스처가 처음으로 생성된 후에는 이후의 게임/애플리케이션의 시작 속도를 높이기 위해 디스크 및 플래시로 캐시됩니다.
Build on level load 애플리케이션의 크기를 우선적으로 사용하도록 로드할 때 텍스처를 생성합니다(지원되는 플랫폼에서는 디폴트).
Build on level load and cache 로딩할 때 텍스처를 생성하고 이를 디스크 및 플래시에 캐시하여 이후 게임 및 애플리케이션의 시작 속도를 높입니다.
Bake and keep Substance 로딩 속도를 높이기 위해 텍스처를 베이크하고 절차적 머티리얼 데이터를 유지하여 나중에도 미세 조정하고 다시 생성될 수 있도록 합니다.
Bake and discard Substance 로딩 속도를 높이기 위해 텍스처를 베이크하고 절차적 머티리얼 데이터를 폐기합니다(지원되지 않는 플랫폼에서는 디폴트).

생성된 텍스처가 온디바이스 캐시되면 다음에 게임 및 애플리케이션이 시작할 때 텍스처는 디스크에서 직접 로드되며 일반 비트맵을 로드할 때처럼 빠릅니다. 즉, 텍스처를 생성할 때 앱이 처음 실행될 때를 제외하고는 전혀 시간이 소요되지 않습니다.

캐시된 데이터 지우기

캐시된 데이터는 Caching.ClearCache()를 사용하여 지울 수 있습니다. 캐시 공간이 다운로드 에셋 번들 데이터에 활용되는 공간과 동일하기 때문에 CleanCache 호출은 캐시된 절차적 머티리얼 데이터 다운로드된 에셋 번들 데이터를 지웁니다.

절차적 머티리얼
절차적 메시 지오메트리