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에서 메모리를 효율적으로 관리하는 데 중요한 역할을 합니다. 이것을 적절한 시점에 사용함으로써, 게임의 성능을 최적화하고 불필요한 메모리를 제거할 수 있습니다.
'Unity > 정보' 카테고리의 다른 글
[Unity] UniTask 유니티 비동기 프로그래밍 (0) | 2024.12.19 |
---|---|
[Unity] 로컬 알림 기능 (Android) (0) | 2024.11.10 |
[Unity] 비등방성 필터링(Anisotropic filtering)과 Mipmap (0) | 2024.09.22 |
[Unity] 안티앨리어싱(Anti-Aliasing) (0) | 2024.09.21 |
[Unity] 유니티의 가비지 콜렉터 (G.C) (1) | 2024.09.16 |