k•KINDNICK김광진 · 포트폴리오
← 전체 작업
소프트웨어 / KINDNICK

Streamingle

구현
구현한 기능

모션캡처와 아바타·카메라·조명·소품을 연결하는 Unity 공연·방송 환경을 개발했습니다. 조작용 카메라 화면의 부하를 방송 출력과 나누고 영상 재생을 통합했습니다.

내가 한 일

Unity 런타임·웹 제어·카메라 프리뷰·영상 재생 통합 개발

  • 아바타·카메라·조명·소품의 Unity 기능과 웹 제어를 연결했습니다.
  • 카메라 조작 화면의 렌더링·전송 부하를 방송 출력과 분리했습니다.
  • 곡·카메라 편집 화면과 영상 파일 재생 기능을 개발했습니다.
2026.10 공개 · V04B moving starfield + kinetic type 영상의 YouTube 대표 이미지.
작업 사진

Unity 7 알파 · AI 배경·조명·영상 제작

Unity 7 알파 환경에서 배경·조명·영상 연출과 렌더링 품질을 확인한 작업입니다.

내가 한 일

Codex를 활용해 배경·조명·영상 제작 전 과정을 진행하고 결과 화면을 확인하며 수정했습니다.

관련 영상 보기 ↗
자료 범위

기존 공연장과 외부 에셋을 활용했습니다. 새 소품·배치·재질·제어 작업과 외부 자산의 원저작을 구분합니다.

Unity 오프라인 렌더와 디노이즈 결과
작업 사진

Unity 오프라인 렌더와 디노이즈 결과

내가 한 일

Unity의 오프라인 렌더 출력·디노이즈·결과 파일 관리 기능을 개발했습니다.

자료 범위

기존 OIDN 렌더 확인 산출물로 모션 기록·현재 리플레이 성공의 증명은 아닙니다.

디노이즈 적용 전의 같은 Unity 렌더
작업 사진

디노이즈 적용 전의 같은 Unity 렌더

내가 한 일

동일 장면의 원본·디노이즈 출력을 보존해 결과를 비교할 수 있도록 구성했습니다.

자료 범위

원본/최종 비교의 전 단계입니다.

기술과 문제 해결 과정구현 방법 · 문제 해결 사례 3개 · 시험 조건

작업 배경

여러 카메라의 조작 화면을 띄우거나 영상 파일을 여는 일이 실제 방송 화면의 렌더링과 입력 처리를 막지 않도록 구성해야 했습니다.

구현한 내용

  1. 01

    카메라·아바타·배경·조명 컨트롤러를 공통 레지스트리에 등록하고 웹 명령의 성공·실패를 같은 경로에서 처리했습니다.

  2. 02

    PROGRAM 모니터는 이미 완성된 방송 출력 텍스처를 재사용하고, 오프에어 PREVIEW와 카메라 목록에는 별도 렌더링·전송 예산을 적용했습니다.

  3. 03

    GPU 읽기와 JPEG 인코딩 사이에 상한이 있는 작업 큐를 두고, 카메라별 최신 완료 영상과 세대·순번을 관리했습니다.

  4. 04

    곡·미디어·셋리스트와 편집 정보를 IndexedDB에 저장하는 웹 시퀀서를 기존 카메라 서버에 연결했습니다.

  5. 05

    네이티브 FFmpeg 워커의 영상 프레임을 절대 PTS로 선택하고, Unity에 업로드한 뒤 슬롯을 반납하도록 영상 재생 수명을 관리했습니다.

UnityC#URPWebSocketAsyncGPUReadbackFFmpegTimeline
문제 해결

어떤 문제를 다뤘는지

01

방송 화면과 카메라 프리뷰의 렌더링 부하 분리

문제
프리뷰도 방송용 Deferred 렌더러와 추가 패스를 사용해, 구도 확인 화면에 방송과 같은 비용이 들었습니다.
처리 방법
프리뷰 카메라에만 경량 Forward 렌더러를 적용하고 그림자·후처리·부가 패스를 줄였습니다. PROGRAM은 기존 최종 출력 텍스처를 읽고 방송 카메라 설정은 유지했습니다.
결과·범위
2026-10-15 기록의 1280×720 정적 Editor 비교에서 CPU 렌더 요청 중앙값이 2.634ms에서 0.885ms로 줄었습니다. 워밍업 뒤 각 20회 측정한 결과이며 전체 방송 FPS 측정은 아닙니다.
02

늦게 끝난 프리뷰 작업이 새 화면을 덮는 문제 처리

문제
GPU 콜백과 인코딩이 순서대로 끝나지 않고, 카메라 재구성 뒤 이전 영상 작업이 도착할 수 있습니다.
처리 방법
프레임 작업에 세대와 순번을 붙이고, 같은 카메라의 대기 영상은 최신 완료 프레임으로 교체했습니다. 큐 용량과 버퍼 재사용을 제한하고 취소된 작업의 전송을 거부했습니다.
결과·범위
현재 코드에는 이전 세대·역순 작업을 거절하는 조건과 카메라별 최신 완료 영상 하나를 유지하는 처리가 있습니다. 새 장시간 방송 시험은 진행하지 않았습니다.
03

영상 준비가 늦어져도 재생 시각을 누적해서 밀지 않도록 구성

문제
Timeline 영상 재생에서 디코딩 준비와 Unity 프레임 진행을 같은 동기 작업으로 묶으면 장면이 멈추거나 시간 오차가 쌓일 수 있습니다.
처리 방법
FFmpeg 디코딩은 네이티브 워커에서 처리하고 Unity는 절대 목표 PTS를 전달합니다. 해당 프레임이 없으면 이전 화면을 유지하며, 얻은 프레임 슬롯은 업로드 성공 여부와 관계없이 finally에서 반납합니다.
결과·범위
절대 시각에 맞춘 선택과 슬롯 수명 처리를 구현했습니다. 기존 VideoPlayer·HapPlayer와 Timeline을 보존한 별도 재생 경로이며, 모든 영상의 무지연 재생을 보장하는 주장은 하지 않습니다.
구현과 검증 범위

구현

실행·측정 결과는 각 사례에 적힌 당시 기록과 조건을 따릅니다.

시험 조건과 적용 범위

프리뷰 경량화 수치는 정지한 Editor 장면의 제한된 비교입니다. 실제 방송 전체 FPS나 모든 네트워크·장치 조건의 성능으로 확대하지 않습니다.

활동
KINDNICK
작업 구분
구현