Unity는 Code 영역을 제외하고 크게 두가지 Heap Memory를 관리한다.
Native heap Memory(Unity Engine이 관리하는 Memory)
Unity Engine이 내부적으로 C++로 구현되어 있기 때문에 Native Heap이다.
Unity Engine이 OS로부터 memory를 할당받아 texture, sound, level data등을 저장하고 있는 영역으로
unity engine이 담당하여 scene전환이 일어날 떄 필요없게 된 resource를 해제하는 작업을 engine이 자동으로 수행한다.
Engine에 의해 memory가 자동으로 해제되지 않는 경우
DontDestroyOnLoad( ) 함수를 통해 개발자가 scene전환이 일어나도 memory가 해제되지 않도록 설정해놓는 경우
Script에서 Scene Object를 참조하고 있는 경우
대부분의 Script의 참조는 Scene이 전환됨과 동시에 파괴되는데 위와 같은 경우에 의해 Scene이 전환됨에도 살아있는 GameObject가 있고
이 GameObject가 Script내에서 다른 resource들을 참고하고 있다면 이 resource들 또한 해제되지 않는다.
Managed Heap Memory(Mono Framework가 관리하는 메모리)
Managed Heap영역은 script에서 할당된 memory로서 Mono Framework에 의해 관리되는 영역
Scripting runtime(Mono, IL2CPP) memory manager가 자동으로 관리하는 memory
어떤 instance가 더이상 필요해지지 않을때, 즉 instance를 참조하는곳이 없어지게 되면 GC가 참조가 없어진 instance들을 찾아
Managed Heap상에서 삭제한다.
GC가 Memory를 수집하는 동안에 framerate가 떨어지거나 application의 반응이 늦어질 수 있다.
참고
https://chfhrqnfrhc.tistory.com/entry/Unity-Heap-Memory-%EA%B5%AC%EC%A1%B0
'TOOL > Unity' 카테고리의 다른 글
Coroutine / IEnumerator / IEnumerable (0) | 2019.03.06 |
---|---|
Unity CG / Boehm-Demer-Weiser / 점진적 GC (0) | 2019.03.05 |
Mono / Mono Behaviour (0) | 2019.03.05 |
IL2CPP / GCC / C# C++ Assembly 변환과정 (0) | 2019.03.05 |
Asset Bundle Manager (0) | 2019.02.27 |