TL;DR
현대의 embodied AI 및 비전 연구는 고품질 렌더링과 광범위한 프로그래머블 접근성을 동시에 필요로 한다. SPEAR는 언리얼 엔진의 런타임 리플렉션을 파이썬 API로 직접 노출해 기존 UE 기반 시뮬레이터보다 훨씬 많은 함수와 속성을 제어할 수 있게 했다. 또한 고해상도 이미지를 복사 없이 NumPy 배열로 전달하고 비동기 파이프라인을 통해 프레임 전송 속도를 크게 개선함으로써 대규모 데이터 생성과 실시간 제어를 동시에 가능하게 했다.
왜 중요한가
현대의 embodied AI 및 비전 연구는 고품질 렌더링과 광범위한 프로그래머블 접근성을 동시에 필요로 한다. SPEAR는 언리얼 엔진의 런타임 리플렉션을 파이썬 API로 직접 노출해 기존 UE 기반 시뮬레이터보다 훨씬 많은 함수와 속성을 제어할 수 있게 했다. 또한 고해상도 이미지를 복사 없이 NumPy 배열로 전달하고 비동기 파이프라인을 통해 프레임 전송 속도를 크게 개선함으로써 대규모 데이터 생성과 실시간 제어를 동시에 가능하게 했다.
핵심 기여
광범위한 UE 기능 노출
SPEAR는 UE의 런타임 리플렉션을 통해 14K개 이상의 UE 함수를 파이썬에서 직접 호출할 수 있도록 노출했다. 이 접근은 수백 개 수준의 수작업 래퍼를 대체해 제3자 에셋이나 프로젝트에 쉽게 통합 가능하도록 만들었다. 그 결과 사용자 코드를 수정하지 않고도 UE의 거의 모든 리플렉션 가능한 API를 프로그래밍적으로 제어할 수 있다.
고성능 렌더-파이썬 인터페이스
SPEAR는 인터프로세스 공유 메모리와 SpFunction 디스패치로 GPU에서 렌더된 픽셀을 추가 복사 없이 사용자의 NumPy 배열로 전달한다. 비동기 통신과 공유 메모리 조합에서 1920×1080 이미지를 Python으로 전달하는 지연을 17.8ms 수준까지 줄여 초당 수십 프레임을 달성했다. 이 성능 개선은 기존 UE 플러그인보다 9–21배 빠른 통신 오버헤드를 의미한다.
결정론적 트랜잭션 기반 프로그래밍 모델
사용자는 begin_frame과 end_frame 컨텍스트로 UE 작업 그래프를 기술하고 해당 그래프가 단일 UE 프레임 내에서 순차적으로 실행되도록 보장받는다. 비동기 작업은 서버 스레드의 큐로 들어가 게임 스레드가 프레임 경계에서 작업을 소모해 동기화 지점을 제공한다. 이 모델은 에디터 내 상호작용, 외부 물리 시뮬레이터와의 코시뮬레이션, 그리고 프레임 단위 결정론적 스텝핑을 모두 지원한다.
유니버설 확장성과 비동기 API 제공
SPEAR는 모든 리플렉션 가능 함수에 대해 동기 및 비동기 변형을 제공해 Python 스레드가 게임 스레드를 차단하지 않도록 설계되었다. 서버는 별도 스레드에서 동작하며 begin/end 큐를 통해 진행을 조율해 Python이 UE의 네이티브 프레임 속도를 유지할 수 있게 했다. 또한 193개의 수작업 서버 엔트리포인트와 템플릿 기반 자동 비동기화를 조합해 구현 복잡도를 낮추었다.
관련 Figure

이 그림은 SPEAR가 다양한 Epic Games 샘플 프로젝트에서 사람, 자동차, 비행 로봇, 쿼드러펀트 로봇 등 서로 다른 액션 스페이스를 가진 에이전트를 동시에 제어할 수 있음을 시각적으로 보여준다. 각 샷은 SPEAR의 프로그래밍 모델을 이용해 프로젝트별 에이전트와 상호작용하고 렌더링을 동기화한 결과를 담고 있어 제어·프로그램 가능성의 폭을 가시적으로 입증한다.
여러 샘플 UE 프로젝트에서 서로 다른 형태의 에이전트를 SPEAR로 제어한 출력 스냅샷 모음이다.
핵심 아이디어 이해하기
현행 UE 기반 시뮬레이터는 일반적으로 수작업으로 제작된 소수의 Python 인터페이스와 모노리식 빌드를 사용해 확장성과 통합에서 제약이 있었다. 이 제약 때문에 외부 프로젝트나 에셋 통합이 어렵고, 대용량 데이터(예: 1920×1080 이미지)를 Python으로 넘길 때 통신 오버헤드가 병목으로 작용했다. 또한 기존 인터페이스는 UE의 모든 런타임 기능을 프로그램적으로 노출하지 못해 표현력이 제한되었다. SPEAR의 핵심은 UE의 런타임 리플렉션을 직접 노출해 문자열 기반으로 클래스·함수·속성을 동적으로 탐색·호출할 수 있게 한 것이다. 이 방식은 특정 API마다 래퍼를 만들 필요를 제거하고, 리플렉션이 허용하는 모든 함수와 프로퍼티를 자동으로 노출함으로써 제어 가능한 기능의 수를 획기적으로 늘렸다. 리플렉션 노출 위에 동기/비동기 쌍을 제공하고 트랜잭션 모델을 적용해 프레임 경계에서의 실행 순서를 엄격히 보장했다. 데이터 전송 병목을 해결하기 위해 SPEAR는 SpFunction과 인터프로세스 공유 메모리 매핑을 도입했다. Python 클라이언트는 NumPy 배열을 공유 메모리로 할당해 서버에 넘기고, 서버는 해당 메모리를 직접 스크립트 가능한 UE 함수로 연결해 추가 복사 없이 픽셀 데이터를 주고받는다. 이 조합은 통신 오버헤드를 수십 밀리초 수준으로 낮춰 렌더링 성능을 실질적으로 향상시켰다.
방법론
시스템 아키텍처는 Python 클라이언트와 UE 내 C++ 서버 플러그인으로 구성된 클라이언트-서버 모델을 채택했다. 클라이언트는 사용자의 begin_frame/end_frame 트랜잭션을 명령 스트림으로 변환해 TCP/IP(또는 로컬 IPC)를 통해 서버로 전송하고, 서버는 별도의 서버 스레드에서 명령을 수신해 게임 스레드와 작업을 조율한다. 서버는 begin_frame·end_frame용 두 개의 스레드 안전 큐를 유지해 게임 스레드가 프레임 경계에서 해당 큐를 드레인하도록 했으며, 이를 통해 트랜잭션의 실행 순서와 결정론을 보장했다. 리플렉션 노출을 위해 서버는 UE의 리플렉션 API를 이용해 함수와 속성의 메타데이터를 열람하고 JSON 기반 표현으로 Python과 주고받도록 설계했다. 리플렉션으로 노출되지 않는 핵심 기능들은 193개의 수작업 엔트리포인트로 보완되며, 각 엔트리포인트에 대해 템플릿 메타프로그래밍으로 비동기 변형을 자동 생성했다. 대용량 데이터 전송은 SpFunction 인터페이스를 통해 처리되며, SpFunction은 이름이 붙은 데이터 배열, UE 객체 JSON, 임의 문자열을 입출력 인자로 사용해 Python의 NumPy 배열을 효율적으로 매핑한다. 성능 최적화를 위해 인터프로세스 공유 메모리를 도입해 GPU에서 렌더된 이미지를 사용자 NumPy 배열로 직접 매핑하도록 했고, 필요한 경우 서버는 Python 스레드의 진행을 게이트해 게임 스레드와의 지나친 비동기 차이를 방지한다. 또한 사용자가 원하는 경우 end_frame(single_step=True) 호출로 프레임을 한 단계만 진행시키는 옵션을 제공해 완전한 동기 단위 스텝핑을 지원한다.
관련 Figure

이 Figure는 SPEAR가 UE의 PCG 시스템을 API로 제어해 예컨대 암석 구조를 이동시키면 주변 수면·목재 등 환경 요소가 자동으로 적응하는 장면 변화를 발생시킬 수 있음을 시각적으로 확인시킨다. 이는 프로그래밍적 장면 편집과 환경 상호작용을 연구·생성하는 데 SPEAR가 유용함을 뒷받침한다.
UE의 프로시저 기반 콘텐츠 생성(PCG)을 SPEAR로 프로그램적으로 조작해 장면 요소가 자동으로 조화되는 예시를 보여주는 연속 프레임 이미지이다.

이 그림은 SPEAR가 외부 물리 시뮬레이터(MuJoCo) 상태를 쿼리해 해당 상태를 UE 장면으로 실시간 반영하는 코시뮬레이션 워크플로를 지원함을 보여준다. 그 결과 물리적 시뮬레이션과 포토리얼리스틱 렌더링을 결합한 연구가 가능하다는 점을 시사한다.
MuJoCo 물리 시뮬레이터와 UE 장면을 실시간으로 동기화해 상호작용하는 코시뮬레이션 예시를 보여주는 이미지와 인셋 스냅샷이다.
주요 결과
SPEAR는 프로그래머블 기능성과 렌더-전달 성능에서 기존 UE 플러그인 대비 유의미한 개선을 보였다. 논문이 보고한 주요 수치는 SPEAR가 14K개 이상의 UE 함수를 파이썬에서 접근 가능하게 만들었고, 1920×1080 이미지를 NumPy 배열로 직접 전달할 때 최대 73 프레임/초 수준의 처리율을 달성한 점이다. 또한 Table 2의 비교에서 SPEAR는 UnrealCV+ 대비 통신 오버헤드 측면에서 9–21배 빠른 성능을 보고했다. 추가로 플랫폼 간 비교에서 SPEAR는 AirSim보다 12배 빠르고 CARLA보다 약 10% 빠른 최종 엔드투엔드 렌더 전달 시간을 기록한 실험 결과가 제시되었다. 성능은 비동기 통신, 공유 메모리 사용, 그리고 인위적 렌더링 지연(프레임 레이턴시) 설정에 따라 달라지며, 논문은 각 구성별 프레임 시간(ms)과 FPS를 표로 제공해 구체 수치를 확인할 수 있게 했다. 예제 응용에서 SPEAR는 다중 에이전트 제어, PCG 조작, 상세한 인간 얼굴의 동기화된 멀티뷰 렌더링, MuJoCo와의 코시뮬레이션, 자연어 기반 장면 편집 등 기존 UE 기반 시뮬레이터로는 구현하기 어려운 사례들을 성공적으로 실행했다.
기술 상세
전체 시스템은 Python 클라이언트와 UE 내부 C++ 서버 플러그인으로 구성된 클라이언트-서버 아키텍처로 구현되었다. 클라이언트는 nanobind 바인딩을 통해 강타입 C++ 엔트리포인트를 호출하며 서버는 rpclib 기반의 통신을 처리한다. 서버는 별도 스레드(server thread)에서 동작하며 begin_frame과 end_frame 작업용 큐를 유지해 게임 스레드와의 상호작용을 조율한다. 리플렉션 기반 노출을 통해 SPEAR는 14,485개의 UE 함수와 53,537개의 UE 프로퍼티를 자동으로 노출했고, 리플렉션으로 노출되지 않는 기능을 보완하기 위해 193개의 수작업 서버 엔트리포인트를 구현했다. 각 동기 엔트리포인트에 대해 템플릿 메타프로그래밍으로 비동기 변형을 자동 생성해 async.* API를 제공했다. 이 구조는 API 표면적을 크게 확장하면서도 구현 코드량은 27,193라인 수준으로 상대적으로 작게 유지했다. 대용량 데이터 경계에서는 SpFunction과 인터프로세스 공유 메모리를 결합해 NumPy 배열을 직접 매핑했다. SpFunction은 호출 시 이름이 붙은 데이터 배열, UE 객체 JSON, 문자열을 입출력 인자로 사용하도록 서명 제한을 두었고, 클라이언트-서버 경계에서 NumPy 배열을 효율적으로 매핑해 추가 복사 비용을 회피했다. 렌더러 측에서는 사용자가 설정한 렌더링 레이턴시(0~2 프레임 등)에 따라 처리량과 지연을 상호 조정할 수 있도록 설계되어 있으며, 실험에서 비동기 통신과 공유 메모리는 모두 성능 개선에 기여했다.
관련 Figure

이 그림은 SPEAR 카메라 센서가 깊이, 표면 노멀, 인스턴스 및 세맨틱 ID, 비확산(intrinsic) 분해 등 Hypersim 데이터셋과 유사한 여러 그라운드 트루스 모달리티를 동시 제공할 수 있음을 보여준다. 이러한 동기화된 모달리티는 합성 데이터 기반 학습과 정량 평가에서 중요한 관찰 정보를 제공한다.
Hypersim 스타일의 다양한 그라운드 트루스 모달리티(깊이, 노멀, 인스턴스/세맨틱 ID 등)와 포토리얼리스틱 뷰를 나란히 렌더한 예시이다.

이 Figure는 SPEAR의 카메라 센서가 고해상도 얼굴 모델을 멀티뷰로 동기화해 렌더하고, 각 뷰를 NumPy로 전달해 후처리·동일성 검증에 사용할 수 있음을 시각적으로 입증한다. 멀티뷰 동기화는 3D/4D 재구성과 얼굴 모델 학습에 중요한 데이터 생성 능력임이 명확히 드러난다.
MetaHumans 프로젝트에서 상세한 인간 얼굴의 동기화된 멀티뷰 렌더 결과를 보여주는 이미지 모음이다.
한계점
논문은 SPEAR의 설계상 일부 제약을 명시적으로 언급했다. 첫째, 트랜잭션 모델은 기본적으로 각 트랜잭션이 단일 프레임 내에서 실행되도록 보장하지만 연속 트랜잭션이 연속 프레임에서 실행된다는 보장은 제공하지 않는다. 둘째, 리플렉션으로 노출 가능한 타입에 제약이 있어 모든 C++ 타입을 자동으로 전달할 수 없고, 복잡한 타입은 수작업 엔트리포인트 또는 SpFunction으로 보완해야 한다. 셋째, 성능은 비동기 모드, 공유 메모리 사용, 렌더링 레이턴시 설정 등 운영 파라미터에 민감하며 실사용 시 적절한 구성 튜닝이 필요하다.
실무 활용
SPEAR는 연구용 데이터 생성과 제어 가능한 시뮬레이션 파이프라인을 요구하는 개발 환경에서 즉시 활용 가능하다. GitHub 저장소에 예제 애플리케이션과 플러그인 도구가 공개되어 있어 기존 UE 프로젝트에 플러그인 형태로 통합할 수 있다. 대용량 이미지 수집, 멀티뷰 동기화, 외부 물리 시뮬레이터와의 실시간 코시뮬레이션에 특히 적합하다.
- 대규모 포토리얼리스틱 합성 데이터셋 생성용 파이프라인으로 사용해 컴퓨터 비전 모델의 학습·검증 데이터를 자동 수집하는 용도
- 로봇 제어 연구에서 MuJoCo 같은 물리 시뮬레이터와 UE 렌더러를 동기화해 시각적 관찰과 물리적 시뮬레이션을 결합하는 코시뮬레이션
- 다중 뷰·다중 조명 조건에서 메타휴먼 등 고해상도 인물 데이터를 렌더해 3D/4D 재구성 또는 얼굴 모델 학습에 사용하는 용도
- 프로시저 기반 콘텐츠 생성(PCG)과 상호작용해 환경 변화를 실시간으로 스크립트 방식으로 탐색하는 에디터 내 디버깅 워크플로
코드 공개 여부: 공개
코드 저장소 보기키워드
용어 해설
- UE Reflection System
- — 언리얼 엔진이 런타임에 클래스, 함수, 속성 정보를 노출하는 메커니즘으로, 문자열 기반 조회로 C++ 객체를 동적으로 탐색·호출할 수 있다. 본문에서는 이 시스템을 통해 Python이 UE 내부 API를 런타임에 직접 호출하는 방식으로 확장성을 확보한 점이 핵심이다. 리플렉션된 타입 제약 때문에 전달 가능한 값의 형식이 제한되는 점이 구현·응용에서 중요한 고려사항이다.
- Transaction Programming Model
- — 사용자 Python 코드에서 begin_frame과 end_frame 컨텍스트로 UE 작업 그래프를 기술하고 해당 그래프를 하나의 프레임 내에서 결정론적으로 실행하도록 보장하는 프로그래밍 패턴이다. 이 모델은 비동기 작업을 큐에 넣고 게임 스레드가 프레임 시작/종료 시 큐를 소모하는 방식으로 동작하며, 동기/비동기 호출이 동일한 순서를 유지하도록 설계되었다. 이 방식은 에디터 내 인터랙티브 디버깅과 고유한 동기화 선택지를 제공한다.
- Interprocess Shared Memory
- — 프로세스 간에 데이터 복사 없이 버퍼를 공유하는 기법으로, SPEAR에서는 GPU에서 렌더된 이미지를 사용자의 NumPy 배열로 추가 복사 없이 전달하는 데 사용된다. 이 접근은 대용량 이미지 전송에서 통신 오버헤드를 제거해 프레임 전송 지연을 크게 줄인다. 구현상에는 메모리 할당/해제 인터페이스와 Python 바인딩이 포함되어 있다.
- SpFunction
- — UE 객체에 특수 자식 컴포넌트를 삽입해 런타임에 바인딩한 사용자 정의 함수로, NumPy 배열을 포함한 인수와 반환값을 효율적으로 교환하도록 설계되었다. SpFunction은 이름이 붙은 데이터 배열, UE 객체 JSON, 임의 문자열을 입출력 인터페이스로 사용하며 서버-클라이언트 경계에서 배열을 직접 매핑한다. 이 메커니즘은 대규모 데이터 교환을 위한 실용적 인터페이스 역할을 한다.
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.