라이브 환경에서 스테이지를 운영할 때는 언리얼 엔진 (UE)의 인스턴스를 실행하는 여러 머신이 함께 작동하며 서로 의존합니다. 작업자는 일부 인스턴스를 LED 벽에 렌더링할 수 있고, 일부 인스턴스를 에디터 내에서의 씬을 수정하는 데 사용할 수 있으며, 또 일부는 컴포짓에 사용할 수 있습니다. 스테이지 모니터를 활용하면 언리얼 엔진의 이러한 모든 인스턴스로부터 각종 이벤트를 수신하고 설정에서 문제를 해결할 수 있습니다.
이미지를 클릭하면 확대됩니다.
이 개요를 끝까지 읽으면 스테이지 모니터(Stage Monitor)를 사용하는 방법과 프로젝트에 커스텀 이벤트를 추가하는 방법에 익숙해질 것입니다.
필수 플러그인
스테이지 모니터를 시작하려면 프로젝트에 다음 플러그인을 추가합니다.
플러그인 이름 | 목적 |
---|---|
Stage Monitor | 필수 - 데이터 제공자와 스테이지 모니터링 로직을 활성화하는 주요 플러그인입니다. |
버추얼 프로덕션 유틸리티(Virtual Production Utilities) | 필수 - 버추얼 프로덕션 역할의 기능을 사용할 수 있도록 스테이지 모니터링 플러그인과 함께 활성화됩니다. |
스위치보드(Switchboard) | 선택- 스테이지를 운영하는 UE 인스턴스를 다수 실행하기 수월하게 합니다. 각 인스턴스에 할당된 역할을 설정하는 데도 사용할 수 있습니다. |
프로젝트에서 플러그인을 활성화하려면 다음 단계에 따릅니다.
-
메인 메뉴 바에서 편집(Edit) > 플러그인(Plugins) 을 선택합니다.
-
플러그인(Plugin) 창에서 스테이지 모니터(Stage Monitor) 플러그인을 찾아서 활성화(Enable) 에 체크합니다.
이미지를 클릭하면 확대됩니다.
-
확인하는 창이 뜨면 예(Yes) 를 선택합니다.
-
지금 재시작(Restart Now) 을 클릭하여 에디터를 닫고 새 플러그인이 활성화된 상태로 재시작합니다.
-
위 프로세스를 반복하여 버추얼 프로덕션 유틸리티(Virtual Production Utilities) 와 스위치보드(Switchboard) 플러그인도 활성화합니다.
작업 중인 언리얼 엔진 버전에 따라 이러한 플러그인이 기본으로 활성화되어 있을 수도 있습니다. 활성화 여부를 플러그인 메뉴에서 다시 확인하는 것이 좋습니다.
타임코드 구성
언리얼 엔진의 각 인스턴스는 별개의 타임코드를 생성합니다. 다수의 머신이 서로 커뮤니케이션할 때 이벤트가 동기화되지 않으면 스테이지 모니터에서 무질서하게 보일 수 있습니다. 언리얼 엔진 인스턴스를 효과적으로 모니터링하려면 모니터링할 모든 인스턴스에서 타임코드를 활성화하고 동일한 타임코드 프로바이더를 사용하세요. 여러 머신 간의 타임코드 동기화에 대한 자세한 정보는 타임코드 및 젠록을 참고하세요.
머신 역할 할당
스테이지를 운용할 때 각 머신이 렌더러, 에디터, 컴포지터 등 서로 다른 역할을 수행할 수 있습니다. 명령줄 실행인자나 스위치보드에서 각 언리얼 엔진 인스턴스의 함수를 바탕으로 서로 다른 로직을 활용하기 위한 역할을 할당할 수 있습니다. 스테이지 모니터(Stage Monitor)는 이러한 역할을 활용하여 인스턴스가 어떤 이벤트를 생성할 수 있는지, 인스턴스를 모니터링해야 하는지 여부 등을 판정합니다.
스위치보드에서 역할 할당
스위치보드는 \Config\Tags\VPRoles.ini
에 있는 인스턴스별 프로젝트 폴더에서 VPRoles.ini
파일을 찾습니다. 다음 예시는 VPRoles.ini
파일에 Render, Editor, Compositor 역할을 추가한 것입니다.
[/Script/GameplayTags.GameplayTagsList]
GameplayTagList=(Tag="Render", DevComment="")
GameplayTagList=(Tag="Editor", DevComment="")
GameplayTagList=(Tag="Compositor", DevComment="")
스위치보드 세팅에서 각 인스턴스의 역할을 조정할 수 있습니다.
이미지를 클릭하면 확대됩니다.
명령줄에서 역할 할당
명령줄 실행인자를 통해 각 인스턴스에 역할을 할당할 수도 있습니다. 언리얼 엔진 인스턴스를 실행할 때 : -VPRole=RoleName
실행인자를 추가합니다. 여기서 RoleName
은 Editor 등 머신에 할당하려는 역할입니다.
스테이지 모니터 열기
스테이지 모니터 데이터 제공자(Stage Monitor Data Provider)는 역할 필터링을 사용하지 않는 한 기본적으로 시작됩니다. 각 인스턴스가 실행되면 스테이지 모니터를 찾고, 찾으면 이벤트 전송을 시작합니다. 다른 인스턴스를 모니터링하는 인스턴스가 주기적으로 데이터 제공자를 찾기 위해 메시지를 브로드캐스트할 것입니다. 모니터가 발견되면 데이터 제공자는 발생되는 모든 이벤트를 전송하기 시작할 것입니다. 스테이지 모니터를 실행하여 정보를 전송하고 수신하는 순서가 예상대로인지 확인하세요.
스테이지 모니터를 실행하려면 다음 단계에 따릅니다.
-
창(Windows) 탭을 클릭하고 버추얼 프로덕션(Virtual Production) > 스테이지 모니터(Stage Monitor) 탭을 클릭합니다.
-
모니터 상태(Monitor Status) 토글스위치를 사용하여 스테이지 모니터를 활성화합니다.
-
활성화되면 상단 메뉴에서 연결된 인스턴스를 확인할 수 있습니다.
이미지를 클릭하면 확대됩니다.
-
또한 활성화되면 지속적인 스테이지 이벤트 스트림이 하단 창을 채우는 것을 볼 수 있습니다.
이미지를 클릭하면 확대됩니다.
스테이지 모니터 사용
스테이지 모니터(Stage Monitor)로 유입되는 정보가 너무 많아서 처리하기 어려울 수 있습니다. 주목할 항목과 이벤트 로그 관리에 도움이 되는 팁을 소개합니다.
크리티컬 스테이트
테이크 레코더(Take Recorder)는 씬 녹화 시 크리티컬 스테이트(Critical State) 이벤트 타입을 사용하여 지정합니다. 녹화 중에는 모든 이벤트가 결과에 영향을 미칠 수 있습니다. 테이크를 시작하면 스테이지가 크리티컬 스테이트에 들어가고, 테이크를 멈추면 스테이지가 크리티컬 스테이트에서 벗어납니다. 크리티컬 스테이트는 이벤트 타입이므로 모든 시나리오에 대해 크리티컬 스테이트를 설정할 수 있습니다.
스테이지 모니터가 테이크 레코더로 크리티컬 스테이트에 들어가는 것을 확인하려면 다음 단계에 따릅니다.
-
스테이지 모니터(Stage Monitor) 를 실행하고 모든 언리얼 엔진 인스턴스가 연결되어 이벤트를 적절히 보고하는지 확인합니다.
-
창(Windows) > 시네마틱(Cinematics) > 테이크 레코더(Take Recorder) 로 이동하여 테이크 레코더 를 실행합니다.
-
테이크 레코더 에서 테이크 시작 버튼을 클릭합니다.
-
잠깐의 일시정지 후에 스테이지 모니터 상태 표시기가 녹색(작동 안 함)에서 붉은색(작동 중)으로 바뀌며 스테이지 모니터가 크리티컬 스테이트에 들어갔음을 나타냅니다.
-
크리티컬 스테이트에서는 이벤트 로그(Event Log)의 이벤트가 하이라이트되는 점에 유의하세요.
-
테이크 중지 버튼을 클릭하여 테이크를 중지합니다.
다음은 이 프로세스를 실제로 수행하는 영상입니다.
필터링
시간이 지나면 메시지 로그가 방대해져 특정 항목을 찾기 어려워질 수 있습니다. 필터 메뉴를 사용하면 관심 있는 이벤트 타입과 가려낼 데이터 제공자에 수월하게 집중하고, 스테이지가 작동 중인 동안 발생한 이벤트만 확인할 수 있습니다.
-
창(Windows) > 버추얼 프로덕션(Virtual Production) > 스테이지 모니터(Stage Monitor) 를 선택하여 스테이지 모니터 를 실행합니다.
-
이벤트 로그 에 있는 필터(Filters) 드롭다운 메뉴를 펼칩니다.
-
메시지 타입별로 필터를 적용하려면 메시지 타입(Message Type) 을 선택합니다.
-
이벤트 제공자(Event Provider) 에 따라 이벤트에 필터를 적용하려면 제공자(Provider) 를 선택합니다.
-
역할을 기반으로 필터를 적용하려면 역할(Role) 옵션을 활성화하고 선택합니다.
-
크리티컬 스테이트 소스를 기반으로 필터를 적용하려면 크리티컬 스테이트 소스(Critical State Source) 를 활성화하고 선택합니다.
-
시간별로 이벤트에 필터를 적용하려면 시간(Time) 옵션을 활성화하고 선택합니다.
익스포트/임포트
세션이 완료되면 모든 이벤트와 제공자를 JSON 파일로 익스포트할 수 있습니다. 그런 다음 이러한 로그를 외부에서 검토하거나 언리얼 엔진에서 바로 검토할 수 있습니다.
-
창(Windows) > 버추얼 프로덕션(Virtual Production) > 스테이지 모니터(Stage Monitor) 를 선택하여 스테이지 모니터 를 실행합니다.
-
스테이지 모니터 좌측 상단에는 5개의 버튼이 있습니다.
-
현재 로그를 익스포트하려면 디스크 아이콘을 클릭합니다. 버튼을 클릭하면 로그를 저장할 위치를 묻는 창이 표시됩니다.
-
리뷰 모드에 들어가려면 왼쪽의 주황색 점 을 클릭합니다.
-
리뷰 모드에 들어가면 현재 세션(CurrentSession) 옆의 이름이 리뷰 중인 파일을 반영하여 변합니다.
-
리뷰 모드에서 이전에 기록한 로그를 로드하여 리뷰하려면 폴더 아이콘 을 클릭합니다.
파일이 열리면 동일한 필터를 사용하여 특정 이벤트를 가려낼 수 있습니다.
스테이지 모니터 이벤트 타입
스테이지 모니터 이벤트 타입 중 몇 가지는 언리얼 엔진의 순정 버전에서 시작됩니다. C++로 StageDataCore
모듈에 종속성을 추가하고 이벤트에 대한 FStageProviderEventMessage를 상속하여 새 유형을 추가할 수 있습니다. 또한 반복되는 메시지에 대해 FStageProviderPeriodicMessage를 확장할 수 있습니다. 아래 표는 일반적인 이벤트, 파일 위치, 목적을 설명합니다.
이벤트 이름 | 파일 위치 | 설명 |
---|---|---|
크리티컬 스테이트 제공자 메시지(Critical State Provider Message) | StageMessages.h |
크리티컬 스테이트에 들어가거나 크리티컬 스테이트에서 벗어날 때 전송됩니다. |
스테이지 제공자 발견 응답 메시지(Stage Provider Discovery Response Message) | StageMessages.h |
모니터와 제공자 간 발견 프로토콜의 일부입니다. |
스테이지 제공자 종료 메시지(Stage Provider Close Message) | StageMessages.h |
제공자가 종료될 때 전송됩니다. |
프레임 퍼포먼스 제공자 메시지(Frame Performance Provider Message) | StageMonitorUtils.h |
제공자의 프레임 데이터를 새로고침하기 위해 주기적으로 전송됩니다. |
멈춤 현상 탐지 메시지(Hitch Detection Message) | FramePerformanceProvider.h |
한 프레임의 처리 시간이 허용된 최대 시간을 초과할 때 전송됩니다. |
젠록 스테이트 이벤트(Genlock State Event) | GenlockWatchdog.h |
젠록된 CustomTimeStep의 스테이지가 변경될 때 전송됩니다. |
젠록 멈춤 현상 이벤트(Genlock Hitch Event) | GenlockWatchdog.h |
젠록된 CustomTimeStep의 젠록 신호 프레임이 누락되었을 때 전송됩니다. |
타임코드 제공자 스테이트 이벤트(Timecode Provider State Event) | TimecodeProviderWatchdog.h |
TimecodeProvider의 상태가 변경될 때 전송됩니다. |
시간 데이터 모니터 채널 연결 스테이트 이벤트(Timed Data Monitor Channel ConnectionState Event) | TimecodeProviderWatchdog.h |
TimedDataMonitor 플러그인이 필요합니다. 채널 연결 스테이트가 변경되면 전송됩니다. |
시간 데이터 모니터 채널 평가 스테이트 이벤트(Timed Data Monitor Channel Evaluation State Event) | TimedDataMonitorSubsystem.h |
TimedDataMonitor 플러그인이 필요합니다. 채널 평가 스테이트가 변경되면 전송됩니다. |
이벤트 타입 추가
커스텀 스테이지 모니터 이벤트 타입을 추가하려면 다음 단계에 따릅니다.
-
에디터 메인 메뉴에서 파일(File) > Visual Studio 열기(Open Visual Studio)를 선택합니다. 이 옵션이 보이지 않는다면 새 C++ 클래스(New C++ Class)를 선택합니다.
-
Visual Studio의 솔루션 탐색기(Solution Explorer)에서 .Build.cs 파일에 정의된 모듈을 찾습니다. 그 모듈이 스테이지 이벤트를 발생시킬 위치입니다. 다음과 같이
StageDataCore
를 PublicDependencyModuleNames 범위에 추가합니다.PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "StageDataCore" });
-
C++ 헤더 파일에서 스테이지 이벤트 데이터 구조를 정의하고 FStageProviderEventMessage 또는 FStageProviderPeriodicMessage에서 상속합니다. 다음 MyStageEvents.h 헤더 파일에서 FMyStageEvent는 FStageProviderEventMessage로부터 상속하며 데이터가 int32일 것으로 예상합니다.
#include "StageMessages.h" #include "MyStageEvents.generated.h" USTRUCT () struct FMyStageEvent : public FStageProviderEventMessage { GENERATED_BODY () public: FMyStageEvent () = default; FMyStageEvent (int32 InMyVariable) : MyVariable (InMyVariable) {} public: int32 MyVariable = 0; }
-
코드에서 이벤트를 발생시키고 싶을 때마다 IStageDataProvider::SendMessage<>()를 이벤트와 함께 템플릿 파라미터로 호출합니다. 예를 들어 위에서 생성한 이벤트는 다음과 같이 발생시킬 수 있습니다.
int32 DataToSend = 3; IStageDataProvider::SendMessage<FMyStageEvent>(EStageMessageFlags::Reliable, DataToSend);
언리얼 엔진은 UDP를 사용하여 메시지를 전송하므로 메시지가 손실되거나 중단되어서 수신받지 못할 수도 있습니다. EStageMessageFlags::Reliable
플래그를 사용하면 스테이지 모니터가 메시지를 확실히 수신받게 할 수 있습니다.
메시지를 주기적으로 전송하는 경우 EStageMessageFlags::None
을 Reliable 플래그 대신 사용할 수 있습니다.
스테이지 모니터 세팅
스테이지 모니터(Stage Monitor)의 세팅은 툴 안에서 직접 찾거나 프로젝트의 프로젝트 세팅에서 찾을 수 있습니다.
-
언리얼 에디터에서 스테이지 모니터 세팅에 액세스하려면 편집(Edit) > 프로젝트 세팅(Project Settings) 으로 이동하여 Stage 를 검색합니다.
-
툴 안에서 스테이지 모니터 세팅에 액세스하려면 우선 창(Windows) > 버추얼 프로덕션(Virtual Production) > 스테이지 모니터(Stage Monitor) 로 이동하여 스테이지 모니터 를 실행합니다.
-
툴에서 톱니바퀴 버튼을 클릭합니다.
주요 세팅과 그 기능은 다음과 같습니다.
일반 세팅

세팅 이름 | 설명 |
---|---|
Use Session ID | 세션 ID를 사용하여 동일한 네트워크상의 두 스테이지를 구분할 수 있습니다. 그런 다음 명령줄에서 -StageSessionId=를 사용하여 각 인스턴스에 세션 ID를 전달할 수 있습니다. |
Timeout Interval | 제공자가 모니터와 연결 해제되었다고 판단하는 데 필요한 시간이자 모니터가 제공자와 연결 해제됐다고 판단하기까지 걸리는 시간입니다. |
Monitor Settings

세팅 이름 | 설명 |
---|---|
Supported Roles | 인스턴스에 특정 역할이 있을 때만 로직이 사용되도록 모니터링에 필터를 적용하는 데 사용됩니다. 예를 들어 모니터링을 자동 시작하되 렌더 노드에서 사용되기는 바라지 않는 경우에 유용합니다. |
Auto Start | 디폴트로 모니터링 로직은 자동으로 시작되지 않습니다. 모니터 패널에서 시작할 수 있지만, 인스턴스 실행 시 자동으로 시작되게 하려면 이 세팅을 체크합니다. 역할 필터링을 사용하지 않는 경우 모든 인스턴스가 모니터링되며, 그러면 다수의 인스턴스가 사용되는 경우 네트워크 트래픽이 대폭 증가할 수 있습니다. |
Provider Settings

세팅 이름 | 설명 |
---|---|
지원되는 역할(Supported Roles) | 인스턴스에 해당 목록상의 역할이 있을 때만 데이터 제공자 로직을 활성화합니다. |
Message Type Role Exclusion | 기본적으로 모든 데이터 제공자가 발생시키는 모든 이벤트는 트리거됩니다. 이로 인해 모니터링 로그가 매우 복잡해질 수 있으며, 멈춤 현상 탐지가 활성화된 경우 특히 더 그렇습니다. 예를 들어 에디터를 사용할 때 사용자가 메뉴로 이동하면 틀림없이 멈춤 현상이 트리거됩니다. 이를 필터링하기 위해 이 세팅을 사용하여 주어진 이벤트 타입에 특정 역할을 할당함으로써 해당 이벤트를 트리거할 인스턴스에 필터를 적용할 수 있습니다. |
Update Interval | 언리얼 엔진은 주기적으로 모든 데이터 제공자로부터 이 메시지를 전송합니다. 여기에는 프레임 타이밍 정보가 포함되며 하트비트로 사용됩니다. 이를 통해 모든 제공자에 대한 모니터 패널과 이들의 진행 상황을 간단하게 파악할 수 있습니다. 이 세팅은 언리얼 엔진이 메시지를 전송하는 속도를 제어합니다. |
Enable Hitch Detection | 기본 멈춤 현상 탐지 로직을 활성화합니다. 통계 스레드를 사용하므로 렌더 노드를 포함해 메시지가 뷰포트로 드로됩니다. 이를 피하려면 -ExecCmds="DisableAllScreenMessages"를 넣어서 실행해야 합니다. |
Minimum Frame Rate | 렌더링 또는 게임 스레드의 처리 시간이 허용된 최대 시간을 초과할 때 전송됩니다. 이 프레임 레이트 간격보다 오래 걸리는 경우 멈춤 현상 이벤트가 트리거됩니다. |
Export Settings

세팅 이름 | 설명 |
---|---|
Keep Only Last Period Message | JSON으로 익스포트할 때 모든 이벤트 기간 타입의 마지막 메시지만 익스포트합니다. 이렇게 하면 파일 크기가 줄어듭니다. |
Exclude Message Types | JSON으로 익스포트할 때 제외할 이벤트 타입을 추가합니다. |