This document is about: QUANTUM 2
SWITCH TO

유틸리티

성능 기록

오프라인 분석을 위해 성능을 기록하면 실시간 프로파일링 그래프에서 보기 힘든 드문 급증 현상을 식별할 수 있습니다. 또한 규모에 맞는 성능을 측정할 수 있으며 자동화된 테스트 파이프라인과 호환되며 이 파이프라인에 추가할 수 있습니다.

프로파일링용 기본 데이터 구조체는 ProfilingSet (그래프로 표시됨)이며 다음이 포함되어 있습니다:

  • 단일 선으로 표시되는 ProfilingTimer의 집합
  • 단일 선으로 표시되는 ProfilingStatistics의 집합, 그리고
  • 일반적으로 실행 시간을 나타내는 부동 값이 있는 문자열 메시지로 이벤트를 쓰는 메소드.

ProfilingTimer는 3개의 값을 기록합니다: 총 실행 시간, 타이머가 시작된 횟수와 최대 실행 시간을 카운터로 추적. 한편 ProfilingStatistics는 int, bool 또는 float로 단일 값만 기록합니다.

성능 기록을 기록한 후 분석하려면 다음 단계가 필요합니다:

  1. Resources/GameSettings에서 분석 옵션 사용 (런타임 시에 설정할 수 있음):
    • 프레임 기록: Analyzer 서비스가 활성화되면 ProfilingTimersProfilingStatistics에서 프레임당 측정값을 수집합니다.
    • 이벤트 기록: 활성화하면, ProfilingSet.RecordEvent()로 기록된 이벤트가 수집됩니다.
    • 로그 기록: 활성화하면, messages logged with Log 클래스로 로깅한 메시지들이 수집됩니다.
    • 통계 익스포트: 활성화하면, custom statistics set by calling ProfilingSet.SetStatistics() 호출로 설정된 사용자 지정 통계가 내보냅니다.
    • 시간 익스포트: 등록된 모든 ProfilingSets의 총 실행 시간을 내보냅니다.
    • 피크 익스포트: 등록된 모든 ProfilingSets의 최고 실행 시간을 내보냅니다.
    • 카운터 익스포트: 등록된 모든 ProfilingSets의 타이머 카운터를 내보냅니다.
    • 이벤트 익스포트: 레코드 이벤트를 내보냅니다
    • 로그 익스포트: 기록된 로그를 내보냅니다
    • 레코드 업로드: 활성화하면, 익스포트된 아이템들이 특정 주소로 업로드됩니다.
    • 주소 업로드:FTP 서버의 네트워크 주소
    • 사용자 이름 업로드: FTP 서버 업로드용 사용자 이름
    • 비밀번호 업로드: FTP 서버 업로드용 비밀번호
  2. 추적할 모든 ProfilingSets에 대해 Game.Services.Analyzer.Register()를 호출합니다(이미 4개의 기본 집합이 등록되어 있습니다).
  3. 레코드 스택을 지우기 위해서는 Game.Services.Analyzer.ClearRecords()를 호출합니다 (GameplayDirector로부터 이미 호출됨).
  4. CSV 파일을 내보내기 위해 Game.Se됨vices.Analyzer.ExportUploadClear(UNIQUE_ID) 호출(UNITY_PROJECT/Analyzer 폴더가 생성됩니다), 선택적으로 업로드하고 레코드 스택을 없앰.
  5. CSV 파일을 내보낼 때 최근에 생성된 파일이 저장되고 실행되는 동일한 폴더에 REPOSITORY/extras/Scripts/CreateHTMLGraphs.py을 복사합니다. 그러면 동일한 폴더에 위치한 각 CSV 파일에 대한 그래프가 있는 HTML 파일이 생성됩니다.
performance recording graphs
성능 기록 그래프

이 그래프는 유니티 프레임, 사용자 스크립트 시간, 렌더링 시간 및 추적된 전체 게임 성능, 네트워크 성능, 모든 게임 서비스, 씬 서비스, 모든 시뮬레이션 시스템 등을 처리하는 데 소요된 시간(밀리초)을 보여줍니다. 이 그래프에 자동으로 표시되는 사용자 자신의 통계 및 값을 쉽게 기록할 수 있습니다.

그래픽 품질 결정

GraphicsQualityPreset은 선택한 품질 수준에 따라 GameObject 또는 컴포넌트의 특정 속성을 전환할 수 있는 유니티 Monobehavior 컴포넌트입니다.

FPS 템플릿은 다음 4가지 품질 수준을 지원합니다.

  • 낮음
  • 보통
  • 높음
  • 울트라

시각적 정확도의 다양한 측면을 관리하는 데 사용할 수 있는 스크립트는 다음과 같습니다.

  • GraphicsQualityPreset: 상속할 수 있는 기본 클래스
  • CameraQualityPreset: 후 처리와 그림자 토글 가능
  • GameObjectQualityPreset: 게임 객체의 파괴 허용
  • ParticleSystemQualityPreset: 조명을 비활성화하고 최대 입자를 설정 가능
  • PostProcessQualityPreset: 사용자 지정 VolumeProfile 설정 허용
  • RendererQualityPreset: 렌더러의 머터리얼 전환 허용
  • SceneQualityPreset: 반사, 조명 및 안개를 비활성화할 수 있음.

이러한 품질 수준은 Project Settings > Quality 메뉴에 있는 품질 사전 설정과 1-1로 짝을 이룹니다. 게임의 필요에 맞게 조정된 그래픽 품질 사전 설정 스크립트 사용자 지정 세트를 만들어 최대 시각적 품질과 안정적인 성능 사이에서 균형을 유지할 수 있도록 하는 것이 좋습니다.

다음 스크린샷에서는 사전 설정 예제를 볼 수 있습니다. 품질 설정이 낮음 또는 중간일 때 렌더러 재료를 "단순" 변형으로 전환합니다.

graphics quality preset
낮음과 보통의 GraphicsQualityPreset 컴포넌트 예제

플랫폼 설정

FPS 템플릿은 독립 실행형, 모바일 및 VR 플랫폼을 지원합니다.

프레젠테이션을 사용하면 단일 리포지토리 내의 특정 플랫폼에 대해 서로 다른 코드 경로를 실행할 수 있습니다. 에디터에서 빌드를 만들거나 재생하기 에 플랫폼을 올바르게 설정해야 합니다. 화면 보기 위의 도구 모음에서 전환할 수도 있습니다.

platform preset toolbar buttons
Platform Preset Toolbar Buttons

플랫폼 정보는 GameSettings 에셋에 직렬화되며 런타임에 이용할 수 있습니다. 주의 실행 시에만 변경할수 있습니다!

플랫폼별 사전 설정을 관리하는 데 사용할 수 있는 스크립트는 다음과 같습니다:

  • PlatformPreset: 상속할 수 있는 기본 클래스
  • CanvasPlatformPreset: 캔버스 렌더러 모드 전환 허용
  • ComponentPlatformPreset: 컴포넌트의 활성화, 비활성화 또는 파괴 허용
  • GameObjectPlatformPreset: GameObject의 활성화, 비활성화 또는 파괴 허용
  • LayerPlatformPreset: GameObject 레이어 전환 허용(자식들중 하나 포함)

예를 들어 GameObject 아래의 스크린샷에는 VR 플랫폼에서 선택한 게임 개체를 파괴하는 GameObjectPlatformPreset 이 있습니다.

platform preset
Platform Preset

대량 시뮬레이션

FPS 템플릿을 사용하면 메모리 내의 여러 게임을 동시에 시뮬레이션할 수 있으며 CPU를 100% 활용하고 게임 플레이 시각은 무시할 수 있습니다. 이 기능은 게임 플레이(무기, 발사체, 비대칭 맵 등), 버그 찾기(충돌 모델의 구멍, 금지된 위치, 도달할 수 없는 지점 등), AI 개선, 지도 분석 데이터 추출, 다양한 코드 경로 테스트 등에 사용할 수 있습니다.

FPS 템플릿은 대량 시뮬레이션을 실행하기 위한 두 가지 모드를 지원합니다.

  • Quantum / Mass Simulation Editor 편집기에서 직접 실행
  • 사용자 지정 씬에서 플레이 모드로 실행

대량 시뮬레이션 편집기

이 편집기 창은 게임 바이너리를 실행하거나 구축할 필요 없이 빠른 사용, 초기 균형 조정, 대량 시뮬레이션 테스트 케이스 구축 등을 목표로 합니다.

mass simulation editor
대량 시뮬레이션 편집기

대량 시뮬레이션 편집기에서는 단일 시뮬레이션 세트와 관련된 설정을 포함하는 MassSimulationSetup 인스턴스를 참조해야 합니다(아래에서 설명됩니다).

플레이 모드

플레이 모드에서 대량 시뮬레이션을 실행하려면 사용자 지정 씬 디렉터가 있는 씬이 필요합니다. FPS 템플릿에는 MassSimulationDirector가 있는 MassSimulation이 포함되어 있습니다. 씬의 내용은 시각화할 내용에 따라 다릅니다. 일반적으로 화면은 비어 있거나 현재 시뮬레이션된 씬과 유사합니다. 다음 이미지는 특수 히트 맵 프로세서(레벨에서의 에이전트 위치 수집 및 분석 및 단순 히트 맵 사용 시각화 담당)로 MassSimulation 씬을 실행하는 모습입니다.

mass simulation scene
Mass Simulation Scene

다음 이미지는 씬의 Mass Simulation Director를 나타냅니다:

mass simulation director
대량 시뮬레이션 디렉터

MassSimulationDirector의 속성:

  • Setups: 연속적으로 실행되는 MassSimulationSetup의 목록
  • TaskCount: Setups의 설정마다 시뮬레이션 되는 작업(게임)의 개수
  • FrameLimit: 단일 게임의 프레임 제한(게임이 멈춘 경우)
  • AutoStart: 플레이 모드로 들어간 후 자동으로 시뮬레이션을 시작
  • AutoQuit: 모든 Setups이 완료된 이후 자동으로 게임 종료 / 플레이 모드

대량 시뮬레이션 설정

MassSimulationSetup 은 단일 MassSimulation에 대한 설정을 포함하는 에셋(스크립트 할 수 있는 객체)으로 단일 MassSimulationSet (테스트 케이스)에 대한 설정이 포함되어 있습니다.

mass simulation setup
대량 시뮬레이션 설정

다음과 같은 속성이 포함되어 있습니다:

  • Map: MapAsset에 대한 참조
  • Gameplay: GameplayControllerAsset에 대한 참조
  • AI Setup: AI 플레이어의 스폰을 할 때 사용되는 PlayerSetup의 참조
  • Processors: 실행 중인 시뮬레이션을 처리하는 MassSimulationProcessor 에셋 목록
  • Delta Time: 각 틱마다 시뮬레이션에 전달되는 델타 시간
  • Thread Limit: 쓰레드의 최대 개수 (쓰레드마다 단일 시뮬레이션)
  • Initial Seed: 시작 시드
  • Increment Seeds: 활성화된 경우 시작된 각 새 시뮬레이션은 1씩 증가된 시드를 수신
  • Randomize Seeds: 활성화된 경우 시뮬레이션이 시작될 때마다 임의 시드가 수신(Initial Seed 그리고 Increment Seeds는 무시)
  • Auto Thread Limit: 활성화된 경우 최대 스레드 수는 프로세서 수(물리 코어 개수)와 동일
  • Preserve Core: 활성화된 경우 하나의 코어가 시스템 응답을 보존하는 데 사용되지 않음

대량 시뮬레이션 프로세서

MassSimulationProcessor는 시뮬레이션, 데이터 수집 및 결과 제공을 담당하는 에셋(스크립트 가능 객체)입니다.

다음 이미지는 HeatMapMassSimulationProcessor의 예제입니다.

mass simulation processor
Mass Simulation Processor

새로운 프로세서를 만들려면 MassSimulationProcessor에서 상속된 MyCustomMassSimulationProcessor 클래스를 만들고 다음 메소드를 오버라이드 합니다.

C#

// Called each frame and depends on Unity Editor/Runtime update rate.
protected virtual void OnTick(MassSimulationSet set)           {}

// Called on deinitialization and explicit reset, use for cleanup.
protected virtual void OnReset(MassSimulationSet set)          {}

// Called when the MassSimulationSet is started, use for initialization of local data.
protected virtual void OnSetStarted(MassSimulationSet set)     {}

// Called when the MassSimulationSet finished (all tasks already finished). This is the right place to analyze and report final results.
protected virtual void OnSetFinished(MassSimulationSet set)    {}

// Called when a MassSimulationTask started, use for initialization related to single simulation
protected virtual void OnTaskStarted(MassSimulationTask task)  {}

// Called when a MassSimulationTask finished, use to store results from the task / recalculate continuous statistics
protected virtual void OnTaskFinished(MassSimulationTask task) {}

그런 다음 편집기에서 새 에셋을 만들고 MassSimulationSetup에 연결할 수 있습니다.

노트: MassSimulationSetMassSimulationSetup을 기반으로 생성되며 각 작업은 단일 Quantum 시뮬레이션을 나타내는 MassSimulationTasks 목록을 포함하고 있습니다. 새 시뮬레이션을 실행하기 전에 프로세서가 항상 인스턴스화(복제 생성)되어 있으므로 private 필드를 사용하는 것이 안전합니다. 프로세서 로직은 편집기/런타임 환경 모두에서 실행할 수 있습니다. 이 툴링은 자동화 테스트 파이프라인에 추가할 때 매우 효율적입니다.

게임 저장 / 오프라인 리플레이

게임 저장 및 리플레이 백업은 실행 시 UI 일시 중지 보기에서 또는 바로 가기 키를 눌러 수동으로 만들 수 있습니다. 기본적으로 데이터는 유니티 프로젝트 루트 하위 폴더 SavegamesReplays(유니티 편집기에서) 또는 사용자 애플리케이션 데이터(빌드에서)로 익스포트됩니다.

Resources/GameSettings(런타임을 통해 설정할 수 있음)의 Replay 설정에 따라 재생을 자동으로 저장하거나 원격 FTP 서버에 업로드할 수도 있습니다.

  • DB 익스포트: 에셋 DB 내보내기
  • 리플레이 익스포트: 기록된 입력 내보내기
  • 체크썸 익스포트: 기록된 체크썸 내보내기
  • 리플레이 업로드: 활성화되면, 내보내진 항목들이 특정 주소로 업로드됩니다
  • 주소 업로드: FTP 서버의 네트워크 주소
  • 사용자 이름 업로드: FTP 서버 업로드용 사용자 이름
  • 비밀번호 업로드: FTP 서버 업로드용 비밀번호

게임 저장이나 리플레이를 실행하려면 내보낸 파일을 유니티로 가져와 원본 씬에서 참조해야 하는데 GameplayDirector에는 Replay FileSavegame File 필드가 있습니다. 게임을 올바르게 시뮬레이션하려면 내보낸 파일이 만들어진 커밋을 이상적으로 고수하면서 동일한 바이너리와 데이터베이스를 실행하는 것이 중요합니다.

Back to top