Unity 검색

카메라를 활용한 게임 성능 최적화: 파트 1

2021년 9월 23일 게임 | 8 분 소요
Accelerate Success Logo
Accelerate Success Logo
다루는 주제
공유

Is this article helpful for you?

Thank you for your feedback!

유니티는 크리에이터가 많아질수록 세상은 더 매력적인 곳이 될 거라 믿습니다. 이번 새로운 콘텐츠 시리즈인 Accelerate Success에서는 Accelerate Solutions Games 팀의 경험을 공유합니다.  이 팀은 고객 컨설팅, 공동 개발 또는 전체 개발을 담당하는 유니티의 프로페셔널 서비스 그룹으로, Unity를 다양한 사용 사례에 적용하고자 하는 고객을 위해 가장 복잡하고 까다로운 Unity 작업을 담당합니다.

이번 시리즈는 기술 중심의 전자책과 웨비나로 구성되며, Unity를 발전시키는 데 도움을 주신 게임 커뮤니티에 보답하고자 마련되었습니다. Accelerate Success 시리즈에서는 실용적이면서도 방법론적인 팁과 전 세계 주요 스튜디오와의 협력 경험으로부터 수집한 베스트 프랙티스를 선보일 예정입니다. Accelerate Success 시리즈의 각 콘텐츠는 Accelerate Solutions 팀의 소프트웨어 개발 컨설턴트들이 선별하고 작성했으며, 실제 시나리오와 연구 결과에 바탕을 두고 있습니다. 

이번 블로그 포스팅 시리즈는 Accelerate Solutions - Games 팀의 리드 중 한 명인 Bertrand Guay-Paquet가 작성했습니다. Bertrand는 유니티 스톡홀름 지사에서 근무하고 있으며, 이번 포스팅에서 소개하는 연구 결과는 Bertrand가 팀원들과 수행한 프로젝트 리뷰(Project Reviews)에서 비롯되었습니다. 

프로젝트 리뷰란?

Accelerate Solutions Games 팀에 속한 유니티 소프트웨어 개발 컨설턴트의 주요 업무 중 하나가 바로 프로젝트 리뷰입니다. 프로젝트 리뷰는 Integrated Success 플랜을 구독한 유니티 고객에게 매년 제공하는 서비스입니다. 이 작업을 진행하는 동안 유니티 담당자가 현장에서(최근에는 Zoom을 통해) 이틀에 걸쳐 고객의 프로젝트를 심도 있게 검토합니다. 프로젝트 리뷰 시, 소프트웨어 개발 컨설턴트는 프로젝트나 워크플로를 심층적으로 들여다보고 종합 보고서를 제공하여 성능 최적화를 통해 속도, 안정성, 효율성을 향상할 수 있는 분야를 파악합니다. 

프로젝트 리뷰를 진행하다 보면, 불필요한 카메라가 추가된 최적화되지 않은 카메라 설정을 종종 마주할 때가 있습니다. 보통 이러한 설정은 조사 대상으로 즉시 지정되며, 카메라를 결합하고 불필요한 카메라를 없애 성능을 향상하도록 권장합니다.

Profiler capture with multiple Cameras - A red flag!
여러 대의 카메라가 있는 프로파일러 캡처 - 개선 대상 지정

수년 간 유니티는 실제 게임에서 추가 카메라로 인해 성능이 저하되는 현상을 다수 목격했습니다. 하지만 지금까지는 씬 내의 다양한 카메라 설정에 대한 기준이 마련되어 있지 않았습니다. 이 전자책에서는 모바일 하드웨어에서 카메라 성능을 벤치마킹하여 상황을 더 정확하게 파악하는 방법에 관해 논의하며, Unity의 빌트인 렌더 파이프라인과 유니버설 렌더 파이프라인을 모두 테스트했습니다.

카메라를 활용한 게임 성능 개선: 파트 1

카메라의 기능

카메라는 기본적으로 씬에서 시야각, 위치, 그리고 방향을 정의합니다. 이러한 파라미터는 카메라가 비추는 콘텐츠(렌더러)를 결정합니다. 카메라의 렌더링된 이미지는 디스플레이 또는 RenderTexture로 출력됩니다. 두 경우 모두 카메라의 뷰포트 사각형이 출력되는 영역을 정의합니다.

간략히 말하자면, Unity 엔진 코드의 프레임마다 각 활성 카메라가 다음을 수행해야 합니다.

  • 화면에서 보이는 렌더러를 결정하며, 이것을 컬링이라고 합니다. 컬링은 카메라의 렌더링된 이미지에 기여하는 렌더러만 GPU에 드로우되도록 합니다. 다시 말해, 성능 향상을 위해 최대한 많은 렌더러의 드로우를 방지하는 것이 목표입니다. 여기에는 세 가지 프로세스가 사용됩니다.
    • 카메라의 컬링 마스크와 일치하지 않는 레이어의 렌더러는 제외됩니다.
    • 절두체 컬링은 카메라의 절두체(관측 공간) 외부에 있는 렌더러를 제외합니다.
    • 오클루전 컬링은 다른 불투명 렌더러 뒤에 완전히 숨겨진 렌더러를 제외합니다. 이 단계는 선택 사항에 해당합니다.
  • GPU가 화면에 보이는 렌더러를 드로우하는 순서를 결정합니다. 대체로 카메라는 투명 오브젝트를 뒤에서 앞으로, 불투명 오브젝트를 앞에서 뒤로 정렬합니다. 머티리얼 또는 셰이더의 렌더링 대기열, 정렬 레이어, 정렬 순서와 같은 기타 요소도 렌더링 순서에 영향을 미칠 수 있습니다.
  • 보이는 렌더러 각각에 GPU에 전달할 드로우 명령을 생성합니다. 이러한 명령은 렌더링을 위한 머티리얼과 메시를 설정합니다.

위 단계는 세부사항이나 개별적 상황을 자세하게 다루지 않지만 카메라를 사용하는 방법에 대한 좋은 기준점이 됩니다.

카메라 테스트 씬

추가 카메라의 비용을 측정하기 위해, 자주 사용하는 회전하는 육면체로 테스트했습니다. 뒤에서 앞까지 모든 테스트 씬에는 다음이 포함되어 있습니다.

  • 회전하는 육면체의 3D 그리드. 각 슬라이스는 가로, 세로 각각에 10개의 육면체가 있습니다. 슬라이스의 수는 조정 가능하며 본 포스팅 시리즈에서는 '로드 요소(load factor)'로 칭합니다.
  • 소프트 섀도우가 있는 방향 광원 하나
  • 각각 모바일 게임에서 두 가지 팝업을 시뮬레이션하는 패널이 포함된 2개의 '게임' UI 캔버스
  • 테스트 컨트롤을 위한 별도의 '오버레이' UI 캔버스

전체 테스트 프로젝트Accelerate Solutions Games 샘플 GitHub 저장소에서 보실 수 있습니다.

Single Camera Test Scene
테스트 씬

게임 내 다양한 조건을 시뮬레이션하기 위해 회전하는 육면체(로드 요소)의 수를 다양하게 변경했습니다. 첫 번째 시나리오의 경우, 게임 로비 씬과 유사한 수준으로 로드가 낮습니다. 두 번째 시나리오는 로드가 높으며 보다 까다로운 게임플레이를 시뮬레이션합니다.

Exploded view of the test scene
테스트 씬의 분해도

유의미한 결과를 얻기 위해 모든 카메라 설정에서 씬 콘텐츠를 동일하게 유지했습니다. 기본 씬에는 메인 카메라, 회전하는 육면체, 그리고 테스트를 제어하는 UI가 포함되어 있습니다. 이후 다음과 같이 카메라 구성이 서로 다른 '게임' UI를 포함하는 네 가지 씬을 만들었습니다.

  1. 메인 카메라만 있는 최적의 씬 '게임' UI 캔버스를 'Screen Space - Overlay'로 설정
  2. '게임' UI 캔버스 2개를 'Screen Space - Camera'로 설정한 후 두 번째 카메라에 할당 (게임에서 사용되는 비교적 일반적인 카메라 설정)
  3. '게임' UI 캔버스 2개를 'Screen Space - Camera'로 설정한 후 각각 별도의 카메라에 할당 (UI를 합성하는 데 여러 카메라가 사용되는 설정 시뮬레이션)
  4. 세 번째 씬과 동일하며 카메라를 한 대 추가한 후 컬링 마스크를 'Nothing'으로 설정 (아무것도 렌더링하지 않음)

각 테스트 시나리오는 기본 씬에 위에서 설정한 씬 중 하나를 부가적으로 로드합니다. 여기에서는 2개 이상의 카메라가 게임 오브젝트를 처리하는 일이 없도록 컬링 마스크를 사용했습니다.

렌더링 파이프라인

렌더링 파이프라인은 씬 내부의 카메라가 이미지를 생성하는 과정입니다. Unity에는 빌트인 렌더 파이프라인이 있으며 기존에는 씬을 렌더링하는 유일한 옵션이었습니다. Unity 2018.1에 스크립터블 렌더 파이프라인(SRP)이 도입되었으며 이를 통해 C# 스크립트에서 렌더링을 제어할 수 있는 가능성이 훨씬 높아졌습니다. 유니티에서 제공하는 두 가지 SRP 구현은 유니버설 렌더 파이프라인(URP)과 고해상도 렌더 파이프라인(HDRP)입니다.

이 포스팅 시리즈에서는 모바일 기기를 지원하는 빌트인 렌더 파이프라인과 URP의 카메라 성능 오버헤드를 살펴봅니다. HDRP는 모바일 기기에서 실행되지 않으므로 이 테스트에서는 제외했습니다. HDRP를 제외한 또 다른 이유는 렌더 기능의 구성 옵션 범위가 상당히 넓어서 비효율적인 카메라 사용 시나리오를 공정하고 의미 있게 비교하기가 어려웠기 때문입니다.

URP는 기본 카메라와 하나 이상의 오버레이 카메라로 이루어진 카메라 스택이라는 개념을 도입했습니다. 이번 URP 테스트에서는 카메라 스택을 사용하여 설정했습니다. 런타임에서 카메라 스택을 설정하고 변경하는 방법에 관한 자세한 내용은 Manager.cs를 참고하세요.

테스트 설정

이번 테스트에는 IL2CPP 개발 빌드와 함께 Unity 2020.3.11f1을 사용했으며, 빌트인 렌더 파이프라인과 유니버설 렌더 파이프라인 모두에서 테스트를 진행했습니다. 각 렌더 파이프라인에서 낮은 로드 및 높은 로드 요소로 테스트한 후 기기당 총 16개의 프로파일러 캡처를 확보했습니다. 기기는 다음의 다섯 종류가 사용되었습니다.

  • Google Nexus 5
  • Samsung Galaxy S7 edge(G935F)
  • Samsung Galaxy A20e
  • iPhone 5s
  • iPhone 7

Profile Analyzer 패키지를 사용해 메인 스레드에서 300프레임의 캡처에 대한 프로파일러 마커의 평균값을 얻었습니다.

모바일 성능에 대한 참고 사항

내부 및 외부 요인을 모두 고려해야 하므로 성능을 안정적으로 측정하기 쉽지 않은 경우가 많습니다. 휴대전화는 서멀 스로틀링과 비대칭적인 CPU 코어와 같은 외부 요인에 영향을 받을 수 있습니다. 유니티 Mobile 팀에서 출간한 '모바일 성능 핸드북: 발열 안정성'은 위와 같은 어려움을 극복하는 데 유용한 내용을 담고 있습니다.

Avoiding thermal throttling with a cooling pack
쿨링 팩을 활용한 서멀 스로틀링 방지

이상으로 카메라를 활용해 게임 성능을 최적화하는 방법을 다룬 첫 번째 블로그 포스팅을 마칩니다. 3주 후 포스팅에서는 테스트 결과와 피해야 할 카메라 패턴, 여러 카메라를 사용해야 하는 경우, 그리고 테스트가 시사하는 바를 확인하실 수 있습니다. 

전자책의 PDF 버전을 다운로드하면 지금 바로 파트 2를 확인할 수 있습니다.

2021년 9월 23일 게임 | 8 분 소요

Is this article helpful for you?

Thank you for your feedback!

다루는 주제
관련 게시물