본문 바로가기

TOOL/Unity

대표적인 Memory leak 발생 유형

Singleton static instance


더이상 사용하지 않는 singleton객체의 OnDestroy( )함수에서 반드시 instance = null; 처리를 해 주어야 한다.

그렇지 않으면 OnDestroy( ) 이후에도 객체는 계속해서 살아있다.


OnDestroy( )함수를 만들어 두고, instance = null; 코드를 넣어둘것



Delegate


저번에도 언급한적 있지만

A객체의 delegate에 B객체의 event를 등록한다.

B객체를 파괴시키려 할때 A객체에 등록해준 event를 해제(unregister)해 주지 않으면

A객체가 파괴되지않는 이상 B객체도 파괴되지 않는다.


따라서 B객체 파괴시 자신의 모든 event가 제대로 등록해 둔 모든 delegate에서 해제되는지를 보장해 주어야 한다.



Texture


Prefab이 텍스쳐를 직접 물고있고(?), prefab이 Scene을 물고있을경우(?) Scene에서 나와도 텍스쳐가 해제되지 않는다.

(Unity Texture와 NGUId의 UITexture 모두)


직접 링크방식이 아닌, resource의 path 정보로 Resource.LoadResource를 통해 로드하는 방식으로 바꾸어야 한다.

이것만으로도, Prefab이 파괴될 때 자연스럽게 해결된다.


하지만, 파괴되지 않고 disable처리만 되는 경우 OnDisable에서 Texture 또는 UITexture객체에 직접 null을 대입해 주어야 한다.



Material


Material의 경우 참조를 하고 있던 것이 있다면, 해당 객체가 파괴될 때 반드시 material의 참조를 끊어주어야 한다.

변수에 직접 참조하고 있다면 null을 대입, 자료구조에 담고 있다면 반드시 그것을 비워주어야 한다.


ex) 다음과 같이 Material을 자료구조에서 사용하고 있다면


  1. private readonly Dictionary<Renderer, List<Material>> _originMaterials = new Dictionary<Renderer, List<Material>>();
  2. private readonly List<Material> _cachedMaterials = new List<Material>();


다음과 같이 파괴될 때 자료구조를 확실히 비워주자


  1. void OnDestroy()
  2. {
  3.     _originMaterials.Clear();
  4.     _cachedMaterials.Clear();
  5. }



Animation Clip


특정 객체가 Animation Clip을 명시적으로 로드하여 사용하였다면, 객체 파괴시 Unload Asset( )을 명시적으로 호출해 주어야 한다.


  1. void OnDestroy()
  2. {
  3.     Resource.UnloadAsset(/*해당 animationClip*/);
  4. }



Resources.UnloadUnusedAssets( )


Scene에 진입하거나, Scene에서 나올 떄 사용되지 않는 리소스를 unload 해주는 함수다.


Resources.Load로 load한 asset중에 prefab은 Resources.UnloadAsset( )을 사용할 수 없다고 한다.

prefab류의 asset들은 reference count가 0이 되서 Resources.UnloadUnusedAssets( )에서 해제되는 길밖에 없다.





참고 

http://egloos.zum.com/sweeper/v/3190661

https://ronniej.sfuh.tk/assetbundleusagepattern1/

'TOOL > Unity' 카테고리의 다른 글

Mono / Mono Behaviour  (0) 2019.03.05
IL2CPP / GCC / C# C++ Assembly 변환과정  (0) 2019.03.05
Asset Bundle Manager  (0) 2019.02.27
Asset bundle 사용법  (0) 2019.02.27
Asset Bundle  (0) 2019.02.26