[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"
단순히 화면을 찍는 것을 넘어, 실시간 스트리밍을 위해 다음 문제들을 해결했습니다.
- Dirty Rect Tracking: 화면에서 변한 부분만 감지하여 인코딩 부하를 줄였습니다.
- Pointer Cache: 마우스 커서를 별도의 레이어로 처리하여 반응 속도를 극대화했습니다.
- SIMD 가속: 픽셀 데이터 처리(BGRA to YUV 변환 등) 시 CPU의 멀티미디어 확장 명령어를 사용하여 연산 속도를 높였습니다.
4. 시스템 아키텍트의 관점: 안정적인 리소스 관리
장시간 구동되어야 하는 원격 제어 특성상 **메모리 누수(Memory Leak)**는 치명적입니다.
- RAII 패턴 적용: C++ 레이어에서 리소스 해제를 엄격히 관리합니다.
- Memory Pooling: 빈번한 버퍼 할당을 피하기 위해 픽셀 버퍼를 재사용하여 가비지 컬렉터(GC)의 부하를 최소화했습니다.

GurupiaCapture Architecture