[GurupiaTools]

GurupiaCapture 개발기 (C# & C++)

gurupia 2025. 12. 31. 17:04

0.1ms를 다투는 화면 캡처: GurupiaCapture 개발기 (C# & C++)

1. 원격 제어의 심장, '캡처 엔진'에 집중하다

원격 제어 프로그램의 성능을 결정짓는 가장 큰 병목은 네트워크가 아닌 **'화면 캡처와 인코딩'**입니다. GurupiaCapture는 일반적인 GDI 방식의 한계를 넘어, 윈도우 OS의 성능을 극한까지 끌어올리기 위해 설계되었습니다.

2. 핵심 기술 스택: 왜 C#과 C++의 조합인가?

이 프로젝트는 C#의 생산성C++의 로우레벨 제어력을 결합한 하이브리드 아키텍처를 채택했습니다.

  • Win32 / Desktop Duplication API (DDA): DirectX와 직접 통신하여 GPU 메모리에 있는 화면 데이터를 가장 빠르게 가져옵니다.
  • Zero-copy 아키텍처: CPU와 GPU 사이의 불필요한 데이터 복사를 최소화하여 지연 시간(Latency)을 획기적으로 줄였습니다.
  • P/Invoke & C++/CLI: 고성능이 필요한 캡처 로직은 C++로, 비즈니스 로직과 UI 흐름은 C#으로 관리하여 안정성을 높였습니다.

3. 기술적 도전과 해결책: "끊김 없는 60FPS"

단순히 화면을 찍는 것을 넘어, 실시간 스트리밍을 위해 다음 문제들을 해결했습니다.

  1. Dirty Rect Tracking: 화면에서 변한 부분만 감지하여 인코딩 부하를 줄였습니다.
  2. Pointer Cache: 마우스 커서를 별도의 레이어로 처리하여 반응 속도를 극대화했습니다.
  3. SIMD 가속: 픽셀 데이터 처리(BGRA to YUV 변환 등) 시 CPU의 멀티미디어 확장 명령어를 사용하여 연산 속도를 높였습니다.

4. 시스템 아키텍트의 관점: 안정적인 리소스 관리

장시간 구동되어야 하는 원격 제어 특성상 **메모리 누수(Memory Leak)**는 치명적입니다.

  • RAII 패턴 적용: C++ 레이어에서 리소스 해제를 엄격히 관리합니다.
  • Memory Pooling: 빈번한 버퍼 할당을 피하기 위해 픽셀 버퍼를 재사용하여 가비지 컬렉터(GC)의 부하를 최소화했습니다.

GurupiaCapture Architecture