Unity 타일맵을 통한 2D 게임 성능 최적화
이 팁은 Unity의 2D 툴셋을 사용해 본 경험이 있는 사용자에게 가장 적합합니다. Unity로 상용 2D 게임을 개발하는 전문 크리에이터를 위한 또 다른 훌륭한 리소스는 전자책입니다, 2D 게임 아트, 라이팅 및 애니메이션.
Unity로 2D 게임을 처음 개발하는 경우 신규 사용자를 위한 2D 가이드부터 시작하세요.
다음은 고려해야 할 몇 가지 일반적인 성능 팁입니다:
- 처음부터 자산(데이터)의 성능에 대해 생각하세요. 이러한 요소가 제대로 작동하지 않으면 나중에 코드를 최적화하기 위해 할 수 있는 일이 거의 없습니다.
- 사용 가능한 가장 낮은 사양의 대상 디바이스에서 프로필을 설정합니다. iOS 기기용 Xcode와 같은 플랫폼별 프로파일링 툴과 함께 프로젝트 개발 전반에 걸쳐 Unity 프로파일러를 사용하세요.
- 가장 낮은 사양의 대상 디바이스에서 사용 가능한 RAM의 3분의 1 이상을 사용하지 마세요. 이렇게 하면 다양한 모바일 기기에서 콘텐츠가 원활하게 실행됩니다(저렴한 Android 휴대폰은 모바일 시장에서 가장 인기 있는 기기입니다).
더 많은 2D 최적화 팁은 다음 리소스를 참조하세요:
타일맵 컴포넌트를 사용하면 그리드 오버레이의 타일을 사용하여 2D 레벨을 효율적으로 제작할 수 있습니다. 다음과 같은 여러 요소로 구성됩니다:
스프라이트와 게임 오브젝트의 조합을 사용하여 2D 레벨을 만들고, 소팅 레이어, 타일맵 콜라이더, 애니메이션 타일 등의 프로퍼티를 제어할 수 있습니다. 정사각형, 육각형 및 아이소메트릭 스프라이트를 칠할 수도 있습니다.
타일맵 게임 오브젝트에 적용하면 타일맵 콜라이더 2D 컴포넌트가 타일의 콜라이더 유형 설정에 따라 타일 주위에 콜라이더를 자동 생성하도록 타일맵으로 레벨을 칠합니다.
스프라이트로 빌드한 씬과 비교하여 타일맵을 사용하면 얻을 수 있는 성능 향상 효과를 살펴보겠습니다.
타일맵을 사용하면 로드 시간은 물론 메모리와 CPU 사용량도 줄어듭니다.
2D 게임과 앱을 개발해 본 적이 있다면 게임에 많은 수의 스프라이트가 별도의 게임 오브젝트로 존재할 수 있다는 것을 알고 있을 것입니다. 각 스프라이트 게임 오브젝트에는 트랜스폼과 렌더러를 비롯한 컴포넌트가 있으며, 모두 메모리를 차지합니다. 콜라이더와 같은 다른 컴포넌트에는 CPU 오버헤드가 발생합니다.
이에 비해 타일맵은 전체 맵과 모든 타일에 하나의 렌더러를 사용합니다. 이렇게 하면 메모리 전체에 여러 데이터 구조를 사용하는 것에 비해 자체 데이터 구조만 처리하므로 오버헤드가 줄어듭니다.
게임 오브젝트가 적으면 계층 구조가 더 깔끔해지므로 필요한 항목을 찾기 위해 복잡한 목록을 스크롤할 필요가 없습니다.
Unity 타일맵은 씬 크기를 줄입니다. 게임 오브젝트와 컴포넌트의 수가 적다는 것은 런타임에 디스크에서 로드하고 역직렬화하여 메모리에 보관해야 하는 오브젝트의 수가 줄어든다는 뜻입니다.
Unity에서 씬 로딩은 두 가지 과정으로 이루어집니다: 먼저 디스크에서 데이터를 읽습니다. 특히 Android 기기에서 게임에서 가장 많은 시간이 소요되는 프로세스입니다. 그런 다음 데이터가 역직렬화됩니다. 역직렬화는 데이터를 한 형식에서 다른 형식으로 변환하는 프로세스입니다. 기본적으로 저장된 상태의 데이터와 개체를 복원합니다. 유니티는 내부적으로 직렬화를 수행하여 에디터에서 씬 파일을 로드할 때마다, 그리고 런타임에 저장된 파일을 가져와서 Unity 오브젝트로 변환합니다.
위 이미지에서는 타일맵을 사용하는 두 개의 직렬화된 씬 파일과 스프라이트를 사용하여 다시 생성한 씬 파일을 비교한 것을 볼 수 있습니다. 이 게임 장면을 제공해준 Pixel Reign에게 감사드립니다. 로비 스위프핸드.
오른쪽은 4개의 타일로 구성된 직렬화된 타일맵의 섹션입니다. 사용되는 타일 유형을 포함한 모든 타일에 대한 규칙은 타일맵 상단에 설정되어 있습니다. 진행 중인 각 타일은 사용된 타일과 그 위치 등의 속성을 나타냅니다.
왼쪽에는 트랜스폼 및 스프라이트 렌더러 컴포넌트가 있는 하나의 스프라이트가 있습니다.
이 비교를 통해 스프라이트 직렬화가 얼마나 많은 작업을 해야 하는지 알 수 있습니다. 특히 스프라이트를 사용한 씬은 파일에 37만 개의 줄이 있는 반면 타일맵을 사용한 씬은 3만 개의 줄이 있습니다. 프로젝트와 리포지토리 크기가 작아지면 반복 작업 시간이 단축되고 워크플로우가 원활해집니다.
직접 만든 씬을 텍스트 파일로 보려면 에디터 설정으로 이동하여 에셋 직렬화 모드를 켜고 텍스트 강제 적용을 클릭한 다음 텍스트 에디터에서 .unity 씬 파일을 엽니다.
타일맵 콜라이더 2D와 컴포지트 콜라이더를 결합할 수 있습니다. 이렇게 하면 콜리더와 스프라이트의 수가 줄어들 뿐만 아니라 변경할 때마다 복잡한 콜리전 모양을 다시 빌드할 필요가 없으므로 제작 효율성이 높아집니다. 컴포지트 콜라이더가 이를 처리합니다.
앞서 언급했듯이 각 스프라이트에는 스프라이트 렌더러 컴포넌트가 있으며, 렌더러가 많으면 컬링 준비 및 렌더링을 위한 정리 시간을 포함하여 CPU에서 더 많은 작업이 필요합니다. 타일맵을 사용하면 렌더러 컴포넌트 수가 줄어들어 CPU의 작업량을 줄일 수 있습니다.
씬에 카메라가 두 대 이상이면 렌더러가 더 많아집니다. 이렇게 하면 도태 비용이 증가합니다.
카메라 보기에서는 렌더러별, 카메라별 컬링 비용이 있습니다. 모든 카메라는 씬의 모든 렌더러 컴포넌트에 대해 컬링 검사를 수행해야 하므로 게임에 멀티 카메라를 설정한 경우 타일맵을 사용하면 해당 비용을 절감할 수 있습니다.
일괄 처리는 다른 SetPass 호출을 수행하지 않고 그릴 수 있는 모든 지오메트리를 수집하는 것입니다. 타일맵 렌더러는 스프라이트의 위치에 따라 지오메트리를 일괄 처리합니다. 그 결과 타일맵 렌더러는 더 적은 지오메트리를 가진 더 적은 수의 메시를 렌더 파이프라인으로 전송하는 반면, 스프라이트 렌더러는 더 적은 지오메트리를 가진 더 많은 메시를 렌더 파이프라인으로 전송합니다. 다음 섹션의 표에서 볼 수 있듯이 타일맵 기반 씬은 배치 수가 훨씬 적습니다.
게임 보기의 통계 패널에서 일괄 처리를 확인할 수 있습니다. 프레임 디버거를 사용하여 항목이 일괄 처리되지 않는 이유를 확인할 수도 있습니다.
60fps에 도달하려면 각 프레임을 렌더링하는 데 최대 16ms가 소요될 수 있습니다. 구형 iPhone 7에서 샘플 장면을 프로파일링한 결과, Sprite 기반 버전은 프레임당 244ms인 반면 타일맵 버전은 프레임당 13ms였습니다.
마지막으로, 스프라이트 기반 씬의 경우 RAM 사용량은 1.1GB로 저사양 안드로이드 휴대폰에서는 너무 많은 양이었습니다. 타일맵 기반 씬은 21MB의 RAM만 사용하므로 더 다양한 모바일 기기에서 실행하기에 적합합니다.
위의 비교는 두 장면의 성능 차이를 명확하게 보여줍니다.
스프라이트 아틀라스는 스프라이트를 텍스처로 패킹하여 메모리 사용량과 드로우 호출을 최적화할 수 있는 에디터 툴입니다. 타일맵에 사용된 모든 스프라이트가 포함된 스프라이트 아틀라스 에셋을 생성하면 타일맵 렌더러에서 단 한 번의 드로우 호출로 일괄 처리할 수 있습니다(모든 스프라이트가 단일 텍스처에 맞는다면).
2D 기술 향상 유니티의 블로그 읽기 목록은 2D 게임 개발에 유용한 팁을 제공합니다.
아티스트를 위한 2D 게임, 애니메이션 및 조명 이 무료 전자책은 Unity의 2D 툴세트를 최대한 활용하기 위한 베스트 프랙티스를 제공합니다.
2D 도구 개요: 2D 개발자를 위한 유니티의 편리한 기능 개요를 확인해 보세요.
타일맵을 사용한 프로시저럴 패턴 - 1부 및 2부: 절차적 생성으로 게임에 다양성을 더하세요. 이 게시물에서는 타일맵 및 RuleTile과 함께 사용할 수 있는 몇 가지 알고리즘에 대해 설명합니다.