Unlag Neo: 最小限のスクリーンキャプチャによる MacBook Neo のカーソル遅延の解消

Unlag Neo: 最小限のスクリーンキャプチャによる MacBook Neo のカーソル遅延の解消

解決策:カーソル合成の強制

Unlag Neo は、macOS の WindowServer にマウスカーソルをハードウェアオーバーレイではなくソフトウェアオーバーレイとして扱うよう強制することで、MacBook Neo デバイス上のカーソル遅延を解消するために設計されたユーティリティです。これは、10秒ごとに画面の 1 ピクセルを記録することで、システムが遅延の発生するハードウェアカーソル状態に戻るのを防ぎます。

「修正」の仕組み

このユーティリティは、Swift ベースのアプローチを使用して、ScreenCaptureKit フレームワークを活用する最小限のアプリバンドルを作成します。コアとなるメカニズムは以下の通りです:

  1. 最小限のキャプチャ領域: 正確に 1x1 ピクセルのキャプチャソース矩形を設定します。
  2. 低頻度: 10秒ごとに 1 フレームをキャプチャするように minimumFrameInterval を設定します。
  3. カーソルの含入: showsCursor = true を設定することで、ユーティリティはシステムにキャプチャプロセスにカーソルを含めるよう強制します。

このアクティブな(たとえ非常に小さいとはいえ)スクリーンキャプチャストリームを維持することで、システムは WindowServer を介してカーソルを合成することを強制されます。これにより、MacBook Neo ハードウェアにおける遅延の原因と思われるハードウェアカーソルロジックをバイパスします。

カーソル遅延の技術的分析

技術的な議論では、遅延はハードウェアカーソルとソフトウェアカーソルの間の遷移によって引き起こされている可能性が高いと示唆されています。

ハードウェア vs ソフトウェア カーソル

  • ハードウェア カーソル: レジスタを更新することで配置される小さなビットマップで、ハードウェアによって自動的に描画されます。これは通常、最も効率的な方法です。
  • ソフトウェア カーソル: グラフィックススタックによって手動で描画されます。これには、システムが背景データを保存し、カーソルを描画し、カーソルが移動する際にデータを復元する必要があります。

一つの理論は、ハードウェアからソフトウェアカーソルレンダリングへの遷移中に、システムが GPU コマンドキューのフラッシュを待機することによって遅延が発生するというものです。ある貢献者が次のように述べています:

"GPU は、CPU が書き込むキューからコマンドを受け取ります... ソフトウェアカーソルに切り替える際、コマンドキューのフラッシュは必要です... なぜなら、GPU がキューに入れた描画を完了させるのを待つ必要があるからです。"

実装の詳細

Unlag Neo ツールは、Swift プログラムをスタンドアロンの .app バンドルにその場でコンパイルする bash スクリプトとして配布されています。

主要なシステム権限

動作するために、このアプリケーションは 2 つの特定の macOS 権限を必要とします:

  • Screen Recording: ScreenCaptureKit がディスプレイ・データをにアクセスするために必要です。
  • Accessibility: ウィンドウの状態を監視(AXObserver を介して)して、アプリがフルスクリーンモード中にキャプチャを一時停止すべきかどうかを判断するために使用されます。

最適化と電力管理

不要なリソース消費を避けるため、このユーティリティには「フルスクリーンでの一時停止」機能が含まれています。Accessibility API を使用してウィンドウがディスプレイを占有しているかどうかを検出し、ユーザーがフルスクリーンアプリケーションを使用しているときに 1x1 キャプチャストリームを停止させることで、オーバーヘッドや高パフォーマンス・アプリとの競合を軽減できる可能性があります。

コミュニティの視点と代替案

このユーティリティは当面の問題を解決しますが、「修正」の性質に関する議論を呼んでいます。

アプローチへの批判

一部の開発者は、これを最適ではないワークアラウンド(回避策)と見なしています。なぜなら、WindowServer が通常はハードウェアで処理されるはずの合成を行うように強制してしまうからです。

"これがしていることは、WindowServer にカーソルをハードウェアオーバーレイとして扱うのではなく、カーソルを合成させることです。投稿者の問題がこれほど深刻であれば、これが役立つのでしょうが、... うーん。"

代替的な回避策

別のコミュニティメンバーは、システム設定でマウスカーソルのサイズを変更することが、グラフィックススタックによるカーソルの扱われ方の変更を強制することで、同様の GPU 関連のレンダリング問題を解決できる場合があることを示唆しています。

開発者への洞察

ソフトウェアエンジニアリングの観点からは、このプロジェクトは、Xcode プロジェクト環境を必要とせずに、Swift と .plist ファイルを使用して最小限の macOS アプリバンドルを作成する方法のデデモンストレーションとして機能しています。

Sources