OBS Studio가 새로운 렌더러를 도입: OBS가 Metal을 채택한 과정

1 month ago 11

  • macOS용 OBS Studio 32.0.0부터 Apple Metal 기반 렌더러 백엔드가 실험적으로 추가되어, 기존 OpenGL 대비 성능과 효율 향상을 목표로 함
  • Metal은 낮은 오버헤드와 현대 GPU 구조 반영을 위해 설계된 API로, OBS는 이를 지원하기 위해 GPU 상호작용 방식을 근본적으로 수정함
  • OBS의 기존 렌더러가 Direct3D 중심 구조에 맞춰져 있었기 때문에, Metal 백엔드는 셰이더 변환과 리소스 관리 등에서 대규모 호환 작업을 수행함
  • 특히 HLSL 셰이더를 MSL로 실시간 변환하고, Direct3D의 map/unmap 동작을 Metal 내부에서 시뮬레이션하는 복잡한 구현이 포함됨
  • Metal 백엔드는 아직 “실험적” 단계이지만, OpenGL보다 빠른 성능과 Swift 기반의 안전한 코드 구조, EDR 프리뷰 지원 등으로 macOS 개발 환경 개선에 중요한 전환점이 됨

Metal 렌더러 도입 개요

  • OBS Studio 32.0.0부터 macOS에서 Metal 그래픽스 API 기반 렌더러를 실험적으로 제공
    • 기존 OpenGL 백엔드의 대안으로, 성능 및 효율성 향상을 목표로 함
    • Metal은 GPU와의 상호작용 방식을 근본적으로 바꾸는 현대적 API로, OBS는 이에 맞춰 내부 구조를 조정함
  • Metal 백엔드는 “Experimental” 로 표시되어 있으며, 일부 알려진 문제와 제한이 존재
    • OpenGL 렌더러는 여전히 기본값으로 유지되며, 사용자는 Metal 버전을 직접 시험 가능
    • Metal 경험이 있는 개발자의 피드백 및 Pull Request 참여를 권장

Metal의 배경과 설계 철학

  • Apple은 2014년 iPhone용으로 Metal을 처음 공개하고, 2015년 Mac으로 확장
    • 당시 Metal은 Intel, AMD, NVIDIA GPU 모두를 지원한 최초의 차세대 그래픽스 API 중 하나
  • Metal은 AMD의 Mantle과 기존 OpenGL·Direct3D의 개념을 결합하되, 레거시 요소를 제거하고 새로 설계됨
    • Objective-C와 Swift 기반 API로, iOS·macOS 개발자에게 친숙한 구조 제공
    • Xcode 내에서 셰이더 디버깅 및 GPU 분석 기능을 통합 지원

API 설계 차이와 OBS 렌더러의 적응

  • 기존 OpenGL·Direct3D는 리소스 관리와 동기화를 API가 자동 처리했으나,
    Metal 등 현대 API는 개발자가 직접 관리해야 함
  • 새로운 API는 GPU를 병렬 명령 큐 기반 처리 장치로 다루며, 파이프라인 상태를 불변 객체로 관리
  • OBS의 기존 렌더러는 Direct3D 방식에 맞춰 설계되어 있어,
    Metal 지원을 위해 백엔드 수준에서 호환 계층을 구현

OBS 렌더러의 구조와 Metal 호환 문제

  • OBS는 플랫폼별로 Direct3D(Windows) , OpenGL(Linux/macOS) 백엔드를 사용
    • 렌더러 코어는 API 비종속적이지만, 일부 Direct3D 중심 가정이 존재
  • 주요 제약 사항
    • 셰이더가 HLSL 기반으로 작성되어, 실행 시 변환 필요
    • 글로벌 변수 사용, 순차적 실행 가정, Direct3D식 텍스처 처리
    • 프리뷰 렌더링이 DXGI의 ‘discard model’에 의존

셰이더 변환(Transpiling Shaders)

  • OBS의 효과 파일은 HLSL로 작성되어 있으며, 각 API에 맞게 변환됨
    • Metal 지원을 위해 HLSL → MSL 변환기가 추가됨
  • 주요 차이점
    • MSL은 입출력 구조체를 분리해야 하며, 글로벌 변수 미지원
    • 모든 uniform 데이터는 GPU 버퍼로 전달되어 함수 인자로 명시적 전달 필요
    • 함수 호출 시 타입 일치 및 시그니처 검증이 엄격함
  • 변환기는 런타임에 셰이더 코드를 부분적으로 재작성하여 MSL 규칙에 맞춤
    • 예시로, HLSL의 uniform 변수를 MSL의 constant buffer로 변환
    • int3 → uint2 + uint 변환 등 타입 변환 로직 자동 삽입

Direct3D 동작 시뮬레이션

  • OBS 렌더러는 Direct3D의 map/unmap 동작을 전제로 설계됨
    • Metal은 이러한 자동 동기화를 제공하지 않으므로, 백엔드에서 직접 구현
  • Metal 백엔드의 처리 방식
    • 쓰기 시 GPU 버퍼를 생성하고 CPU 메모리와 직접 공유
    • unmap 시 GPU 블릿(blit) 명령을 예약해 텍스처로 복사
    • 읽기 시 GPU 버퍼를 공유하되, 명시적 동기화로 충돌 방지
  • 결과적으로 Direct3D의 리소스 추적 및 동기화 기능을 Metal 내부에서 재현

프리뷰 렌더링 문제와 임시 해결

  • macOS의 Metal Layer는 DXGI와 달리 앱이 임의로 프레임을 표시할 수 없음
    • 시스템이 ProMotion 및 저전력 모드에 따라 프레임 속도를 제어
  • OBS는 자체 렌더 루프와 macOS의 표시 주기가 불일치하여 프리뷰 지연 발생
  • 임시 해결책
    • OBS가 먼저 가상 텍스처에 렌더링하고, 별도 스레드가 이를 화면 Surface로 복사
    • 이 과정에서 GPU 동기화 필요, 프레임 불일치 가능성 존재
  • macOS 14 이후에는 윈도우별 독립 타이머로 인해 추가 과제가 예상됨

현대 그래픽스 API의 숨은 비용

  • Metal 백엔드 개발은 수개월의 연구와 반복 설계를 거침
    • OpenGL→Vulkan, D3D11→D3D12 전환 시 성능 저하가 발생하는 이유를 실증
  • 현대 API는 드라이버가 하던 일을 애플리케이션이 직접 수행해야 함
    • GPU 동작 원리와 명령 의존성에 대한 깊은 이해 필요
  • Metal 백엔드는 일부 오버헤드를 재도입했지만, 다음과 같은 이점을 제공
    • OpenGL과 동등하거나 더 나은 성능
    • 셰이더·텍스처 디버깅 등 강력한 분석 기능
    • Swift 기반의 안전한 코드 구조
    • EDR 프리뷰 지원으로 고품질 영상 처리 가능
  • Xcode 통합 분석 기능을 통해 macOS OBS 유지보수 효율이 향상되며,
    향후 Metal을 기본 렌더러로 전환하기 위한 개발자 피드백을 요청함

Read Entire Article