무엇을 찾고 계신가요?
Hero background image
Unity의 메모리 프로파일링

다양한 플랫폼과 장치에서 게임 성능을 프로파일링하고 연마하면 플레이어 기반을 확장하고 성공 확률을 높일 수 있습니다.

이 페이지에서는 Unity에서 애플리케이션의 메모리 사용량을 분석하기 위한 두 가지 툴인 빌트인 메모리 프로파일러 모듈과 프로젝트에 추가할 수 있는 Unity 패키지인 메모리 프로파일러 패키지에 대한 정보를 제공합니다.

여기에 있는 정보는 무료로 다운로드할 수 있는 전자책 Ultimate guide to profiling Unity games에서 발췌한 것입니다. 이 전자책은 게임 개발, 프로파일링, 최적화 분야의 유니티 외부 및 내부 전문가들이 함께 제작했습니다.

Unity의 메모리 프로파일링에 대해 알아보려면 계속 읽어보세요.

메모리 프로파일링

메모리 프로파일링은 하드웨어 플랫폼 메모리 제한을 테스트하고, 로딩 시간과 크래시를 줄이고, 프로젝트가 구형 디바이스와 호환되도록 하는 데 유용합니다. 실제로 메모리 사용량을 증가시키는 변경을 수행하여 CPU/GPU 성능을 개선하려는 경우에도 관련이 있을 수 있습니다. 런타임 성능과는 크게 관련이 없습니다.

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

메모리 프로파일러 모듈은 다음과 같습니다. 이 모듈은 애플리케이션이 메모리를 사용하는 위치에 대한 기본 정보를 제공하는 기본 제공 프로파일러 모듈입니다.

메모리 프로파일러 패키지 프로젝트에 추가할 수 있는 Unity 패키지입니다. Unity 에디터에 메모리 프로파일러 창이 추가되어 애플리케이션의 메모리 사용량을 더욱 자세히 분석할 수 있습니다. 스냅샷을 저장 및 비교하여 메모리 누수를 찾거나 메모리 레이아웃을 확인하여 메모리 단편화 문제를 찾을 수 있습니다.

이러한 기본 제공 도구를 사용하여 메모리 사용량을 모니터링하고, 메모리 사용량이 예상보다 높은 애플리케이션 영역을 찾고, 메모리 조각화를 찾아 개선할 수 있습니다.

메모리 할당량 이해 및 정의
하드웨어 리소스는 스냅샷이 캡처한 기기 RAM 및 VRAM 수치를 보여줍니다.
메모리 할당량 이해 및 정의

대상 장치의 메모리 제한에 대한 이해와 예산 책정은 다중 플랫폼 개발에 매우 중요합니다. 씬과 레벨을 디자인할 때는 각 타깃 디바이스에 설정된 메모리 예산을 고수하세요. 제한과 지침을 설정하면 응용 프로그램이 각 플랫폼의 하드웨어 사양 범위 내에서 잘 작동하도록 할 수 있습니다.

장치 메모리 사양은 개발자 문서에서 확인할 수 있습니다. 예를 들어 설명서에 따르면 Xbox One 본체는 포그라운드에서 실행되는 게임에 사용할 수 있는 최대 메모리가 5GB로 제한됩니다.

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

물리적 RAM 제한 결정

각 대상 플랫폼에는 메모리 제한이 있으며, 이를 알고 나면 애플리케이션에 대한 메모리 예산을 설정할 수 있습니다. 메모리 프로파일러를 사용하여 캡처 스냅샷을 확인합니다. 하드웨어 리소스(위 이미지 참조)는 물리적 RAM(Random Access Memory) 및 VRAM(Video Random Access Memory) 크기를 보여줍니다. 이 수치는 해당 공간을 모두 사용할 수 없다는 사실을 고려하지 않습니다. 그러나 작업을 시작하기에 유용한 야구장 그림을 제공합니다.

여기에 표시된 그림이 항상 전체 그림을 보여주는 것은 아니므로 대상 플랫폼에 대한 하드웨어 사양을 상호 참조하는 것이 좋습니다. 개발자 키트 하드웨어에 메모리가 더 많거나 통합 메모리 아키텍처가 있는 하드웨어로 작업하는 경우가 있습니다.

가장 낮은 RAM 사양 결정

지원하는 각 플랫폼에 대해 RAM 측면에서 사양이 가장 낮은 하드웨어를 식별하고 이를 사용하여 메모리 예산을 결정합니다. 실제 메모리 중 일부를 사용할 수 있는 것은 아닙니다. 예를 들어 콘솔에는 총 메모리의 일부를 사용할 수 있는 이전 게임을 지원하기 위해 하이퍼바이저가 실행될 수 있습니다. 사용할 백분율(예: 전체의 80%)을 생각해 보세요. 모바일 플랫폼의 경우 고급 장치를 사용하는 사람들을 위해 더 나은 품질과 기능을 지원하기 위해 여러 계층의 사양으로 분할하는 것을 고려할 수도 있습니다.

대규모 팀을 위한 팀당 예산 고려

메모리 예산을 정의한 후에는 팀당 메모리 예산을 설정하는 것이 좋습니다. 예를 들어 배경 아티스트는 로드된 각 레벨 또는 씬에 사용할 일정량의 메모리를 얻고, 오디오 팀은 음악 및 음향 효과에 대한 메모리 할당을 받습니다.

프로젝트가 진행됨에 따라 예산을 유연하게 조정하는 것이 중요합니다. 한 팀이 예산에 미달할 경우, 개발 중인 게임 영역을 개선할 수 있는 경우 잉여분을 다른 팀에 할당하십시오.

타깃 플랫폼에 대한 메모리 예산을 결정하고 설정했다면, 다음 단계는 프로파일링 툴을 사용하여 게임의 메모리 사용량을 모니터링하고 추적하는 것입니다.

메모리 프로파일러 모듈이 포함된 두 개의 뷰
메모리 프로파일러 모듈을 사용하여 에셋과 씬 오브젝트 메모리 할당 관련 정보를 신속하게 수집할 수 있습니다.
메모리 프로파일러 모듈이 포함된 두 개의 뷰

메모리 프로파일러 모듈은 두 가지 뷰를 제공합니다. 간단하고 상세합니다. 단순 보기를 사용하여 응용 프로그램의 메모리 사용량에 대한 개략적인 보기를 가져올 수 있습니다. 필요한 경우 자세히 보기로 전환하여 더 드릴다운합니다.

간단한

Total Reserved Memory 수치는 "Total Tracked by Unity Memory"입니다. 여기에는 Unity가 예약했지만 현재 사용하지 않는 메모리가 포함됩니다(이 수치는 Total Used Memory).

시스템 사용 메모리 수치는 OS가 애플리케이션에서 사용 중인 것으로 간주하는 수치입니다. 이 Figure에 0이 표시되면 프로파일링 중인 플랫폼에서 프로파일러 카운터가 구현되지 않았음을 나타냅니다. 이 경우 신뢰할 수 있는 가장 좋은 지표는 총 예약 메모리입니다. 또한 이러한 경우 자세한 메모리 정보를 위해 네이티브 플랫폼 프로파일링 도구로 전환하는 것이 좋습니다.

메모리 프로파일러의 상세 보기
캡처된 샘플을 사용하여 실행 파일 및 DLL 메모리 사용량과 같은 자세한 정보를 검사합니다.
메모리 프로파일러의 상세 보기

실행 파일, DLL 및 Mono Virtual Machine에서 사용하는 메모리 양을 조사하기 위해 프레임별 메모리 수치로는 줄일 수 없습니다. 자세한 스냅샷 캡처를 사용하여 이러한 종류의 메모리 고장을 파헤칩니다.

참고: 메모리 프로파일러 모듈의 세부정보 뷰에 있는 참조 트리에는 네이티브 참조만 표시됩니다. UnityEngine.Object에서 상속되는 타입의 오브젝트에 대한 레퍼런스는 관리되는 셸의 이름과 함께 표시될 수 있습니다. 그러나 아래에 네이티브 개체가 있기 때문에 표시될 수 있습니다. 관리되는 형식이 반드시 표시되는 것은 아닙니다. 필드 중 하나인 Texture2Din을 참조로 사용하는 개체를 예로 들어 보겠습니다. 이 보기를 사용하면 해당 참조가 있는 필드도 볼 수 없습니다. 이러한 세부 사항의 경우 메모리 프로파일러 패키지를 사용합니다.

메모리 사용량이 플랫폼 예산에 근접하기 시작하는 시점을 개략적으로 확인하려면 다음 "냅킨 뒷면" 계산을 사용합니다.

사용된 시스템 메모리(또는 사용된 시스템이 0으로 표시되는 경우 예약된 총 메모리) + 추적되지 않은 메모리의 야구장 버퍼 / 플랫폼 총 메모리

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

메모리 프로파일러 모듈의 많은 기능이 메모리 프로파일러 패키지로 대체되었지만, 여전히 이 모듈을 사용하여 메모리 분석 작업을 보완할 수 있습니다.

예제:

  • GC 할당을 확인하려면: 모듈에 표시되지만 Project Auditor 또는 Deep Profiling을 사용하여 더 쉽게 추적할 수 있습니다.
  • 힙의 Used/Reserved 크기를 빠르게 확인하려면
  • 셰이더 메모리 분석

메모리 예산을 설정할 때 전체 대상 플랫폼에 대해 사양이 가장 낮은 장치에서 프로파일링하는 것을 잊지 마십시오. 메모리 사용량을 면밀히 모니터링하여 목표 제한을 염두에 둡니다.

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

메모리 프로파일링은 CPU 및 GPU 프로파일링과 비교할 때 추가 메모리 오버헤드가 발생할 수 있다는 점에서 다릅니다. 메모리가 더 많은 고급 장치에서 메모리를 프로파일링해야 할 수 있지만 특히 저사양 대상 사양에 대한 메모리 예산 제한에 주의해야 합니다.

메모리 사용량을 프로파일링할 때 고려해야 할 사항은 다음과 같습니다.

  • 품질 수준, 그래픽 티어, 에셋 번들 변형과 같은 설정은 더 강력한 기기에서 메모리 사용량이 다를 수 있습니다. 예제:
  • 퀄리티 레벨(Quality Level) 및 그래픽스(Graphics) 세팅은 섀도우 맵에 사용되는 렌더 텍스처(RenderTextures)의 크기에 영향을 줄 수 있습니다.
  • 해상도 스케일링은 화면 버퍼, RenderTextures 및 포스트 프로세싱 효과의 크기에 영향을 줄 수 있습니다.
  • 텍스처 품질 설정은 모든 텍스처의 크기에 영향을 줄 수 있습니다.
  • 최대 LOD는 모델 등에 영향을 미칠 수 있습니다.
  • HD(High Definition) 및 SD(Standard Definition) 버전과 같은 에셋 번들 배리언트가 있고 디바이스 사양에 따라 사용할 버전을 선택하는 경우, 프로파일링하는 디바이스에 따라 에셋 크기가 달라질 수도 있습니다.
  • 타깃 디바이스의 화면 해상도는 포스트 프로세싱 이펙트에 사용되는 RenderTextures의 크기에 영향을 미칩니다.
  • 기기에서 지원되는 그래픽스 API는 API에서 지원되는지 여부에 따라 셰이더의 크기에 영향을 줄 수 있습니다.
  • 다양한 퀄리티 세팅(Quality Settings), 그래픽 티어(Graphic Tier) 세팅, 에셋 번들(Asset Bundle) 베리에이션을 사용하는 티어링된 시스템을 사용하면 4GB 모바일 디바이스에 고해상도 버전의 에셋 번들을 로드하고 2GB 디바이스에 표준 화질 버전을 로드하는 등 더 넓은 범위의 디바이스를 타겟팅할 수 있습니다. 그러나 위의 메모리 사용량 변화를 염두에 두고 두 가지 유형의 기기뿐만 아니라 화면 해상도 또는 지원되는 그래픽 API가 다른 기기를 테스트해야 합니다.

참고: Unity 에디터는 일반적으로 에디터와 프로파일러에서 로드되는 추가 오브젝트로 인해 항상 더 큰 메모리 공간을 표시합니다. 어드레서블 시뮬레이션 모드에 따라 에셋 번들(Asset Bundles) 또는 스프라이트(Sprites) 및 아틀라스(Atlases) 또는 인스펙터에 표시된 에셋(Asset)과 같이 빌드에서 메모리에 로드되지 않는 에셋 메모리(Asset Memory)가 표시될 수도 있습니다. 일부 레퍼런스 체인은 에디터에서 더 혼란스러울 수도 있습니다.

메모리 프로파일러 패키지
메모리 프로파일러 메인 창 뷰
메모리 프로파일러 패키지

메모리 프로파일러는 현재 Unity 2019 LTS 이상에 대한 프리뷰 버전이지만 Unity 2022 LTS에서 검증될 예정입니다.

메모리 프로파일러 패키지의 가장 큰 이점 중 하나는 메모리 프로파일러 모듈과 같은 네이티브 오브젝트를 캡처할 수 있을 뿐만 아니라 관리되는 메모리를 보고, 스냅샷을 저장 및 비교하고, 메모리 사용량을 시각적으로 분석하여 메모리 콘텐츠를 훨씬 더 자세히 탐색할 수 있다는 것입니다.

스냅샷은 엔진의 메모리 할당을 보여주므로 과도하거나 불필요한 메모리 사용의 원인을 빠르게 식별하고, 메모리 누수를 추적하고, 힙 조각화를 확인할 수 있습니다.

메모리 프로파일러 패키지를 설치한 후 Window > Analysis > Memory Profiler를 클릭하여 엽니다.

메모리 프로파일러의 상단 메뉴 바에서는 플레이어 선택 타겟을 변경하고 스냅샷을 캡처하거나 임포트할 수 있습니다.

참고: Target selection 드롭다운을 사용하여 메모리 프로파일러를 원격 기기에 연결하여 타깃 하드웨어의 메모리를 프로파일링합니다. Unity 에디터에서 프로파일링하면 에디터 및 기타 툴에 의해 추가된 오버헤드로 인해 부정확한 수치를 얻을 수 있습니다.

단일 및 비교 스냅샷 보기
워크벤치 창은 메모리 스냅샷을 관리하는 데 사용됩니다.
단일 및 비교 스냅샷 보기

메모리 프로파일러 창의 왼쪽에는 Workbench 영역이 있습니다. 이 옵션을 사용하여 저장된 메모리 스냅샷을 관리하고 열거나 닫을 수 있습니다. 이 영역을 사용하여 단일 스냅샷 보기와 비교 스냅샷 보기 간에 전환할 수도 있습니다.

Profile Analyzer와 마찬가지로 메모리 프로파일러를 사용하면 두 개의 데이터 세트(메모리 스냅샷)를 로드하여 비교할 수 있습니다. 이는 시간이 지남에 따라 또는 장면 간에 메모리 사용량이 어떻게 증가했는지 확인하고 메모리 누수를 검색할 때 특히 유용합니다.

메모리 프로파일러의 기본 창에는 Summary, Objects and Allocations, Fragmentation 등 메모리 스냅샷을 자세히 살펴볼 수 있는 여러 탭이 있습니다. 이러한 각 옵션을 자세히 살펴보겠습니다.

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

프로젝트의 메모리 사용량에 대한 빠른 개요를 보려면 이 보기를 선택합니다. 또한 해당 캡처된 메모리 스냅샷에 대한 유용하고 중요한 메모리 관련 수치도 포함되어 있습니다. 스냅샷이 찍힌 시점에 무슨 일이 일어나고 있는지 한 눈에 볼 수 있는 완벽한 방법입니다.

그래픽 트리 맵
요약 뷰는 스냅샷이 캡처한 시간 동안의 메모리 사용량 트리 맵도 표시합니다.
그래픽 트리 맵

트리 맵 보기에는 개체가 사용하는 메모리의 분석이 그래픽 트리 맵 으로 표시되며, 드릴다운하여 가장 많은 메모리를 사용하는 개체 유형을 검색할 수 있습니다.

트리 맵: 필터링된 테이블
트리 맵: 필터링된 테이블

트리 맵 뷰 아래에는 선택한 그리드 셀의 객체 목록을 표시하도록 업데이트되는 필터링된 테이블이 있습니다.

트리 맵은 개체에 귀속된 메모리(네이티브 또는 관리)를 표시합니다. 관리되는 개체 메모리는 기본 개체 메모리에 의해 왜소해지는 경향이 있어 맵 뷰에서 찾기가 더 어렵습니다. 트리 맵을 확대하여 볼 수 있지만 더 작은 개체를 검사하려면 일반적으로 테이블이 더 나은 개요를 제공합니다. 트리 맵에서 셀을 클릭하면 그 아래에 있는 테이블이 섹션 유형으로 필터링되거나 테이블에서 관심 있는 특정 개체가 선택됩니다.

이 목록에서 개체를 참조하는 항목과 이러한 참조가 있는 관리되는 클래스 필드를 추적하려면 테이블 행 또는 트리 맵 그리드 셀을 선택한 다음 세부 정보 측면 패널에서 참조 섹션을 선택하여 추적할 수 있습니다. 측면이 숨겨져 있는 경우 도구 모음의 창 오른쪽 상단에 있는 토글 버튼을 통해 표시되도록 할 수 있습니다.

참고: 트리 맵은 메모리에 개체만 표시합니다. 추적된 메모리의 전체 표현은 아닙니다. 메모리 사용량 개요 수치가 추적된 메모리 합계와 동일하지 않은 경우 이를 이해하는 것이 중요합니다.

이는 모든 네이티브 메모리가 Objects에 연결되어 있지 않기 때문입니다. 또한 실행 파일 및 DLL, NativeArray 등과 같이 오브젝트와 연결되지 않은 네이티브 할당으로 구성될 수도 있습니다. "예약되었지만 사용되지 않은 메모리 공간"과 같은 훨씬 더 추상적인 개념이 네이티브 할당 합계에 포함될 수 있습니다.

오브젝트 및 할당
오브젝트 및 할당 테이블은 여러 수준에서 필터링할 수 있으므로 캡처된 스냅샷 메모리 사용량을 아주 세부적으로 분석할 수 있습니다.
오브젝트 및 할당

Objects and Allocations(개체 및 할당) 뷰에는 All Objects(모든 개체), All Native Objects(모든 기본 개체), All Managed Objects(모든 관리 개체), All Native Allocations(모든 기본 할당 등)와 같은 미리 만들어진 선택 항목을 기반으로 필터링하도록 전환할 수 있는 테이블이 표시됩니다.

아래쪽 테이블을 전환하여 선택한 범위의 개체, 할당 또는 메모리 영역을 표시할 수 있습니다. 트리 맵 뷰에서 언급했듯이 모든 메모리가 오브젝트와 연결되어 있는 것은 아니므로 모든 메모리 리전 및 모든 네이티브 할당 페이지에서 메모리 사용량에 대한 보다 완전한 그림을 제공할 수 있으며, 메모리 리전에는 예약되었지만 현재 사용되지 않은 메모리도 포함됩니다.

메모리 사용을 최적화하고 메모리 예산이 제한된 하드웨어 플랫폼에 대해 메모리를 보다 효율적으로 압축하는 것을 목표로 할 때 이를 유리하게 사용하십시오.

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

메모리 프로파일러 스냅샷을 로드하고 트리 맵 뷰를 통해 메모리 공간 크기가 가장 큰 것부터 가장 작은 것 순으로 카테고리를 검사합니다.

프로젝트 자산은 메모리를 가장 많이 소비하는 경우가 많습니다. 테이블 뷰를 사용하여 텍스처 오브젝트, 메시, AudioClips, RenderTextures, 셰이더 및 사전 할당된 버퍼를 찾습니다. 이것들은 모두 메모리 최적화를 위한 좋은 후보입니다.

메모리 누수 찾기

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

  • 개체는 코드를 통해 메모리에서 수동으로 해제되지 않습니다
  • 의도하지 않은 참조로 인해 개체가 메모리에 남아 있습니다.

메모리 프로파일러 비교 모드는 특정 기간 동안 두 개의 스냅샷을 비교하여 메모리 누수를 찾는 데 도움이 될 수 있습니다.

Unity 게임의 일반적인 메모리 누수 시나리오는 씬을 언로드한 후에 발생할 수 있습니다.

메모리 프로파일러 패키지에는 Compare 모드를 사용하여 이러한 유형의 누수를 발견하는 과정을 안내하는 워크플로 가 있습니다.

응용 프로그램 수명 동안 반복되는 메모리 할당 찾기

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

다음 섹션에는 프로젝트에서 관리되는 힙 할당을 식별하는 데 도움이 되는 몇 가지 팁이 나와 있습니다.

메모리 할당 찾기
GC ALLOCATED IN FRAME에 스파이크가 표시되면 포인터는 관리형 할당을 파악할 수 있습니다.
메모리 할당 찾기

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

CPU 사용 프로파일러 모듈의 타임라인 보기
관리되는 할당은 타임라인 보기에서 분홍색 마커로 표시됩니다.
CPU 사용 프로파일러 모듈의 타임라인 보기

CPU 사용 프로파일러 모듈의 타임라인 뷰에는 관리되는 할당을 포함한 할당이 분홍색으로 표시되므로 쉽게 확인하고 다듬을 수 있습니다.

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

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

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

참고: 이전 버전의 Unity(할당 호출 스택 지원 이전)를 사용하는 경우 심층 프로파일링 은 관리되는 할당을 찾는 데 도움이 되는 전체 호출 스택을 가져오는 좋은 방법입니다.

GC입니다. Hierarchy 또는 Raw Hierarchy에서 선택한 Alloc 샘플에는 이제 호출 스택이 포함됩니다. GC의 호출 스택도 볼 수 있습니다. 타임라인의 선택 도구 설명에 있는 Alloc 샘플입니다.

CPU 사용 프로파일러의 계층 구조 뷰
CPU 사용 프로파일러 모듈에서 계층 구조 뷰를 사용하면 관리되는 할당을 필터링하고 집중할 수 있습니다.
CPU 사용 프로파일러의 계층 구조 뷰

CPU 사용 프로파일러의 계층 구조 뷰에서는 열 머리글을 클릭하여 정렬 조건으로 사용할 수 있습니다. GC Alloc으로 정렬하는 것은 이러한 항목에 집중할 수 있는 좋은 방법입니다.

프로젝트 감사자

Project Auditor 는 실험적인 정적 분석 도구입니다. 이 기능은 많은 유용한 작업을 수행하며, 그 중 일부는 이 가이드의 범위를 벗어나지만, 프로젝트를 실행하지 않고도 관리되는 할당을 유발하는 프로젝트의 모든 단일 코드 줄 목록을 생성할 수 있습니다. 이러한 종류의 문제를 찾고 조사하는 매우 효율적인 방법입니다.

메모리 및 GC 최적화

Unity는 Boehm-Demers-Weiser 가비지 컬렉터를 사용하며, 이 가비지 컬렉터는 프로그램 코드 실행을 중지하고 작업이 완료된 후에만 정상 실행을 재개합니다.

GC 급증을 일으킬 수 있는 불필요한 힙 할당에 유의해야 합니다.

  • 문자열: C#에서 문자열은 값 형식이 아니라 참조 형식입니다. 즉, 모든 새 문자열은 일시적으로만 사용되는 경우에도 관리되는 힙에 할당됩니다. 불필요한 문자열 생성 또는 조작을 줄입니다. JSON 및 XML과 같은 문자열 기반 데이터 파일을 파싱하지 말고, 대신 ScriptableObject나 MessagePack 또는 Protobuf 같은 형식으로 데이터를 저장하세요. 런타임에 문자열을 빌드해야 하는 경우 StringBuilder 클래스를 사용합니다.
  • Unity 함수 호출: 일부 Unity API 함수는 힙 할당, 특히 관리되는 오브젝트의 배열을 반환하는 힙 할당을 생성합니다. 배열에 대한 참조를 루프 중간에 할당하지 않고 캐시합니다. 또한 가비지 생성을 방지하는 특정 기능을 활용하십시오. 예를 들어 문자열을 GameObject.tag와 수동으로 비교하는 대신 GameObject.CompareTag를 사용합니다(새 문자열을 반환하면 가비지가 생성됨).
  • 권투: 참조 형식 변수 대신 값 형식 변수를 전달하지 마십시오. 이것은 임시 객체를 만들고, 함께 제공되는 잠재적 인 가비지는 암시 적으로 값 유형을 유형 객체 (예 : int i = 123; object o = i)로 변환합니다. 대신 전달하려는 값 형식으로 구체적인 재정의를 제공하십시오. 제네릭은 이러한 재정의에도 사용할 수 있습니다.
  • 코루틴: yield는 가비지를 생성하지 않지만 새 WaitForSeconds 객체를 생성하면 가비지가 생성됩니다. WaitForSeconds 개체를 yield 줄에 만들거나 yield return null을 사용하는 대신 캐시하고 다시 사용합니다.
  • LINQ 및 정규식: 이 두 가지 모두 무대 뒤에서 복싱을 통해 쓰레기를 생성합니다. 성능이 문제가 되는 경우 LINQ 및 정규식을 사용하지 마십시오. for 루프를 작성하고 새 배열을 만드는 대신 목록을 사용합니다.
  • 제네릭 컬렉션 및 기타 관리되는 형식:Generic Collections and other managed types: Update의 모든 프레임에서 List 또는 컬렉션(예: 플레이어의 특정 반경 내에 있는 적 목록)을 선언하고 채우지 마십시오. 대신 List를 MonoBehaviour의 멤버로 만들고 Start에서 초기화합니다. 사용하기 전에 Clear every frame(모든 프레임 지우기)을 사용하여 컬렉션을 비우기만 하면 됩니다.

가능할 때마다 가비지 콜렉션 시간

가비지 수집 중지가 게임의 특정 지점에 영향을 주지 않는다고 확신하는 경우 System.GC.Collect를 사용하여 가비지 수집을 트리거할 수 있습니다.

이를 활용하는 방법의 예는 자동 메모리 관리 이해를 참조하십시오.

증분 가비지 수집기를 사용하여 GC 워크로드 분할Use the Incremental Garbage Collector to split the GC workload

증분 가비지 수집은 프로그램 실행 중에 하나의 긴 중단을 만드는 대신 여러 프레임에 걸쳐 작업 부하를 분산하는 여러 개의 짧은 중단을 사용합니다. 가비지 수집으로 인해 프레임 속도가 불규칙한 경우 이 옵션을 사용하여 GC 스파이크 문제를 줄일 수 있는지 확인합니다. Profile Analyzer를 사용하여 애플리케이션에 대한 이점을 확인하십시오.

증분 모드에서 GC를 사용하면 일부 C# 호출에 읽기-쓰기 장벽이 추가되며, 스크립팅 호출 오버헤드의 프레임당 최대 ~1ms를 추가할 수 있는 약간의 오버헤드가 발생합니다. 최적의 퍼포먼스를 위해서는 메인 게임플레이 루프에 GC 할당이 없어 부드러운 프레임 속도를 위해 증분 GC가 필요하지 않고 GC를 숨길 수 있도록 하는 것이 이상적입니다. 사용자가 알아차리지 못하는 위치(예: 메뉴를 열거나 새 레벨을 로드할 때)를 수집합니다.

메모리 프로파일러에 관한 자세한 내용은 다음 리소스를 확인하세요.

유니티 키 아트 21 07
더 자세한 정보가 필요하신가요?

Unity 게임 프로파일링을 위한 얼티밋 가이드전자책을 무료로 다운로드하여 모든 팁과 모범 사례를 확인하세요.

이 콘텐츠가 도움이 되었습니까?