Unity/정보

[Unity] Resources.UnloadUnusedAssets() : 메모리 관리

달시_Dalsi 2024. 9. 28. 00:14

Resources.UnloadUnusedAssets()란?

Resources.UnloadUnusedAssets()는 사용되지 않는 자원을 메모리에서 해제하는 기능입니다. 동적으로 텍스처, 오디오 파일 또는 모델을 로드할 때 Unity는 해당 자원을 메모리에 유지합니다. 이 함수는 사용되지 않는 자원을 수동으로 해제하여 메모리를 확보할 수 있게 해줍니다.

 

작동 방식

  • 미사용 자원 확인: Resources.UnloadUnusedAssets()를 사용하면 Unity는 현재 씬이나 코드에서 사용되지 않는 모든 자원을 찾아 메모리에서 해제합니다.
  • 가비지 컬렉션과의 차이: Unity의 가비지 컬렉션은 주로 관리되는 객체(C#)에 적용됩니다. 이 함수는 텍스처나 메쉬와 같은 비관리 자원을 정리하는 데 도움을 줍니다.

 

사용 시점

  • 새 자원을 로드한 후: Resources.Load()나 에셋 번들을 사용해 동적으로 자원을 로드한 후, 더 이상 필요하지 않은 자원을 해제하여 메모리를 최적화할 수 있습니다.
  • 장면 전환 전: 장면 전환 시 메모리 최적화를 위해 자원을 해제하는 것이 유용할 수 있습니다.
  • 메모리 소모가 많은 작업 중: 많은 자원을 사용하는 작업이 끝난 후, 메모리 사용량을 줄이기 위해 이 함수를 사용할 수 있습니다.

 

사용 예시

 

프로젝트는 다음 사진과 같이 준비했습니다.

Resources폴더에 불러올 아무 이미지파일 1개, 씬에 현재 메모리 사용량을 확인할 텍스트, 이미지 로드할 버튼, Resources.UnloadUnusedAssets()를 사용할 버튼

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ResourceLoader : MonoBehaviour
{
    public Text memoryUsageText;
    private Object loadedResource;

    // 리소스를 동적으로 로드
    public void LoadResource()
    {
        loadedResource = Resources.Load("myIMG");  // Resources 폴더에서 이미지 로드
        UpdateMemoryUsage();
    }

    // 불필요한 리소스를 해제
    public void UnloadResources()
    {
        Resources.UnloadUnusedAssets(); // 메모리에서 사용되지 않는 리소스 해제
        UpdateMemoryUsage();
    }

    // 메모리 사용량 확인
    private void UpdateMemoryUsage()
    {
        memoryUsageText.text = "Memory Usage: " + System.GC.GetTotalMemory(false) / (1024 * 1024) + " MB";
    }
}

 

왼쪽이 로드한 직후 메모리가 863MB 오른쪽이 메모리를 비운뒤 체크한 메모리가 813MB로 확실히 줄어든걸 알 수 있다.

 

 

주의사항

  • Resources.UnloadUnusedAssets()는 비동기적으로 작동하므로 즉시 메모리 해제가 안될 수 있습니다. 따라서 해제를 기다릴 필요가 있을 경우, 코루틴을 사용하여 메모리 해제가 완료되는 타이밍을 확인하는 것이 좋습니다.
IEnumerator UnloadAndWait()
{
    yield return Resources.UnloadUnusedAssets();  // 비동기적으로 미사용 자산 해제
    System.GC.Collect();  // 가비지 컬렉션 실행
}

 

  • Resources.UnloadUnusedAssets()는 성능 비용이 발생합니다. 메모리에서 모든 자산을 스캔하여 사용되지 않는 자산을 찾기 때문에, 자주 사용하는 것은 성능에 악영향을 미칠 수 있습니다. 따라서 로딩 화면이나 게임 진행에 영향을 미치지 않는 시점에서 사용하는 것이 좋습니다.

 

마무리

Resources.UnloadUnusedAssets()는 Unity에서 메모리를 효율적으로 관리하는 데 중요한 역할을 합니다. 이것을 적절한 시점에 사용함으로써, 게임의 성능을 최적화하고 불필요한 메모리를 제거할 수 있습니다.