Unity Engine에서 가비지 컬렉터 호출 지점을 그래프로 보여주고, 메모리 히스토리를 파일로 I/O하여 비교할 수 있는 커스텀 에디터 윈도우
https://drive.google.com/drive/folders/1zsrdGLh9p7opG4H9u1sYycETL3ILjBT_?usp=sharing
- Unity Engine 2023.2.16f1
- Visual Studio Community 2022
- C#
- Unity Engine의 커스텀 에디터 기능
- EditorWindow
- EditorGUILayer / GUILayer
- System.IO
- C#의 메모리 프로파일링
유니티는 가비지 컬렉터(GC) 호출 시점을 추적할 수 없으나, 메모리 사용량 변화를 추적하여 GC호출을 유추할 수 있음. (GC 호출 후 메모리 사용량이 급격히 떨어짐)
- 특정 시간 간격으로 메모리 사용량을 수집하고, 메모리 사용량이 10MB 이상 떨어질 때 GC가 호출되었다고 가정하여 이를 그래프로 시각화
- 메모리 사용량 추적 : System.GC.GetTotalMemory를 사용하여 현재 메모리 사용량을 주기적으로 측정
- GC 호출 추정 : 이전 메모리 사용량과 현재 메모리 사용량을 비교하여, 10MB이상 변화 감지 시 GC호출로 가정
- 그래프 시각화 : 메모리 사용량 변화를 시간 축에 따라 그래프로 표현하고, GC호출로 판단되는 지점을 빨간색으로 표시
- 현재 할당된 메모리 및 사용량을 그래프와 수치로 표시
- 메모리에 어떤 오브젝트나 리소스가 할당되는지 추적하여 GC 발생 원인 분석 가능. 이를 위해 메모리 사용량을 주기적으로 샘플링해서 큰 변화가 있을 때 자동으로 할당을 추적.
- 메모리 히스토리 그래프 저장 및 비교 가능. 특정 시점의 데이터를 JSON, CSV로 변환하여 내보낼 수 있고, 데이터를 불러와서 최적화 전-후 데이터 간 변화를 쉽게 확인 가능
- System.GC.GetTotalMemory를 사용하여 애플리케이션이 할당한 총 메모리 사용량을 1MB로 나누어 MB단위로 변환. 이때 GetTotalMemory를 false로 설정하여, gc를 강제로 실행하지 않는다.
- 현재 메모리 사용량과 이전 메모리 사용량의 차가 10mb 이상일 때. 즉 가비지컬렉터 호출 시점으로 간주될 때 메모리 사용량을 기록.
- 메모리 데이터가 너무 많아져서 그래프너비(최대 샘플 수)를 넘어가면, 오래된 데이터는 제거한다.
- 현재 메모리 사용량을 소수점 둘째 자리까지 표시.
- 메모리 사용 이력 + 어떤 소스가 메모리를 할당했는지 표시.
- GC가 호출된 시점에 어떤 메모리 할당이 원인이 되었는지 표시.
- unknown은 엔진이나 플러그인에 의해 자동으로 메모리를 할당하는 경우임. 즉 추적 정보가 없는 메모리 할당을 의미.
- GC가 호출된 시점에 기록된 메모리 사용량과 어떤 리소스나 오브젝트가 메모리를 할당하여 GC가 트리거되었는지 확인
-
저장된 데이터와 현재 데이터를 비교하는 창을 출력.
-
JSON, CSV로 내보내고 불러온 이전-이후 시간대 별 메모리 사용량을 비교할 수 있음.
- csv, json 중 원하는 포맷을 선택한 후 SAVE
- Asset 폴더 내 DataFiles폴더에 저장됨
- CSV파일 저장 시
- JSON파일 저장 시
- 포맷에 맞는 Load를 클릭하면 Comparison 윈도우에 현재 메모리에 할당된 사용량, 이전 메모리 사용량과 증가/감소 여부가 출력됨
- 메모리 할당 시점 추적을 위한 메서드.
- 메모리 할당 소스를 기록하는 리스트인 AllocationSources에 GC를 트리거시킨 소스의 이름을 삽입
- 객체 생성 또는 씬 로드 시 등, 메모리 할당이 발생하는 메서드 (Instantiate, Load 등)에 래핑하여 추적 기능 구현 가능
- 가비지 컬렉션에 초점을 맞춘 직관적인 시각화
- 자동화된 분석 및 최적화 제안 : 데이터 분석을 자동화하여 메모리 최적화 팁이나 메모리 사용 패턴의 문제점을 바로 피드백 가능.
- GC 발생원인 추적 : 어떤 스크립트나 오브젝트가 메모리 할당을 유발했는지를 기록하여 원인을 명확히 추적하는 기능
- 메모리 히스토리 관리 및 비교 기능 : 이전 최적화 시점과 이후 성능차이를 쉽게 파악
- 커스텀 리포트 기능 : 메모리 사용과 gc 호출 데이터를 csv, json으로 내보내고, 분석 리포트를 자동으로 생성하는 기능. 프로젝트 최적화 과정의 문서화에 도움
- MemoryData : json파일 세이브, 로드를 위해 생성. 기존에는 Newtonsoft 네임스페이스에서 dynamic을 사용한 메서드를 썼는데, c# 버전에 따라 사용이 불가할 수 있기에 jsonutility로 대체
- GCVisualizer : 에디터 및 메인 소스
- 2024.09.12 Ver.1 : 오류로 인해 미배포
- 2024.09.13 Ver.2 : https://drive.google.com/drive/folders/1zsrdGLh9p7opG4H9u1sYycETL3ILjBT_?usp=sharing
- Ver.1 : 그래프 시각화, 메모리 및 GC트리거 내역 수치화 / UI 오류 및 파일 LOAD/SAVE 불가 오류
- Ver.2 : SAVE, LOAD 수행 시 EditorApplication.delayCall을 사용하여 DispalyDialog를 후순위로 호출하여 UI 오류 해결, 파일 경로를 Application.dataPath를 사용하여 상대경로로 지정하고 디렉터리 널체크 추가