
Unity의 메모리 프로파일링
다양한 플랫폼과 장치에서 게임 성능을 프로파일링하고 조정하면 플레이어 기반을 확장하고 성공 가능성을 높일 수 있습니다.
이 페이지는 Unity에서 애플리케이션의 메모리 사용량을 분석하기 위한 두 가지 도구에 대한 정보를 제공합니다: 내장된 메모리 프로파일러 모듈과 메모리 프로파일러 패키지, 프로젝트에 추가할 수 있는 Unity 패키지입니다.
여기 있는 정보는 전자책 Unity 게임 프로파일링에 대한 궁극적인 가이드의 발췌본이며, 무료로 다운로드 가능합니다. 이 전자책은 게임 개발, 프로파일링 및 최적화 분야의 외부 및 내부 Unity 전문가들이 공동으로 작성했습니다.
Unity의 메모리 프로파일링에 대해 알아보려면 계속 읽어보세요.
메모리 프로파일링
메모리 프로파일링은 하드웨어 플랫폼 메모리 제한에 대한 테스트, 로딩 시간 및 충돌 감소, 구형 장치와의 호환성 확보에 유용합니다. 메모리 사용량을 실제로 증가시키는 변경을 통해 CPU/GPU 성능을 개선하려는 경우에도 관련이 있을 수 있습니다. 이는 런타임 성능과는 크게 관련이 없습니다.
Unity에서 애플리케이션의 메모리 사용량을 분석하는 방법은 두 가지가 있습니다.
메모리 프로파일러 모듈: 이것은 애플리케이션이 메모리를 사용하는 위치에 대한 기본 정보를 제공하는 내장 프로파일러 모듈입니다.
메모리 프로파일러 패키지: 이것은 프로젝트에 추가할 수 있는 Unity 패키지입니다. Unity Editor에 추가적인 메모리 프로파일러 창을 추가하여 애플리케이션의 메모리 사용량을 더욱 자세히 분석할 수 있습니다. 스냅샷을 저장 및 비교하여 메모리 누수를 찾거나 메모리 레이아웃을 확인하여 메모리 단편화 문제를 찾을 수 있습니다.
이 내장 도구를 사용하면 메모리 사용량을 모니터링하고, 메모리 사용량이 예상보다 높은 애플리케이션의 영역을 찾고, 메모리 단편화를 찾아 개선할 수 있습니다.

메모리 할당량 이해 및 정의
대상 장치의 메모리 제한을 이해하고 예산을 세우는 것은 다중 플랫폼 개발에 매우 중요합니다. 장면과 레벨을 설계할 때는 각 대상 장치에 설정된 메모리 예산을 준수해야 합니다. 제한과 가이드라인을 설정함으로써 각 플랫폼의 하드웨어 사양의 범위 내에서 애플리케이션이 잘 작동하도록 보장할 수 있습니다.
장치 메모리 사양은 개발자 문서에서 찾을 수 있습니다. 예를 들어, Xbox One 콘솔은 포그라운드에서 실행되는 게임에 대해 최대 5GB의 사용 가능한 메모리로 제한됩니다, 문서에 따라.
메시 및 셰이더 복잡성, 텍스처 압축에 대한 콘텐츠 예산을 설정하는 것도 유용할 수 있습니다. 이 모든 것이 할당되는 메모리 양에 영향을 미칩니다. 이 예산 수치는 프로젝트 개발 주기 동안 참조할 수 있습니다.
물리적 RAM 한계 결정
각 대상 플랫폼에는 메모리 한도가 있으며, 이를 알게 되면 애플리케이션의 메모리 예산을 설정할 수 있습니다. 메모리 프로파일러를 사용하여 캡처 스냅샷을 살펴보세요. 하드웨어 리소스(위 이미지를 참조)는 물리적 랜덤 액세스 메모리(RAM) 및 비디오 랜덤 액세스 메모리(VRAM) 크기를 보여줍니다. 이 수치는 모든 공간이 사용 가능한 것은 아닐 수 있다는 사실을 고려하지 않습니다. 그러나 작업을 시작하는 데 유용한 대략적인 수치를 제공합니다.
대상 플랫폼의 하드웨어 사양을 교차 참조하는 것이 좋습니다. 여기 표시된 수치가 항상 전체 그림을 보여주지는 않을 수 있습니다. 개발자 키트 하드웨어는 때때로 더 많은 메모리를 가지고 있거나, 통합 메모리 아키텍처를 가진 하드웨어에서 작업할 수 있습니다.
최소 RAM 사양 결정
지원하는 각 플랫폼의 RAM 측면에서 가장 낮은 사양의 하드웨어를 식별하고, 이를 사용하여 메모리 예산 결정을 안내하세요. 모든 물리적 메모리가 사용 가능한 것은 아닐 수 있음을 기억하세요. 예를 들어, 콘솔에는 이전 게임을 지원하기 위해 하이퍼바이저가 실행될 수 있으며, 이는 총 메모리의 일부를 사용할 수 있습니다. 사용할 비율에 대해 생각해 보세요 (예: 총 80%). 모바일 플랫폼의 경우, 고급 장치를 가진 사용자에게 더 나은 품질과 기능을 지원하기 위해 여러 사양 계층으로 나누는 것을 고려할 수 있습니다.
더 큰 팀을 위한 팀별 예산 고려
메모리 예산을 정의한 후, 팀별로 메모리 예산을 설정하는 것을 고려하세요. 예를 들어, 환경 아티스트는 로드된 각 레벨이나 씬에 사용할 수 있는 특정 양의 메모리를 받고, 오디오 팀은 음악 및 음향 효과를 위한 메모리 할당을 받습니다.
프로젝트가 진행됨에 따라 예산에 유연성을 가지는 것이 중요합니다. 한 팀이 예산보다 훨씬 적게 사용하면, 게임 개발의 다른 영역을 개선할 수 있다면 잉여를 다른 팀에 할당하세요.
대상 플랫폼에 대한 메모리 예산을 결정하고 설정한 후, 다음 단계는 프로파일링 도구를 사용하여 게임의 메모리 사용량을 모니터링하고 추적하는 것입니다.

메모리 프로파일러 모듈이 포함된 두 개의 뷰
메모리 프로파일러 모듈은 두 가지 뷰를 제공합니다: 간단한 뷰와 상세한 뷰입니다. 간단한 뷰를 사용하여 애플리케이션의 메모리 사용량에 대한 높은 수준의 개요를 얻으세요. 필요할 때, 상세한 뷰로 전환하여 더 깊이 파고들 수 있습니다.
간단한
총 예약 메모리 수치는 "Unity 메모리에 의해 추적된 총량"입니다. 여기에는 Unity가 예약했지만 현재 사용하지 않는 메모리가 포함됩니다 (그 수치는 총 사용 메모리입니다).
시스템 사용 메모리 수치는 OS가 애플리케이션에서 사용 중으로 간주하는 것입니다. 이 수치가 0으로 표시되면, 이는 프로파일러 카운터가 프로파일링 중인 플랫폼에 구현되지 않았음을 나타냅니다. 이 경우, 의존할 수 있는 가장 좋은 지표는 총 예약 메모리입니다. 이 경우, 자세한 메모리 정보를 위해 네이티브 플랫폼 프로파일링 도구로 전환하는 것이 권장됩니다.

메모리 프로파일러의 상세 보기
실행 파일, DLL 및 Mono 가상 머신이 사용하는 메모리 양을 살펴보려면 프레임별 메모리 수치로는 부족합니다. 이러한 메모리 분해를 조사하려면 자세한 스냅샷 캡처를 사용하십시오.
참고: 메모리 프로파일러 모듈의 자세한 보기에서 참조 트리는 네이티브 참조만 표시합니다. UnityEngine.Object에서 상속된 유형의 객체에서의 참조는 관리되는 셸의 이름으로 표시될 수 있습니다. 그러나 그들은 아래에 네이티브 객체가 있기 때문에만 표시될 수 있습니다. 관리되는 유형은 반드시 보이지 않을 것입니다. 예를 들어, Texture2D를 참조로 하는 객체를 예로 들어 보겠습니다. 이 보기를 사용하면 어떤 필드가 그 참조를 보유하고 있는지 볼 수 없습니다. 이러한 세부 정보를 보려면 메모리 프로파일러 패키지를 사용하십시오.
메모리 사용량이 플랫폼 예산에 접근하기 시작하는 시점을 고수준에서 결정하려면 다음의 "냅킨 뒷면" 계산을 사용하십시오:
시스템 사용 메모리(또는 시스템 사용이 0을 표시하면 총 예약 메모리) + 추적되지 않은 메모리의 대략적인 버퍼 / 플랫폼 총 메모리
이 수치가 플랫폼의 메모리 예산의 100%에 접근하기 시작하면 메모리 프로파일러 패키지를 사용하여 그 이유를 파악하십시오.
메모리 프로파일러 모듈의 많은 기능은 메모리 프로파일러 패키지에 의해 대체되었지만, 여전히 모듈을 사용하여 메모리 분석 작업을 보완할 수 있습니다.
예를 들면 다음과 같습니다.
- GC 할당을 찾으려면: 이들은 모듈에 표시되지만, 프로젝트 감사기 또는 심층 프로파일링을 사용하여 추적하기가 더 쉽습니다.
- 힙의 사용/예약 크기를 빠르게 살펴보려면
- 셰이더 메모리 분석
메모리 예산을 설정할 때 전체 목표 플랫폼의 사양이 가장 낮은 장치에서 프로파일링하는 것을 잊지 마십시오. 메모리 사용량을 면밀히 모니터링하고 목표 한계를 염두에 두십시오.
일반적으로 메모리가 많이 있는 강력한 개발자 시스템을 사용하여 프로파일링하는 것이 좋습니다(대용량 메모리 스냅샷을 저장하거나 이러한 스냅샷을 빠르게 로드 및 저장할 수 있는 공간이 중요합니다).
메모리 프로파일링은 CPU 및 GPU 프로파일링과 비교할 때 추가 메모리 오버헤드를 발생시킬 수 있다는 점에서 다른 성격을 가지고 있습니다. 더 높은 사양의 장치(더 많은 메모리)를 대상으로 메모리를 프로파일링해야 할 수도 있지만, 특히 저사양 목표 사양의 메모리 예산 한계를 주의 깊게 살펴보십시오.
메모리 사용량을 프로파일링할 때 고려해야 할 사항:
- 품질 수준, 그래픽 계층 및 AssetBundle 변형과 같은 설정은 더 강력한 장치에서 다른 메모리 사용량을 가질 수 있습니다. 예를 들면 다음과 같습니다.
- 품질 수준 및 그래픽 설정은 그림자 맵에 사용되는 RenderTextures의 크기에 영향을 미칠 수 있습니다.
- 해상도 스케일링은 화면 버퍼, RenderTextures 및 후처리 효과의 크기에 영향을 미칠 수 있습니다.
- 텍스처 품질 설정은 모든 텍스처의 크기에 영향을 미칠 수 있습니다.
- 최대 LOD는 모델 및 기타에 영향을 미칠 수 있습니다.
- HD(고화질) 및 SD(표준화질) 버전과 같은 AssetBundle 변형이 있고 장치 사양에 따라 사용할 버전을 선택하는 경우, 프로파일링하는 장치에 따라 자산 크기가 다를 수 있습니다.
- 대상 장치의 화면 해상도는 후처리 효과에 사용되는 RenderTextures의 크기에 영향을 미칠 것입니다.
- 장치의 지원되는 그래픽 API는 API에서 지원되는 변형에 따라 셰이더의 크기에 영향을 미칠 수 있습니다.
- 다양한 품질 설정, 그래픽 계층 설정 및 Asset Bundle 변형을 사용하는 계층화된 시스템을 갖추는 것은 더 넓은 범위의 장치를 대상으로 할 수 있는 훌륭한 방법입니다. 예를 들어, 4GB 모바일 장치에서 AssetBundle의 고화질 버전을 로드하고 2GB 장치에서 표준화질 버전을 로드하는 것입니다. 그러나 위의 메모리 사용량 변화를 염두에 두고 두 가지 유형의 장치와 서로 다른 화면 해상도 또는 지원되는 그래픽 API를 가진 장치를 모두 테스트해야 합니다.
참고: Unity Editor는 일반적으로 Editor 및 Profiler에서 로드된 추가 객체로 인해 더 큰 메모리 풋프린트를 항상 표시합니다. 빌드에서 메모리에 로드되지 않을 자산 메모리(주소 지정 시뮬레이션 모드에 따라 Asset Bundles에서 또는 Inspector에 표시된 자산의 스프라이트 및 아틀라스에서)를 표시할 수도 있습니다. 일부 참조 체인은 Editor에서 더 혼란스러울 수 있습니다.

메모리 프로파일러 패키지
메모리 프로파일러는 현재 Unity 2019 LTS 이상에서 미리보기 상태이며, Unity 2022 LTS에서 검증될 것으로 예상됩니다.
메모리 프로파일러 패키지의 큰 이점 중 하나는 네이티브 객체(메모리 프로파일러 모듈이 수행하는 것처럼)를 캡처하는 것 외에도 관리되는 메모리를 보고, 스냅샷을 저장하고 비교하며, 메모리 사용량에 대한 시각적 분석을 통해 메모리 내용을 더 자세히 탐색할 수 있다는 것입니다.
스냅샷은 엔진의 메모리 할당을 보여주어 과도하거나 불필요한 메모리 사용의 원인을 신속하게 식별하고, 메모리 누수를 추적하거나 힙 단편화를 확인할 수 있게 해줍니다.
메모리 프로파일러 패키지를 설치한 후 창 > 분석 > 메모리 프로파일러를 클릭하여 엽니다.
메모리 프로파일러의 상단 메뉴 바를 사용하면 플레이어 선택 대상을 변경하고 스냅샷을 캡처하거나 가져올 수 있습니다.
참고: 대상 선택 드롭다운을 사용하여 메모리 프로파일러를 원격 장치에 연결하여 대상 하드웨어에서 메모리를 프로파일링합니다. 유니티 에디터에서 프로파일링하면 에디터와 기타 도구에 의해 추가된 오버헤드로 인해 부정확한 수치를 얻게 됩니다.

단일 및 비교 스냅샷 보기
메모리 프로파일러 창의 왼쪽에는 워크벤치 영역이 있습니다. 이것을 사용하여 저장된 메모리 스냅샷을 관리하고 열거나 닫을 수 있습니다. 이 영역을 사용하여 단일 및 비교 스냅샷 보기 간에 전환할 수도 있습니다.
프로파일 분석기와 유사하게, 메모리 프로파일러는 두 개의 데이터 세트(메모리 스냅샷)를 로드하여 비교할 수 있게 해줍니다. 이는 메모리 사용량이 시간에 따라 또는 장면 간에 어떻게 증가했는지 살펴보거나 메모리 누수를 찾을 때 특히 유용합니다.
메모리 프로파일러는 요약, 객체 및 할당, 단편화 등 메모리 스냅샷을 깊이 파고들 수 있는 여러 탭을 메인 창에 가지고 있습니다. 이 옵션들을 자세히 살펴보겠습니다.

요약 뷰
프로젝트의 메모리 사용량에 대한 빠른 개요를 얻고 싶을 때 이 뷰를 선택하세요. 또한 캡처된 메모리 스냅샷에 대한 유용하고 중요한 메모리 관련 수치가 포함되어 있습니다. 스냅샷이 찍힌 시점에 무슨 일이 일어나고 있는지 빠르게 살펴보기에 완벽합니다.

그래픽 트리 맵
트리 맵 뷰는 객체에 의해 사용된 메모리의 분 breakdown을 그래픽 트리 맵으로 표시하며, 가장 많은 메모리를 소비하는 객체의 유형을 발견하기 위해 드릴다운할 수 있습니다.

트리 맵: 필터링된 테이블
트리 맵 뷰 아래에는 선택된 그리드 셀의 객체 목록을 표시하도록 업데이트되는 필터링된 테이블이 있습니다.
트리 맵은 객체에 할당된 메모리를 보여줍니다. 이는 네이티브 또는 관리형일 수 있습니다. 관리형 객체 메모리는 네이티브 객체 메모리에 비해 작게 나타나는 경향이 있어 맵 뷰에서 찾기 어렵습니다. 트리 맵을 확대하여 이를 살펴볼 수 있지만, 더 작은 객체를 검사할 때는 테이블이 보통 더 나은 개요를 제공합니다. 트리 맵의 셀을 클릭하면 아래 테이블이 섹션의 유형에 맞게 필터링되거나 테이블에서 관심 있는 특정 객체가 선택됩니다.
테이블 행이나 이를 나타내는 트리 맵 그리드 셀을 선택하여 이 목록의 객체를 참조하는 항목을 추적할 수 있으며, 이러한 참조가 있는 관리형 클래스 필드를 확인할 수 있습니다. 측면이 숨겨져 있는 경우, 툴바의 오른쪽 상단 부분에 있는 토글 버튼을 통해 이를 표시할 수 있습니다.
참고: 트리 맵은 메모리의 객체만 표시합니다. 이는 추적된 메모리의 전체 표현이 아닙니다. 메모리 사용 개요 숫자가 추적된 메모리 총계와 같지 않은 경우 이해하는 것이 중요합니다.
이는 모든 네이티브 메모리가 객체에 연결되어 있지 않다는 사실에서 비롯됩니다. 또한 실행 파일, DLL, 네이티브 배열 등과 같은 객체와 관련이 없는 네이티브 할당으로 구성될 수 있습니다. “예약되었지만 사용되지 않는 메모리 공간”과 같은 더 추상적인 개념도 네이티브 할당 총계에 영향을 미칠 수 있습니다.

오브젝트 및 할당
오브젝트 및 할당 보기에서는 모든 오브젝트, 모든 네이티브 오브젝트, 모든 관리형 오브젝트, 모든 네이티브 할당 등과 같은 미리 만들어진 선택을 기반으로 필터를 전환할 수 있는 테이블을 보여줍니다.
선택한 범위에서 오브젝트, 할당 또는 메모리 영역을 표시하도록 하단 테이블을 전환할 수 있습니다. 트리 맵 보기에서 언급한 바와 같이, 모든 메모리가 오브젝트와 관련된 것은 아니므로 모든 메모리 영역 및 모든 네이티브 할당 페이지는 메모리 사용량에 대한 보다 완전한 그림을 제공할 수 있으며, 메모리 영역에는 예약되었지만 현재 사용되지 않는 메모리도 포함됩니다.
메모리 사용량을 최적화하고 메모리 예산이 제한된 하드웨어 플랫폼을 위해 메모리를 보다 효율적으로 패킹하는 것을 목표로 할 때 이를 활용하십시오.
메모리 프로파일링 기술 및 워크플로우
메모리 프로파일러 스냅샷을 로드하고 트리 맵 보기를 통해 메모리 발자국 크기 순서로 정렬된 카테고리를 검사합니다.
프로젝트 자산은 종종 메모리 소비가 가장 높은 경우입니다. 테이블 보기를 사용하여 텍스처 오브젝트, 메시, 오디오 클립, 렌더 텍스처, 셰이더 및 미리 할당된 버퍼를 찾습니다. 이들은 모두 메모리 최적화의 좋은 후보입니다.
메모리 누수 찾기
메모리 누수는 일반적으로 다음과 같은 경우에 발생합니다:
- 코드를 통해 메모리에서 객체가 수동으로 해제되지 않음
- 의도하지 않은 참조로 인해 객체가 메모리에 남아 있음
메모리 프로파일러 비교 모드는 특정 시간 프레임에 걸쳐 두 개의 스냅샷을 비교하여 메모리 누수를 찾는 데 도움을 줄 수 있습니다.
Unity 게임에서 일반적인 메모리 누수 시나리오는 장면을 언로드한 후 발생할 수 있습니다.
메모리 프로파일러 패키지에는 비교 모드를 사용하여 이러한 유형의 누수를 발견하는 과정을 안내하는 워크플로우가 있습니다.
응용 프로그램 수명 동안 반복되는 메모리 할당 찾기
여러 메모리 스냅샷의 차별적 비교를 통해 애플리케이션 수명 동안 지속적인 메모리 할당의 출처를 식별할 수 있습니다.
다음 섹션에서는 프로젝트에서 관리형 힙 할당을 식별하는 데 도움이 되는 몇 가지 팁을 나열합니다.

메모리 할당 찾기
Unity Profiler의 메모리 프로파일러 모듈은 프레임당 관리형 할당을 빨간 선으로 나타냅니다. 이 값은 대부분의 경우 0이어야 하므로 해당 선의 스파이크는 관리형 할당을 조사해야 하는 프레임을 나타냅니다.

CPU 사용 프로파일러 모듈의 타임라인 뷰
CPU 사용 프로파일러 모듈의 타임라인 뷰는 관리형 할당을 포함한 할당을 분홍색으로 표시하여 쉽게 확인하고 집중할 수 있도록 합니다.

할당 호출 스택
할당 호출 스택은 코드에서 관리형 메모리 할당을 신속하게 발견할 수 있는 방법을 제공합니다. 이들은 깊은 프로파일링이 일반적으로 추가하는 것에 비해 더 적은 오버헤드로 필요한 호출 스택 세부정보를 제공하며, 표준 프로파일러를 사용하여 즉시 활성화할 수 있습니다.
프로파일러에서 할당 호출 스택은 기본적으로 비활성화되어 있습니다. 이들을 활성화하려면 프로파일러 창의 기본 툴바에서 호출 스택 버튼을 클릭하십시오. 세부정보 뷰를 관련 데이터로 변경하십시오.
참고: 이전 버전의 Unity(할당 호출 스택 지원 이전)를 사용하고 있다면, 깊은 프로파일링은 관리형 할당을 찾는 데 도움이 되는 전체 호출 스택을 얻는 좋은 방법입니다.
계층 또는 원시 계층에서 선택된 GC.Alloc 샘플은 이제 호출 스택을 포함합니다. 타임라인의 선택 툴팁에서도 GC.Alloc 샘플의 호출 스택을 볼 수 있습니다.

CPU 사용 프로파일러의 계층 뷰
CPU 사용 프로파일러의 계층 뷰에서는 열 머리글을 클릭하여 정렬 기준으로 사용할 수 있습니다. GC 할당으로 정렬하는 것은 그에 집중하는 좋은 방법입니다.
프로젝트 감사기
프로젝트 감사기는 실험적인 정적 분석 도구입니다. 유용한 많은 기능을 수행하며, 그 중 몇 가지는 이 가이드의 범위를 벗어나지만, 프로젝트를 실행하지 않고도 관리형 할당을 유발하는 코드의 모든 줄 목록을 생성할 수 있습니다. 이러한 문제를 찾고 조사하는 매우 효율적인 방법입니다.
메모리 및 GC 최적화
Unity는 Boehm-Demers-Weiser 가비지 수집기를 사용하여 프로그램 코드를 실행 중지하고 작업이 완료되면 정상 실행을 재개합니다.
GC 스파이크를 유발할 수 있는 불필요한 힙 할당에 주의하십시오.
- 문자열: C#에서 문자열은 값 형식이 아닌 참조 형식입니다. 이는 모든 새로운 문자열이 관리 힙에 할당된다는 것을 의미합니다. 일시적으로만 사용되더라도 말입니다. 불필요한 문자열 생성이나 조작을 줄이십시오. JSON 및 XML과 같은 문자열 기반 데이터 파일을 파싱하는 것을 피하고, ScriptableObjects 또는 MessagePack 또는 Protobuf와 같은 형식으로 데이터를 저장하십시오. 런타임에 문자열을 빌드해야 하는 경우 StringBuilder 클래스를 사용하십시오.
- 유니티 함수 호출: 일부 유니티 API 함수는 힙 할당을 생성합니다. 특히 관리 객체 배열을 반환하는 함수가 그렇습니다. 루프 중간에 배열을 할당하는 대신 배열에 대한 참조를 캐시하십시오. 또한, 가비지 생성을 피하는 특정 함수를 활용하십시오. 예를 들어, GameObject.CompareTag를 사용하여 문자열을 GameObject.tag와 수동으로 비교하는 대신 사용하십시오(새 문자열을 반환하면 가비지가 생성됩니다).
- 박싱: 참조 형식 변수 대신 값 형식 변수를 전달하는 것을 피하십시오. 이것은 임시 객체를 생성하며, 그에 따른 잠재적인 가비지는 값 형식을 타입 객체로 암시적으로 변환합니다(예: int i = 123; object o = i). 대신, 전달하려는 값 형식으로 구체적인 오버라이드를 제공하도록 하십시오. 제네릭을 이러한 오버라이드에 사용할 수도 있습니다.
- 코루틴: yield는 가비지를 생성하지 않지만, 새로운 WaitForSeconds 객체를 생성하는 것은 가비지를 생성합니다. yield 라인에서 생성하는 대신 WaitForSeconds 객체를 캐시하고 재사용하십시오 또는 yield return null을 사용하십시오.
- LINQ 및 정규 표현식: 이 두 가지 모두 뒤에서 박싱으로 인해 가비지를 생성합니다. 성능 문제가 있는 경우 LINQ 및 정규 표현식을 피하십시오. 새 배열을 생성하는 대신 for 루프를 작성하고 리스트를 사용하십시오.
- 제네릭 컬렉션 및 기타 관리형 유형: 업데이트의 매 프레임마다 리스트나 컬렉션을 선언하고 채우지 마십시오(예: 플레이어의 특정 반경 내 적 리스트). 대신, 리스트를 MonoBehaviour의 멤버로 만들고 Start에서 초기화하십시오. 사용하기 전에 매 프레임마다 Clear로 컬렉션을 비우십시오.
가능한 경우 시간 가비지 수집
가비지 수집 중단이 게임의 특정 지점에 영향을 미치지 않을 것이라고 확신하는 경우, System.GC.Collect로 가비지 수집을 트리거할 수 있습니다.
이점을 활용하는 방법에 대한 예는 자동 메모리 관리 이해하기를 참조하십시오.
증분 가비지 수집기를 사용하여 GC 작업 부하를 분할하십시오
프로그램 실행 중에 단일 긴 중단을 만드는 대신, 증분 가비지 수집은 여러 개의 짧은 중단을 사용하여 작업 부하를 여러 프레임에 분산시킵니다. 가비지 수집으로 인해 불규칙한 프레임 속도가 발생하는 경우, 이 옵션을 시도하여 GC 스파이크 문제를 줄일 수 있는지 확인하십시오. 프로파일 분석기를 사용하여 애플리케이션에 대한 이점을 확인하십시오.
증분 모드에서 GC를 사용하면 일부 C# 호출에 읽기-쓰기 장벽이 추가되며, 이는 스크립팅 호출 오버헤드로 인해 프레임당 약 1ms의 오버헤드를 추가할 수 있습니다. 최적의 성능을 위해, 매인 게임 플레이 루프에서 GC 할당이 없도록 하는 것이 이상적이며, 이를 통해 부드러운 프레임 속도를 위해 증분 GC가 필요하지 않게 하고, 사용자가 인식하지 못하는 곳에서 GC.Collect를 숨길 수 있습니다. 예를 들어 메뉴를 열거나 새 레벨을 로드할 때입니다.
메모리 프로파일러에 대해 더 알아보려면 다음 리소스를 확인하십시오:
- 메모리 프로파일러 문서
- Unity의 메모리 프로파일러로 메모리 사용량 개선하기 튜토리얼
- 메모리 프로파일러: 메모리 관련 문제를 해결하기 위한 도구 Unite 세션
- 메모리 프로파일러 Unity Learn 세션
