Unlag Neo: 최소 화면 캡처를 통한 MacBook Neo 커서 지연 문제 해결

Unlag Neo: 최소 화면 캡처를 통한 MacBook Neo 커서 지연 문제 해결

해결책: 커서 합성 강제 적용

Unlag Neo는 macOS WindowServer가 마우스 커서를 하드웨어 오버레이가 아닌 소프트웨어 오버레이로 처리하도록 강제함으로써 MacBook Neo 기기의 커서 지연을 제거하도록 설계된 유틸리티입니다. 이 도구는 10초마다 화면의 단일 픽셀을 기록하여 시스템이 지연이 발생하는 하드웨어 커서 상태로 되돌아가는 것을 방지합니다.

"수정" 방식의 작동 원리

이 유틸리티는 ScreenCaptureKit 프레임워크를 활용하는 최소한의 앱 번들을 생성하기 위해 Swift 기반의 접근 방식을 사용합니다. 핵심 메커니즘은 다음과 같습니다:

  1. 최소 캡처 영역: 정확히 1x1 픽셀의 캡처 소스 사각형을 구성합니다.
  2. 낮은 빈도: 10초마다 한 프레임을 캡처하도록 minimumFrameInterval을 설정합니다.
  3. 커서 포함: showsCursor = true를 설정함으로써, 유틸리티는 시스템이 캡처 프로세스에 커서를 포함하도록 강제합니다.

이러한 활성(비록 매우 작지만) 화면 캡처 스트림을 유지함으로써, 시스템은 WindowServer를 통해 커서를 합성하도록 강제됩니다. 이는 MacBook Neo 하드웨어에서 지연의 원인으로 보이는 하드웨어 커서 로직을 우회합니다.

커서 지연에 대한 기술적 분석

기술적 논의에 따르면, 지연은 하드웨어 커서와 소프트웨어 커서 사이의 전환 과정에서 발생할 가능성이 높습니다.

하드웨어 vs. 소프트웨어 커서

  • 하드웨어 커서: 레지스터 업데이트를 통해 위치를 지정하고 하드웨어에 의해 자동으로 그려지는 작은 비트맵입니다. 이는 일반적으로 가장 효율적인 방법입니다.
  • 소프트웨어 커서: 그래픽 스택에 의해 수동으로 그려집니다. 이는 시스템이 배경 데이터를 저장하고, 커서를 그린 후, 커서가 이동할 때 데이터를 복구해야 함을 의미합니다.

한 이론은 하드웨어에서 소프트웨어 커서 렌더링으로 전환되는 동안 GPU 명령 큐를 비워야(flush) 할 때 지연이 발생한다는 것입니다. 한 기여자가 다음과 같이 언급했습니다:

"GPU는 CPU가 쓰는 큐로부터 명령을 전달받습니다... 소프트웨어 커서로 전환할 때 명령 큐를 비워야 합니다... 왜냐하면 GPU가 큐에 쌓인 작업을 그리는 것을 마쳐야 하기 때문입니다."

구현 세부 사항

Unlag Neo 도구는 Swift 프로그램을 즉석에서 독립적인 .app 번들로 컴파일하는 bash 스크립트로 배포됩니다.

주요 시스템 권한

작동을 위해 이 애플리케이션은 두 가지 특정 macOS 권한을 필요로 합니다:

  • Screen Recording: ScreenCaptureKit이 디스플레이 데이터를 액세스하는 데 필요합니다.
  • Accessibility: 창의 상태를 모니터링하여(via AXObserver) 사용자가 전체 화면 모드일 때 캡처를 일시 중지해야 하는지 결정하는 데 사용됩니다.

최적화 및 전력 관리

불필요한 리소스 소비를를 피하기 위해, 유틸리티에는 "전체 화면 시 일시 중지" 기능이 포함되어 있습니다. 이 도구는 Accessibility API를 사용하여 창이 디스플레이를 가득 채우는지 감지하여, 사용자가 전체 화면 애플리케이션을 사용할 때 1x1 캡처 스트림을 중지함으로써 잠재적으로 오버헤드나 고성능 앱과의 충돌을 줄일 수 있습니다.

커뮤니티 관점 및 대안

이 유틸리티가 즉각적인 문제를 해결하지만, 이 "수정"의 성격에 관한 논쟁이 불러일으켜졌습니다.

접근 방식에 대한 비판

일부 개발자들은 이 방식이 WindowServer로 하여금 하드웨어로 처리되어야 할 합성을 수행하도록 강제하기 때문에 차선책(suboptimal workaround)이라 보고 있습니다.

"이것이 하는 일은 WindowServer가 커서를 하드웨어 오버레이로 처리하는 대신 커서를 합성하도록 강제하는 것입니다. 만약 이것이 도움이 된다면 OP의 문제가 템포러리하게 매우 심각한 상황임이 틀림없지만... 으윽."

대안적인 해결책

또 다른 커뮤니티 구성원은 시스템 설정에서 마우스 커서 크기를 변경하는 것이 그래픽 스택에서 커서가 처리되는 방식을 변경하도록 강제하여 유사한 GPU 관련 렌더링 이슈를를 해결할 수 있다고 제안했습니다.

개발자 통찰

소프트웨어 엔지니어링 관점에서, 이 프로젝트는 전체 Xcode 프로젝트 환경 없이 Swift와 .plist 파일을 사용하여 최소한의 macOS 앱 번들을 만드는 방법을 보여주는 예시로 기능합니다.

Sources