메모리 관리 개요
어드레서블 시스템은 에셋과 번들을 로드하는 데 사용하는 메모리를 관리하기 위해 로드하는 모든 항목의 레퍼런스 수를 유지합니다.
Unity가 어드레서블을 로드하면 시스템은 레퍼런스 수를 증분합니다. Unity가 에셋을 해제하면 시스템은 레퍼런스 수를 줄입니다. 어드레서블의 레퍼런스 수가 0으로 돌아오면 언로드할 수 있습니다. 어드레서블 에셋을 명시적으로 로드한 경우, 사용을 완료하고 나면 에셋도 해제해야 합니다.
메모리 누수
에셋이 더 이상 필요하지 않은 후에도 메모리에 남아 있는 메모리 누수를 방지하려면 로드 메서드에 대한 모든 호출을 해제 메서드에 대한 호출로 미러링하십시오. 에셋 인스턴스 자체에 대한 레퍼런스 또는 원래 로드 작업이 반환하는 결과 핸들을 사용하여 에셋을 해제할 수 있습니다.
하지만 Unity는 해제된 에셋을 메모리에서 즉시 언로드하지 않습니다. 에셋이 사용하는 메모리는 해당 에셋이 속한 에셋 번들도 언로드될 때까지 해제되지 않습니다. 해제된 에셋을 언로드하기 위해 Resources.UnloadUnusedAssets
를 호출할 수 있지만, 느린 작업 속도로 인해 프레임 속도가 저하될 수 있습니다.
에셋 번들에는 고유한 레퍼런스 수가 있으며, 시스템에서는 종속성으로 포함된 에셋을 사용하여 에셋 번들을 어드레서블처럼 처리합니다. 번들에서 에셋을 로드하면 번들의 레퍼런스 수가 증가하고, 에셋을 해제하면 번들 레퍼런스 수가 감소합니다. 번들의 레퍼런스 수가 0으로 돌아간다는 것은 번들에 포함된 에셋 중 사용 중인 에셋이 없다는 의미입니다. 그러면 Unity는 번들과 번들에 포함된 모든 에셋을 메모리에서 언로드합니다.
프로파일러 모듈을 사용하여 로드된 콘텐츠를 모니터링합니다. 이 모듈은 에셋과 해당 종속성이 로드 및 언로드될 때 이를 표시합니다.
메모리 정리
에셋이 더 이상 참조되지 않는다고 해서(프로파일러 모듈에 비활성화된 텍스트와 해제된 상태로 표시) Unity가 해당 에셋을 언로드했다는 의미는 아닙니다. 일반적으로 해당되는 시나리오는 에셋 번들에 여러 에셋이 포함된 경우입니다. 예제:
- 에셋 번들(
stuff
)에 세 개의 에셋(tree
,tank
,cow
)이 있습니다. tree
가 로드되면 프로파일러에tree
,stuff
에 대한 단일 레퍼런스 수가 각각 표시됩니다.- 나중에
tank
가 로드되면 프로파일러는tree
및tank
모두에 대한 단일 레퍼런스 수를 표시하고,stuff
에셋 번들에 대해서는 두 개의 레퍼런스 수를 표시합니다. tree
를 해제하면 해당 레퍼런스 수가 0이 되고 파란색 막대가 사라집니다.
이 예제에서 tree
에셋은 현재 언로드되지 않았습니다. 에셋 번들 또는 일부 콘텐츠는 로드할 수 있지만 에셋 번들의 일부는 언로드할 수 없습니다. 에셋 번들이 언로드될 때까지 stuff
에 있는 에셋은 언로드되지 않습니다.
이 규칙의 예외는 엔진 인터페이스 Resources.UnloadUnusedAssets
입니다. 앞의 예제에서 이 메서드를 실행하면 tree
가 언로드됩니다. 어드레서블 시스템은 이러한 이벤트를 인식하지 못하므로 프로파일러 그래프에는 어드레서블 레퍼런스 수만 반영됩니다(메모리 내 데이터는 반영되지 않음). Resources.UnloadUnusedAssets
를 사용하는 경우 작업 속도가 느려지므로 로드 화면과 같이 오류가 표시되지 않는 화면에서만 호출해야 합니다.
에셋 이탈 방지
에셋 이탈은 에셋 번들의 마지막 항목인 오브젝트를 해제한 다음 해당 에셋이나 번들의 다른 에셋을 즉시 리로드하는 경우에 발생합니다.
예를 들어, 텍스처를 공유하는 두 개의 머티리얼인 boat
와 plane
이 있고, 자체 에셋 번들에 cammo
가 있다고 가정해 보겠습니다. 레벨 1은 boat
를 사용하고 레벨 2는 plane
을 사용합니다. 레벨 1을 종료하면 Unity는 boat
를 해제하고 즉시 plane
을 로드합니다. Unity가 boat
를 해제하면 어드레서블은 텍스처 cammo
를 언로드합니다. 그런 다음 Unity가 plane
을 로드하면 어드레서블은 즉시 cammo
를 리로드합니다.
프로파일러 모듈을 사용하면 에셋 로드 및 언로드를 모니터링하여 에셋 이탈을 감지할 수 있습니다.