작업 배경
입력 종류마다 시간과 데이터 형식이 달랐고, 파일이 정상적으로 열리거나 클라이언트가 연결됐다는 표시만으로 실제 재생과 저장 완료를 판단할 수 없었습니다.
구현한 내용
- 01
수신 스레드는 큐 적재와 중계에 집중시키고, 압축·디스크 기록은 C++ writer로 분리했습니다.
- 02
MMRP 세션 시간을 기준으로 모션·표정·음향과 씬 상태·영상을 기록하고, 수신·쓰기·디스크 flush 완료를 구분했습니다.
- 03
실제 MRX의 표정 탐색에서 블록 경계 직전의 가까운 샘플을 놓치는 문제를 재현하고, 스트림별 시간 범위와 제한된 블록 캐시로 고쳤습니다.
- 04
같은 PC에서 여러 NatNet 클라이언트가 연결될 때 실제 수신 소켓의 IP와 포트를 구분하고, 재생 중 반복 설정도 코어에 즉시 전달하도록 수정했습니다.
- 05
손상 quant가 정상 raw를 가리는 경우, 새 트랙이 편집 과정에서 사라지는 경우와 중단된 파일·보존 journal의 복구를 별도로 다뤘습니다.
C++PythonPySide6NatNetMRX탐색·복구Unity 연동
01
파일은 정상인데 탐색한 표정이 달라지는 문제
- 문제
- 공통 블록의 최대 시각만으로 탐색을 시작하면 블록 경계 직전 요청에서 이전 블록의 더 가까운 표정 샘플을 놓쳤습니다. 요청 순서에 따라 끝점 결과도 달라졌습니다.
- 처리 방법
- 실제 파일에서 경계 오류를 재현한 뒤 표정 스트림별 블록 시간 범위와 schema 위치를 색인했습니다. 후보 블록을 시간 거리 하한으로 정렬하고, 같은 거리에서는 앞선 샘플을 고르도록 했습니다. 디코딩 캐시는 최대 4개 블록으로 제한하고 손상 quant는 유효 raw로 되돌렸습니다. 편집의 nearest 정책과 오프라인 프리뷰의 직전 샘플 유지 정책은 분리했습니다.
- 결과·범위
- 2026년 10월 15일 보고서는 실제 파일의 indexed 샘플 대조 1,062건과 stepper 대조 32건에서 불일치 0을 기록합니다. warm cache의 탐색 비용은 별도 관측치이며 GUI 전체 프레임 시간이나 라이브 성능 보장으로 쓰지 않습니다.
02
연결 표시와 실제 수신을 구분하기
- 문제
- Unity가 임시 포트로 NatNet CONNECT를 보내도 플레이어가 고정 data port로 프레임을 보내 연결 응답만 있고 실제 모션 수신은 없는 상태가 가능했습니다. 재생 중 반복 해제도 시작 때의 코어 값이 남아 반영되지 않았습니다.
- 처리 방법
- 유니캐스트 등록을 IP 단위에서 IP·포트 단위로 바꾸고 명시 CONNECT와 구형 discovery의 목적지 정책을 나눴습니다. KEEPALIVE가 기존 목적지를 덮지 않게 하고 단일 endpoint만 해제했습니다. 반복 옵션은 실행 중 set_loop로 전달하고, GUI 상태 외에 실제 본 Transform·blendshape·UDP 수신과 오디오 callback을 확인했습니다.
- 결과·범위
- 같은 PC의 기존 약 307초 테이크에서 GUI 재생·정지·앞뒤 탐색·EOF를 확인한 기록이 있습니다. 최종 전체 재생의 표정 UDP 수신 수는 원본 73,786개와 같았고 오디오 출력 콜백 underflow·오류는 관측되지 않았습니다. 패킷별 hash, 실제 청음, LAN·물리 입력 장치 검증은 이 결과에 포함되지 않습니다.
03
수신 성공과 파일 저장 완료를 구분하기
- 문제
- 이벤트를 받았다는 응답이나 정상 footer만으로는 저장 장치에 반영됐는지, 입력 종료 직전의 데이터까지 완결됐는지 알 수 없었습니다.
- 처리 방법
- 상태·영상 요청에 ID와 sequence를 부여하고 동일 writer의 압축 블록 쓰기·flush·운영체제 FlushFileBuffers 성공 뒤에만 durable을 반환하게 했습니다. 미해결 영상 입력·EOS·fragment gap을 incomplete로 남기고, 보존 journal과 spool을 원본 세션에 중복 없이 병합하는 복구 경로를 마련했습니다.
- 결과·범위
- 네이티브 writer와 복구·편집 코드, 로컬 시험 기록을 확인했습니다. 상태 패널의 durable 카운터는 확인된 개별 저장량이며 전체 테이크의 완결성은 별도로 판단합니다. Unity가 아직 보내지 않은 semantic tail까지 보존됐다고 주장하지 않습니다.
구현과 검증 범위모션·표정·음향 MRX 기록/재생과 상태·영상 확장 구현. legacy input-only 테이크와 현대 씬 기록 기능을 구분. producer의 미전송 semantic tail과 현장 종료 barrier는 별도 확인 필요.
실행·측정 결과는 각 사례에 적힌 당시 기록과 조건을 따릅니다. 시험 조건과 적용 범위
2026년 10월 기록에는 기존 약 307초 입력 테이크의 실제 GUI 조작, Unity 55본 리그·52채널 표정 변화와 출력 콜백 확인이 있습니다. 같은 PC 재생이며 새 REC부터의 현장 녹화나 두 PC·실장비 동시 공연 운용을 검증한 결과로 확대하지 않습니다. 씬 상태가 없는 구형 파일에서 씬을 자동 복원한 결과도 아닙니다.
- 활동
- Mingle
- 작업 구분
- 구현