Unity Text(UIVertex[]) Memory Leak
메모리 검사를 하던 중 씬을 이동 할때 마다 uivervex[] 라는 항목이 계속 증가하는 것을 확인했는데 따로 text를 저장하는 코드가 없어서 많이 해매였다.
-테스트용 씬 스크립트-
간단한 테스트용 스크립트를 만들었다 폰트를 변경하고 버튼을 누르면 B씬을 불러오고 그 씬에서도 폰트를 변경하고 다시 A씬으로 돌아오는 것을 반복하는 스크립트이다.
-처음 프로파일러에 잡히는 uivertex-
-씬을 여러차례 이동 후에 잡히는 uivertex-
테스트 씬에서 재현을 한 후에 레퍼런스 연결을 따라가보니 FontUpdateTracker 라는 곳에서 해당 텍스트들을 전부 들고 있는 걸 확인했는데 해당 스크립트는 유니티 스크립트라 유니티에서 함수 내부를 확인하지는 못했고 깃허브를 이용해 스크립트를 찾을 수 있었다.(https://github.com/liuqiaosz/Unity/blob/master/UGUI%E6%BA%90%E4%BB%A3%E7%A0%81/UnityEngine.UI/UI/Core/FontUpdateTracker.cs)
보자마자 (static Dictionary<Font, List<Text>> m_Tracked) 해당 딕셔너리가 문제가 있는게 보였고 Add하는 부분과 Remove하는 부분을 찾아보니 몇 군데 있었지만 중요한건 enable과 disable 그리고 font를 수정할 때 add를 하거나 remove를 하는데 여기서 문제였던게
우리 게임에서는 폰트를 코드로 추가해주는데 해당 컴포넌트가 들어가있는 오브젝트가 꺼져있든 켜져있는 수정을 해주는데 이때 add가 되고 만약에 해당 오브젝트가 켜지기 전에 씬을 이동할 경우 disable이 동작하지 않기 때문에 딕셔너리에서 빠지지 않아서 계속 쌓이는 것이였다.
원인을 찾았으니 수정을 해주면된다.
-수정된 폰트 교체 코드-
수정 후에 재 테스트를 하였다.
-재 테스트 결과-
위에 있던 이미지와 같은 이미지가 아니다 이번에는 확실히 여러번 이동 했음에도 메모리가 정상적으로 빠지는 것을 확인 할 수 있었다.
해당 내용이 비록 작은 게임에서는 그렇게 큰 메모리 문제로 나타나지 않을 수 있으나 텍스트가 많을 경우 그리고 씬을 자주 이동할 경우 심하면 계속 같은 양 만큼 증가 하기 때문에 10mb 20mb 30mb 씩 늘어나는 경우도 있었는데 이러한 내용을 알려주지 않은 유니티에 당황스럽기도하고(어디 있는데 못찾은 걸 수도 있다.) ondestroy에 remove를 넣거나 add할때 if문 하나만 걸어줘도 방지 할 수 있는 걸 지금까지 방치한것도 문제가 있어보인다.
해당 사항은 추후에 다시 정리해서 버그리포트에 올릴 계획입니다.
댓글 없음:
댓글 쓰기