✌️개요
서버에서 받은 이미지 리소스를 사용하는 경우
자주 사용하는 이미지라면 계속 메모리에 있어도 되겠지만
갈 수도있고 안갈 수도있는 메뉴에서 사용하는 이미지라면
사용 후에 메모리에서 내려가게 해주는게 아무래도 좋음
메모리에서 내리기위해 시도하다가 알아낸 방법을 기록
🔥본문
코드로 해야할 일
우선 결론적으로 이것저것 시도해보니 Destroy(Texture에셋)
으로 메모리에서 내려가게 만드는게 가능
Resources.UnloadUnusedAssets
도 검색하면 가장 많이나오긴했는데,
또 포럼답변으로는 Destroy()
함수로 하라는 말이 있어서 나는 Destroy()
로 함
서버에서 Texture를 받는경우 UnityWebRequestTexture.GetTexture(URL)
로 받을것이고 Texture2D타입의 결과물을 얻게됨
이걸 Material에 사용하는게 아니라면 또 Sprite로 변환해서 사용하게됨
자 이제 최종 Sprite를 메모리에서 해제할려면
Destroy()
전에 참조를 모두 끊어줘야 함
UI Image에 넣었었다면 Image.sprite = null;
로 참조를 끊어주고 변수나 배열에 넣은것도 참조를 다 끊어줌
이후 Destroy(sprite);
가 아니라 Destroy(sprite.texture);
로 원본인 Texture2D를 Destroy해줘야 함
확인하는 방법
메모리에서 내려가라고 Destroy()는 호출했지만 실제로 내려가는지 확인도 해야함
이 에셋이 도움이 많이 됨
이렇게 화면 구석탱이에 띄워놓고 메모리 할당량을 UI로 확인할 수 있음
의도대로 작동했다면 Destroy()
이후 메모리 할당량이 줄어들것임
만약 안줄어든다면
어딘가에 참조 카운트가 남아있을 확률이 큼
그러면 어쩔수없이 메모리 프로파일러를 켜야함
메모리 프로파일러에서 스냅 샷을 캡쳐하고 Tree Map탭에 들어가서
해당 리소스를 찾아야함
동적으로 받은 리소스라면 Name이 보통 공백일테니 공백중에 찾으면 됨
미리보기랑 같이 참고하면서 해당 리소스를 찾아 줌
[주의할 점]
실제로 메모리에 아직 올라가있다면 미리보기가 뜨지만
이후 유니티를 껏다켰다던가 재부팅했다던가 해서 메모리가 청소됐다면은
스냅 샷에서 목록은 보이지만 미리보기 이미지는 확인할 수 없다.
찾았다면 오른쪽 위 References - Details 영역에서 어디서 참조가 남았는지 확인이 가능함
이렇게 어느 변수에서 참조중인지가 보임
위 캡쳐에는 없지만 UI에 아직 사용중이라면 그것도 저기에 알려줌
참고해서 참조 끊기를 보완해주고 다시 확인하면 됨
끝 !
'Unity > Tips' 카테고리의 다른 글
[Unity] 어드레서블 Simplify Addressable Names 커스텀 (0) | 2024.12.16 |
---|---|
[Unity] 프로젝트 시작과 함께하는 에셋들 추천 - 무료 에셋 편 (1) | 2024.04.26 |
[Unity 최적화] Dynamic Resolution을 적용해보자! (0) | 2023.08.02 |
[Unity] 유니티 에디터 OpenGL/Vulkan 그래픽스API로 열기 (0) | 2023.08.02 |
[Unity] Adressable에셋 코드로 링크(인스펙터 등록)하기 (0) | 2023.06.24 |