Hero background image

Unity의 메모리 프로파일링 도구를 사용하여 메모리 사용량을 프로파일링하고 분석합니다.

이 페이지는 Unity에서 애플리케이션의 메모리 사용량을 분석하기 위한 두 가지 도구에 대한 정보를 제공합니다: 메모리 프로파일러 패키지와 메모리 프로파일러 모듈입니다.
이 웹페이지는 이해를 돕기 위해 기계 번역으로 제공됩니다. 기계 번역으로 제공되는 콘텐츠에 대한 정확도나 신뢰도는 보장되지 않습니다. 번역된 콘텐츠의 정확도에 관해 의문이 있는 경우 웹페이지의 공식 영어 원문을 참고해 주시기 바랍니다.
메모리 프로파일러 안내서 및 튜토리얼 | Unity

-

광범위한 플랫폼과 장치에 대해 게임의 성능을 프로파일링하고 조정함으로써 플레이어 기반을 확장하고 성공 가능성을 높일 수 있습니다.

-

여기 있는 정보는 Unity 게임 프로파일링에 대한 궁극적인 가이드 (Unity 6판)에서 발췌한 것으로, 게임 개발, 프로파일링 및 최적화에 대한 외부 및 내부 Unity 전문가들이 만든 전자책입니다.

메모리 프로파일링이란 무엇인가요?

메모리 프로파일링은 런타임 성능과는 크게 관련이 없지만 하드웨어 플랫폼 메모리 제한에 대한 테스트나 게임이 충돌하는 경우에 유용합니다. CPU/GPU 성능을 향상시키기 위해 메모리 사용량을 실제로 증가시키는 변경을 원할 경우에도 관련이 있을 수 있습니다.

Unity에서 애플리케이션의 메모리 사용량을 분석하는 방법은 두 가지가 있습니다:

- 메모리 프로파일러 모듈: 이것은 정기 프로파일러에서 애플리케이션이 메모리를 사용하는 위치에 대한 기본 정보를 제공하는 내장 프로파일러 모듈입니다.

- 메모리 프로파일러: 이것은 프로젝트에 추가할 수 있는 Unity 패키지로 제공되는 전용 도구입니다. 이 도구는 Unity Editor에 추가적인 메모리 프로파일러 창을 추가하여 애플리케이션의 메모리 사용량을 더 자세히 분석할 수 있게 해줍니다. 스냅샷을 저장 및 비교하여 메모리 누수를 찾거나 메모리 레이아웃을 확인하여 메모리 단편화 문제를 찾을 수 있습니다. 이 가이드에서 나중에 더 자세히 다룰 것이며, 여기서는 고려해야 할 일반적인 사항에 집중하겠습니다.

이 두 도구 모두 메모리 사용량을 모니터링하고, 메모리 사용량이 예상보다 높은 애플리케이션의 영역을 찾고, 메모리 단편화를 찾아 개선할 수 있게 해줍니다.

메모리 프로파일러 패키지는 Unity 애플리케이션과 Unity Editor의 메모리 사용량을 검사하는 데 사용할 수 있는 도구입니다.
메모리 프로파일러 패키지는 Unity 애플리케이션과 Unity Editor의 메모리 사용량을 검사하는 데 사용할 수 있는 도구입니다.

메모리 할당량 이해 및 정의

대상 장치의 메모리 제한을 이해하고 예산을 세우는 것은 다중 플랫폼 개발에 매우 중요합니다. 장면과 레벨을 설계할 때는 각 대상 장치에 대해 설정된 메모리 예산을 준수해야 합니다. 제한과 지침을 설정함으로써 애플리케이션이 각 플랫폼의 하드웨어 사양의 범위 내에서 잘 작동하도록 보장할 수 있습니다.

장치 메모리 사양은 개발자 문서에서 찾을 수 있습니다.

메시 및 셰이더 복잡성, 텍스처 압축에 대한 콘텐츠 예산을 설정하는 것도 유용할 수 있습니다. 이 모든 것이 할당되는 메모리 양에 영향을 미칩니다. 이 예산 수치는 프로젝트 개발 주기 동안 참조할 수 있습니다.

물리적 RAM 한계 결정

각 플랫폼마다 메모리 한계가 있으므로, 애플리케이션은 각 대상 장치에 대한 메모리 예산이 필요합니다. 메모리 프로파일러를 사용하여 메모리 사용량의 캡처된 스냅샷을 확인하세요. 하드웨어 리소스 스냅샷(아래 이미지 참조)은 물리적 랜덤 액세스 메모리 (RAM) 및 비디오 랜덤 액세스 메모리 (VRAM) 크기를 보여줍니다. 이 수치는 그 공간의 모든 부분이 사용 가능하지 않을 수 있다는 사실을 고려하지 않습니다. 그러나 작업을 시작하기 위한 유용한 대략적인 수치를 제공합니다.

대상 플랫폼의 하드웨어 사양을 교차 참조하는 것이 좋습니다. 여기 표시된 수치가 항상 전체 그림을 보여주지는 않을 수 있습니다. 개발자 키트 하드웨어는 때때로 더 많은 메모리를 가지고 있거나, 통합 메모리 아키텍처를 가진 하드웨어에서 작업할 수 있습니다.

하드웨어 리소스 스냅샷은 스냅샷이 캡처된 기기의 RAM 및 VRAM 수치를 보여줍니다.
하드웨어 리소스 스냅샷은 스냅샷이 캡처된 기기의 RAM 및 VRAM 수치를 보여줍니다.

최소 RAM 사양을 결정합니다.

지원하는 각 플랫폼에 대해 RAM의 가장 낮은 사양을 가진 하드웨어를 식별하고, 이를 메모리 예산 결정에 활용하세요. 물리적 메모리의 모든 부분이 사용 가능하지 않을 수 있음을 기억하세요. 예를 들어, 콘솔은 이전 게임을 지원하기 위해 하이퍼바이저가 실행되고 있을 수 있으며, 이는 총 메모리의 일부를 사용할 수 있습니다. 특정 시나리오에 따라 팀에서 사용할 비율(예: 총 메모리의 80%)에 대해 생각해 보세요. 모바일 플랫폼의 경우, 더 높은 사양의 장치를 가진 사용자에게 더 나은 품질과 기능을 지원하기 위해 여러 사양 계층으로 나누는 것을 고려할 수 있습니다.

더 큰 팀을 위한 팀별 예산 고려

메모리 예산을 정의한 후, 팀별 메모리 예산을 설정하는 것을 고려하세요. 예를 들어, 환경 아티스트는 로드된 각 레벨이나 장면에 사용할 특정 양의 메모리를 받고, 오디오 팀은 음악 및 음향 효과를 위한 메모리 할당을 받습니다. 이것이 경직되어 보일 수 있지만, 자원의 비용과 비교하여 창의적인 결정을 알리는 가이드라인으로 생각하세요.

프로젝트가 진행됨에 따라 예산에 유연성을 가지는 것이 중요합니다. 한 팀이 예산 이하로 들어오면, 게임 개발의 특정 영역을 개선할 수 있다면 잉여를 다른 팀에 할당하세요.

대상 플랫폼에 대한 메모리 예산을 결정하고 설정한 후, 다음 단계는 프로파일링 도구를 사용하여 게임의 메모리 사용량을 모니터링하고 추적하여 정보에 기반한 결정을 내리고 필요에 따라 조치를 취하는 것입니다.

메모리 프로파일링을 위한 몇 가지 팁

메모리 사용량이 플랫폼 예산에 접근하기 시작하는 시점을 고수준에서 결정하기 위해 다음의 "냅킨 뒷면" 계산을 사용하세요:

시스템 사용 메모리(또는 시스템 사용이 0인 경우 총 예약 메모리) + 추적되지 않은 메모리의 대략적인 버퍼 / 플랫폼 총 메모리

이 수치가 플랫폼의 메모리 예산의 100%에 가까워지기 시작하면, 메모리 프로파일러 패키지를 사용하여 그 이유를 파악하세요.

Unity 6에서는 메모리 프로파일러 모듈의 많은 기능이 메모리 프로파일러 패키지에 의해 대체되지만, 여전히 모듈을 사용하여 메모리 분석 작업을 보완할 수 있습니다. 예를 들면 다음과 같습니다.

- GC 할당을 찾기 위해: 이것들은 모듈에 나타나지만, 프로젝트 감사기 또는 심층 프로파일링을 사용하여 추적하기가 더 쉽습니다.

- 힙의 사용/예약 크기를 빠르게 살펴보기

- 셰이더 메모리 분석

- 메모리 프로파일러 모듈에서 상세 보기를 사용하여 가장 많은 메모리를 사용하는 항목을 찾기 위해 가장 높은 메모리 트리로 드릴다운하세요.

여기 Unity 프로파일러의 추가 사용 사례와 기능을 탐색하는 데 도움이 되는 몇 가지 리소스가 있습니다:

- Unity 매뉴얼의 프로파일러 개요

- Unity에서 프로파일링 소개

- 게임을 프로파일링하고 최적화하는 방법

보통 많은 메모리가 사용 가능한 강력한 개발자 시스템을 사용하여 프로파일링하는 것이 좋습니다(대용량 메모리 스냅샷을 저장하거나 이러한 스냅샷을 빠르게 로드 및 저장할 수 있는 공간이 중요합니다).

메모리 프로파일링은 CPU 및 GPU 프로파일링과는 다른 특성을 가지고 있으며, 추가적인 메모리 오버헤드를 발생시킬 수 있습니다. 더 높은 사양의 장치(더 많은 메모리)를 사용하여 메모리를 프로파일링해야 할 수도 있지만, 특히 저사양 목표 사양의 메모리 예산 한도를 주의해야 합니다.

품질 수준, 그래픽 계층 및 AssetBundle 변형과 같은 설정은 더 강력한 장치에서 다른 메모리 사용량을 가질 수 있습니다. 이를 염두에 두고, 메모리 프로파일링에서 최대한의 효과를 얻기 위해 기억해야 할 몇 가지 세부 사항은 다음과 같습니다:

- 품질 및 그래픽 설정은 그림자 맵에 사용되는 렌더 텍스처의 크기에 영향을 줄 수 있습니다.

- 해상도 스케일링은 화면 버퍼, 렌더 텍스처 및 후처리 효과의 크기에 영향을 줄 수 있습니다.

- 텍스처 설정은 모든 텍스처의 크기에 영향을 줄 수 있습니다.

- 최대 LOD는 모델 및 기타에 영향을 줄 수 있습니다.

HD(고화질)와 SD(표준화질) 버전과 같은 AssetBundle 변형이 있는 경우, 대상 장치의 사양에 따라 사용할 버전을 선택하면 프로파일링하는 장치에 따라 서로 다른 자산 크기를 얻을 수 있습니다.

- 대상 장치의 화면 해상도는 후처리 효과에 사용되는 렌더 텍스처의 크기에 영향을 미칩니다.

- 장치의 지원되는 그래픽 API는 지원하는 변형에 따라 셰이더의 크기에 영향을 미칠 수 있습니다(또는 지원하지 않을 수 있습니다).

- 서로 다른 품질 및 그래픽 설정과 AssetBundle 변형을 사용하는 계층화된 시스템은 더 넓은 범위의 장치를 타겟팅할 수 있는 훌륭한 방법입니다.

예를 들어, 4GB 모바일 장치에서 HD 버전의 AssetBundle을 로드하고, 2GB 장치에서 SD 버전을 로드할 수 있습니다. 그러나 위의 메모리 사용 변화를 염두에 두고 두 가지 유형의 장치와 서로 다른 화면 해상도 또는 지원되는 그래픽 API를 가진 장치를 모두 테스트해야 합니다.

참고: Unity Editor는 일반적으로 Editor와 Profiler에서 로드된 추가 객체로 인해 더 큰 메모리 사용량을 항상 표시합니다. 또한, 텍스처 메모리 사용량이 더 높습니다. 왜냐하면 모두 Editor에서 읽기/쓰기가 활성화되도록 강제되기 때문입니다.

Memory Profiler 모듈을 사용하면 시스템에 할당된 메모리 양을 쉽게 확인할 수 있습니다.
Memory Profiler 모듈을 사용하면 시스템에 할당된 메모리 양을 쉽게 확인할 수 있습니다.

메모리 프로파일러 패키지

Memory Profiler 패키지는 프로젝트의 메모리 사용량을 이해하고 최적화하는 데 도움을 줄 수 있습니다. 이 패키지는 Unity Editor 내에서와 대상 장치에서 실행 중인 Player 빌드에서 특정 순간의 애플리케이션 메모리 '스냅샷'을 캡처할 수 있게 해줍니다.

스냅샷은 메모리가 어떻게 사용되고 있는지에 대한 포괄적인 분석을 제공하며, 엔진 전반에 걸쳐 할당을 보여줍니다. 이것은 과도하거나 불필요한 메모리 사용의 원인을 식별하고, 메모리 누수를 추적하며, 힙 단편화와 같은 문제를 검사하는 데 도움을 줍니다.

Memory Profiler 패키지를 설치한 후, Window > Analysis > Memory Profiler를 통해 열 수 있습니다.

Memory Profiler의 상단 메뉴 바를 사용하면 플레이어 선택 대상을 변경하고 스냅샷을 캡처하거나 가져올 수 있습니다. 왼쪽 상단 모서리의 대상 선택 드롭다운을 사용하면 Memory Profiler를 원격 장치에 연결하여 대상 하드웨어에서 메모리를 직접 프로파일링할 수 있습니다. Unity Editor에서 프로파일링하면 Editor와 기타 도구에서 추가된 오버헤드로 인해 부정확한 수치를 제공하므로 주의하십시오.

플레이어 선택을 변경하고 메모리 스냅샷을 캡처하거나 가져옵니다.
플레이어 선택을 변경하고 메모리 스냅샷을 캡처하거나 가져옵니다.

스냅샷 구성 요소

Memory Profiler 창의 왼쪽에는 스냅샷 구성 요소이 있습니다. 이것을 사용하여 저장된 메모리 스냅샷을 관리하고 열거나 닫습니다. 스냅샷 구성 요소는 단일 스냅샷 및 비교 스냅샷의 두 가지 보기를 제공합니다.

프로파일 분석기와 유사하게, 메모리 프로파일러는 두 개의 메모리 스냅샷을 나란히 로드하고 비교할 수 있게 해줍니다. 이 비교를 사용하여 시간에 따른 메모리 증가를 추적하고, 장면 간 사용을 분석하거나, 잠재적인 메모리 누수를 식별할 수 있습니다.

메모리 프로파일러는 메인 창에 메모리 스냅샷을 자세히 살펴볼 수 있는 여러 탭이 있으며, 주요 탭은 요약, 유니티 객체, 및 모든 메모리입니다. 각 옵션을 자세히 살펴보겠습니다.

여러 메모리 스냅샷을 관리할 수 있습니다.
여러 메모리 스냅샷을 관리할 수 있습니다.

요약 탭

요약 탭은 메모리 캡처가 이루어진 순간의 프로젝트 메모리 사용에 대한 높은 수준의 스냅샷을 제공합니다. 자세한 분석에 들어가지 않고 빠르고 유익한 개요를 원할 때 완벽합니다.

이 뷰는 주요 측정 항목을 강조 표시하며, 잠재적인 메모리 문제나 예상치 못한 사용 패턴을 빠르게 발견하는 데 도움이 될 수 있습니다. 스냅샷을 비교하거나 시간에 따른 메모리 사용을 디버깅할 때 특히 유용합니다. 몇 가지 주요 섹션을 살펴보겠습니다.

팁: 오른쪽 패널(아래 이미지 참조)에서는 스냅샷에 대한 유용한 맥락 정보를 찾을 수 있습니다. 이 정보는 가능한 문제를 경고하거나 결과 해석에 도움을 줄 수 있습니다.

장치의 메모리 사용량: 이것은 물리적 메모리에서 애플리케이션의 발자국을 보여줍니다. 캡처 시점에 메모리에 상주하는 모든 유니티 및 비유니티 할당을 포함합니다.

할당된 메모리 분포: 이 뷰는 할당된 메모리가 다양한 메모리 카테고리 간에 어떻게 분포되어 있는지를 시각화합니다.

추적되지 않은* 메모리 바를 주목하세요. 이는 Unity의 메모리 관리 시스템을 통해 추적되지 않는 메모리에 해당합니다. 이러한 할당은 네이티브 플러그인 및 드라이버에서 발생할 수 있습니다. 플랫폼별 프로파일러를 사용하여 대상 장치의 추적되지 않은 메모리 사용량을 분석하세요.

관리된 힙 활용도: 이 뷰에서는 Unity의 스크립팅 VM이 관리하는 메모리의 세부 정보를 확인할 수 있습니다. 여기에는 관리 객체에 사용되는 관리 힙 메모리, 이전에 객체에 의해 사용되었거나 마지막 힙 확장 중에 예약된 빈 힙 공간, 그리고 가상 머신 자체에서 사용되는 메모리가 포함됩니다.

상위 Unity 객체 카테고리: 이것은 스냅샷에서 가장 많은 메모리를 사용하는 Unity 객체의 유형(예: Texture2D, 메쉬, GameObject)을 표시합니다.

요약 탭에는 스냅샷이 캡처된 시점의 메모리 개요가 표시됩니다.
요약 탭에는 스냅샷이 캡처된 시점의 메모리 개요가 표시됩니다.

객체 탭

Unity 객체 탭은 메모리를 할당한 모든 Unity 객체, 객체가 사용하는 네이티브 및 관리 메모리의 양, 그리고 총합을 표시합니다. 이 정보를 사용하여 중복 메모리 항목을 제거할 수 있는 영역을 식별하거나 가장 많은 메모리를 사용하는 객체를 찾으세요. 검색 바를 통해 입력한 텍스트를 포함하는 테이블의 항목을 찾을 수 있습니다.

기본적으로 테이블은 할당된 크기별로 모든 관련 객체를 내림차순으로 나열합니다. 열 머리글 이름을 클릭하여 해당 열로 테이블을 정렬하거나 열이 오름차순 또는 내림차순으로 정렬되는지 변경할 수 있습니다.

메모리 사용량을 최적화하고 메모리 예산이 제한된 하드웨어 플랫폼을 위해 메모리를 보다 효율적으로 패킹하는 데 이점을 활용하세요.

Unity 객체 탭을 사용하면 캡처된 스냅샷 메모리 사용량을 높은 세분성으로 분석할 수 있습니다.
Unity 객체 탭을 사용하면 캡처된 스냅샷 메모리 사용량을 높은 세분성으로 분석할 수 있습니다.

메모리 프로파일링 기술 및 워크플로우

메모리 프로파일러 스냅샷을 분석하여 높은 메모리 사용 영역을 식별하는 것으로 시작하세요. 메모리 프로파일러 스냅샷을 캡처하거나 로드한 후, Unity 객체 탭을 사용하여 메모리 발자국 크기 순으로 정렬된 카테고리를 검사하세요.

프로젝트 자산은 종종 메모리의 가장 높은 소비자입니다. 테이블 모드를 사용하여 텍스처, 메시, 오디오 클립, 렌더 텍스처, 셰이더 변형 및 미리 할당된 버퍼를 찾습니다. 이들은 메모리 사용 최적화를 시작할 때 좋은 후보가 되는 경우가 많습니다. 프로젝트 감사자는 자산의 메모리 사용을 줄이는 방법에 대한 몇 가지 권장 사항을 제공할 수 있는 훌륭한 보조 도구입니다(자산이 임포트 설정 검사기에서 올바르게 설정되어 있는지 확인하는 것이 좋은 시작점입니다).

메모리 누수 찾기

메모리 누수는 사용되지 않는 자산, 객체 또는 리소스가 메모리에서 제대로 해제되지 않는 상황입니다. 이로 인해 메모리 사용량이 점진적으로 증가하고 성능 문제나 충돌이 발생할 수 있습니다.

메모리 누수는 일반적으로 다음과 같은 경우에 발생합니다:

- 객체가 코드에서 수동으로 메모리에서 해제되지 않습니다.

- 다른 객체가 여전히 해당 객체에 대한 참조를 유지하고 있기 때문에 객체가 의도치 않게 메모리에 남아 있습니다.

메모리 프로파일러에는 특정 시간 프레임 동안 두 스냅샷을 비교하여 스냅샷 비교 모드가 있어 메모리 누수 찾기에 도움이 될 수 있습니다. 이 비교는 메모리에서 해제되어야 할 객체가 지속적으로 남아 있는 것을 드러낼 수 있습니다.

Unity 게임에서 메모리 누수가 자주 발생하는 시나리오는 장면을 언로드한 후입니다. 언로드된 장면의 객체는 여전히 참조가 존재하는 경우 올바르게 가비지 수집되지 않을 수 있습니다.

애플리케이션 수명 동안 반복적인 메모리 할당 찾기

여러 메모리 스냅샷의 차별적 비교를 통해 애플리케이션 수명 동안 지속적인 메모리 할당의 출처를 식별할 수 있습니다.

다음 섹션에서는 프로젝트에서 관리된 힙 할당을 식별하는 데 도움이 되는 몇 가지 팁을 제공합니다.

두 스냅샷을 비교하여 차이를 확인합니다.
두 스냅샷을 비교하여 차이를 확인합니다.

메모리 프로파일러 모듈에 표시된 관리 할당

Unity 프로파일러의 메모리 프로파일러 모듈은 프레임당 관리된 할당을 빨간 선으로 나타냅니다. 이 값은 대부분의 경우 0이어야 하므로, 해당 선의 모든 급증은 관리된 할당을 조사해야 할 프레임을 나타냅니다.

GC Allocated in Frame에 스파이크가 표시되면 포인터는 관리형 할당을 파악할 수 있습니다.
GC Allocated in Frame에 스파이크가 표시되면 포인터는 관리형 할당을 파악할 수 있습니다.

CPU 사용량 프로파일러 모듈의 타임라인 뷰

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

관리되는 할당은 타임라인 뷰에서 분홍색 마커로 나타납니다.
관리되는 할당은 타임라인 뷰에서 분홍색 마커로 나타납니다.

할당 호출 스택

할당 호출 스택은 코드에서 관리되는 메모리 할당을 빠르게 발견할 수 있는 방법을 제공합니다. 이들은 깊은 프로파일링이 일반적으로 추가하는 것에 비해 더 적은 오버헤드로 필요한 호출 스택 세부정보를 제공합니다. 또한 표준 프로파일러를 사용하여 즉시 활성화할 수 있습니다.

할당 호출 스택은 프로파일러에서 기본적으로 비활성화되어 있습니다. 이들을 활성화하려면 프로파일러 창의 기본 툴바에서 호출 스택 버튼을 클릭하세요. 세부정보 뷰를 관련 데이터로 변경하세요.

참고: 할당 호출 스택 지원 이전의 구버전 Unity를 사용하는 경우, 깊은 프로파일링은 관리되는 할당을 찾기 위해 전체 호출 스택을 얻는 좋은 방법입니다.

계층 또는 원시 계층에서 선택된 GC.Alloc 샘플은 이제 호출 스택을 포함합니다. 타임라인의 선택 툴팁에서도 GC.Alloc 샘플의 호출 스택을 볼 수 있습니다.

프로파일러에서 할당 호출 스택을 활성화하면 관리형 할당을 위해 소스로 복귀하는 호출 스택을 따라갈 수 있습니다.
프로파일러에서 할당 호출 스택을 활성화하면 관리형 할당을 위해 소스로 복귀하는 호출 스택을 따라갈 수 있습니다.

CPU 사용량 프로파일러의 계층 뷰

CPU 사용 프로파일러의 계층 뷰에서는 열 머리글을 클릭하여 정렬 기준으로 사용할 수 있습니다. GC 할당으로 정렬하는 것은 그에 집중하는 좋은 방법입니다.

CPU 사용 프로파일러 모듈의 계층 뷰를 사용하는 것은 관리되는 할당을 필터링하고 집중하는 좋은 방법입니다.
CPU 사용 프로파일러 모듈의 계층 뷰를 사용하는 것은 관리되는 할당을 필터링하고 집중하는 좋은 방법입니다.

프로젝트 감사기

Unity 6.1에서 패키지로 도입된 프로젝트 감사기는 성능 최적화, 모범 사례 유지 및 프로젝트의 잠재적 문제와 병목 현상을 식별하는 데 도움을 주기 위해 설계된 Unity 프로젝트를 위한 강력한 분석 도구입니다.

프로젝트 감사기는 전체 프로젝트를 스캔하고 무거운 스크립트 호출, 사용되지 않는 자산, 과도한 엔티티 수 등과 같은 비효율성에 대한 상세한 보고서를 제공합니다.

프로젝트 감사기는 여러 가지 다른 영역을 다룹니다:

성능 최적화: 과도한 가비지 생성, 불필요한 객체 할당 또는 비싼 함수 호출과 같은 프로젝트의 런타임 성능에 영향을 줄 수 있는 문제를 식별합니다.

코드 및 자산 검토: 사용되지 않는 자산, 비효율적인 코드 패턴 또는 리팩토링할 수 있는 구식 API를 강조 표시합니다. 이것은 빌드 크기를 줄이고, 전체 프로젝트 유지 관리를 개선하며, 메모리 사용을 최적화하는 데 도움이 됩니다.

진단 및 모범 사례: 이것은 Unity 모범 사례를 기반으로 권장 사항을 제공하고, 누락된 참조나 최적이 아닌 플레이어 또는 품질 설정과 같은 프로젝트 설정과 관련된 오류나 경고를 강조합니다.

사용자 정의 가능한 보고서: 결과를 카테고리로 정리하여 최적화를 우선 순위에 따라 쉽게 할 수 있습니다. 특정 프로젝트나 요구 사항에 맞게 분석을 조정하기 위해 사용자 정의 규칙을 만들 수도 있습니다.

💡Tips:

- 개발의 주요 단계(예: 이정표, 베타 릴리스, 최종 빌드)에서 프로젝트 감사기를 실행하세요. 정기적인 감사는 성능 병목 현상, 사용되지 않는 자산 또는 구식 코드를 조기에 발견하여 프로젝트가 확장됨에 따라 문제가 더 커지는 것을 방지합니다.

- CI 또는 빌드 설정의 일환으로 프로젝트 감사기를 자동으로 실행할 수 있습니다(매뉴얼의 여기에 표시된 대로) 및 보고서를 사용하여 아무도 새로운 문제를 추가하는 자산이나 코드를 체크인하지 않도록 할 수 있습니다(여기에서 자세히 설명된 API 사용).

- 게임에서 반드시 잡고 싶은 특정 사항이 있다면 자신의 규칙을 추가할 수 있습니다; 예를 들어 텍스처 설정, 크기 또는 더 복잡한 규칙입니다. 이것을 수행하는 방법에 대한 자세한 내용은 매뉴얼의 이 페이지를 참조하세요.

프로젝트 감사기에 의해 생성된 보고서는 심각도(주요, 보통, 정보)별로 분류됩니다. 가장 심각한 문제에 먼저 집중하세요. 이는 종종 메모리의 과다 할당이나 과도한 가비지 수집과 같은 성능에 중요한 문제를 강조합니다. 이들은 또한 Update와 같이 더 자주 호출되는 코드 경로에 있을 가능성이 높으며, 이들이 가져오는 성능 문제는 플레이어에게 더 명확하게 드러납니다.

프로젝트 감사기는 플레이어 설정품질 설정과 같은 설정도 확인하고 변경할 수 있는 사항에 대한 권장 사항을 제공합니다. 이를 사용하여 빌드 대상, 해상도, 텍스트 압축 또는 기타 프로젝트 설정이 의도한 플랫폼에 최적화되어 있는지 확인하세요.

도메인 리로드

Unity 에디터는 플레이 모드 진입에 대한 설정을 구성할 수 있게 해줍니다; 이 페이지에 대한 자세한 내용이 있지만, 도메인 리로드를 비활성화하면 에디터 반복 시간을 단축할 수 있습니다. 그러나 이렇게 하면 플레이 모드에 들어갈 때마다 스크립팅 상태가 더 이상 초기화되지 않으므로, 코드를 수동으로 처리해야 합니다.

프로젝트 감사자의 코드 영역은 프로젝트의 스크립트를 분석하여 스크립트 변수를 재설정해야 하는 위치를 찾는 데 도움을 줄 수 있습니다. 도메인 리로드 보기에서 표시된 모든 문제를 수정한 후 도메인 리로드를 비활성화하는 것이 모범 사례로 간주됩니다. 이 보기를 데이터로 채우려면 환경 설정 창에서 Roslyn 분석기 사용 설정을 활성화해야 합니다. 그런 다음 매뉴얼의 지침을 따라 문제 목록을 실행할 수 있습니다. 모든 문제가 해결되면 플레이 모드에 들어갈 때 도메인 리로드를 비활성화할 수 있습니다.

프로젝트 감사자 요약 보기
프로젝트 감사자 요약 보기

메모리 및 GC 최적화

Unity는 Boehm-Demers-Weiser 가비지 수집기를 사용하여 더 이상 애플리케이션에 필요하지 않은 메모리를 자동으로 정리합니다. GC는 프로그램 코드를 실행하는 것을 중지하고 작업이 완료되면 정상 실행을 재개합니다.

자동 관리가 편리하지만 불필요하거나 빈번한 할당은 성능 문제를 일으킬 수 있습니다. 가비지 수집기가 사용하지 않는 메모리를 정리하기 위해 게임을 일시 중지해야 하기 때문입니다(이를 GC 스파이크라고도 함). 다음은 염두에 두어야 할 몇 가지 일반적인 함정입니다:

문자열: C#에서 문자열은 참조 형식이며 값 형식이 아닙니다. 즉, 새로운 문자열은 관리 힙에 할당되며, 일시적으로만 사용되더라도 마찬가지입니다. 불필요한 문자열 생성 또는 조작을 줄이십시오. JSON 및 XML과 같은 문자열 기반 데이터 파일을 구문 분석하는 것을 피하고, ScriptableObjects 또는 MessagePack 또는 Protobuf와 같은 형식에 데이터를 저장하십시오. 런타임에 문자열을 빌드해야 하는 경우 StringBuilder 클래스를 사용하십시오.

Unity 함수 호출: 일부 Unity API 함수는 힙 할당을 생성하며, 특히 임시 관리 객체의 배열을 반환하는 함수가 그렇습니다. 루프 중간에 배열을 할당하는 대신 배열에 대한 참조를 캐시하십시오. 또한 가비지를 생성하지 않는 특정 함수를 활용하십시오. 예를 들어, GameObject.CompareTag를 사용하여 GameObject.tag 와 문자열을 수동으로 비교하는 대신 사용하세요(새 문자열을 반환하면 가비지가 생성됩니다).

프로젝트 감사자를 사용하여 이러한 대안을 나열할 수도 있습니다. 이는 가능한 한 비할당 버전을 사용하고 있는지 확인하는 데 도움이 될 수 있습니다.

박싱: 박싱은 값 형식(예: int, float, struct)이 참조 형식(예: object)으로 변환될 때 발생합니다. 값 형식 변수를 참조 형식 변수 대신 전달하는 것을 피하세요. 이것은 임시 객체를 생성하며, 그에 따른 잠재적인 가비지는 값 형식을 타입 객체(예: int i = 123; object o = i)로 암묵적으로 변환합니다. 대신, 전달하려는 값 형식으로 구체적인 오버라이드를 제공하도록 하세요. 제네릭은 이러한 오버라이드에도 사용할 수 있습니다.

코루틴: yield는 가비지를 생성하지 않지만, 새로운 WaitForSeconds 객체를 생성하는 것은 가비지를 생성합니다. yield 라인에서 생성하는 대신 WaitForSeconds 객체를 캐시하고 재사용하세요.

LINQ 및 정규 표현식: 이 두 가지 모두 뒤에서 박싱으로 인해 가비지를 생성합니다. 성능 문제가 있다면 LINQ 및 정규 표현식을 피하세요. for 루프를 작성하고 새로운 배열을 생성하는 대신 리스트를 사용하세요.

제네릭 컬렉션 및 기타 관리되는 유형: 업데이트의 매 프레임마다 리스트나 컬렉션을 선언하고 채우지 마세요(예: 플레이어의 특정 반경 내 적 목록). 대신, 리스트를 MonoBehaviour의 멤버로 만들고 Start에서 초기화하세요. 사용하기 전에 매 프레임마다 Clear로 컬렉션을 비우세요.

가능한 한 시간 가비지 수집

특정 게임 지점에 가비지 수집 중단이 영향을 미치지 않을 것이라고 확신하는 경우, System.GC.Collect를 사용하여 가비지 수집을 트리거할 수 있습니다. 이것의 고전적인 예는 사용자가 메뉴에 있거나 게임을 일시 정지할 때로, 이때는 눈에 띄지 않습니다.

이점을 활용하는 방법에 대한 예는 자동 메모리 관리 이해하기를 참조하세요.

증분 가비지 수집기를 사용하여 GC 작업 부하를 분할하세요

프로그램 실행 중에 단일 긴 중단을 만드는 대신, 증분 가비지 수집은 여러 개의 짧은 중단을 사용하여 작업 부하를 여러 프레임에 분산시킵니다. 가비지 수집이 불규칙한 프레임 속도를 유발하는 경우, 이 옵션을 시도하여 GC 스파이크 문제를 줄일 수 있는지 확인하세요. 프로파일 분석기를 사용하여 애플리케이션에 대한 이점을 확인하세요.

증분 모드에서 GC를 사용하면 일부 C# 호출에 읽기-쓰기 장벽이 추가되며, 이는 스크립팅 호출 오버헤드로 프레임당 약 1ms의 오버헤드를 추가할 수 있습니다. 최적의 성능을 위해, 메인 게임 플레이 루프에서 GC 할당이 없도록 하는 것이 이상적이며, 이를 통해 부드러운 프레임 속도를 위해 증분 GC가 필요하지 않게 하고, 사용자가 눈치채지 못하는 메뉴 열기나 새로운 레벨 로딩 시 GC.Collect를 숨길 수 있습니다. 이러한 최적화된 시나리오에서는 전체 비증분 가비지 수집을 수행할 수 있습니다(예: System.GC.Collect()).

메모리 프로파일러에 대해 더 알아보려면 다음 리소스를 확인하세요:

메모리 프로파일러 워크스루 및 튜토리얼

메모리 프로파일러 문서

Unity의 메모리 프로파일러로 메모리 사용량 개선하기

메모리 프로파일러: 메모리 관련 문제 해결 도구

메모리 프로파일러 사용하기

콜아웃 크롭
Unity 6에 대한 추가 팁

Unity 베스트 프랙티스 허브에서 고급 Unity 개발자 및 제작자를 위한 더 많은 베스트 프랙티스와 팁을 찾을 수 있습니다. 산업 전문가, Unity 엔지니어 및 기술 아티스트가 만든 30개 이상의 가이드 중에서 선택하여 Unity의 도구 세트와 시스템을 효율적으로 개발하는 데 도움을 받을 수 있습니다.