文档
工作原理
控制面与实时面分离、直连优先的连接策略,以及一帧画面的完整链路。
Nearshell 把”低延迟”当成第一目标来设计。这里讲清楚它为达到这个目标做了哪些取舍——不涉及具体实现代码,只讲设计。
控制面与实时面分离
Nearshell 的一个核心设计,是把有序、可靠的控制与低延迟、可丢弃的实时数据分成两条路:
- 控制面(可靠):终端开关、模式切换、采集偏好、系统操作等,走可靠有序的通道,保证不丢不乱序;
- 实时面(低延迟):视频、键鼠输入、光标位置、终端文本,追求最低延迟,允许丢弃过期事件。
两者要求几乎相反,混在一起必然互相拖累;分开之后,各自都能做到最好。
让延迟”感觉不到”
除了通道分离,Nearshell 还用了几项手段专门对抗往返延迟:
- 8ms 有界事件合并:发送端永远不积压过期的移动 / 滚动事件,同时保留小数滚动余量;
- 本地光标预测:iPhone 端在画面上本地预测并绘制光标,不必等 Mac 回传,指针因此跟手;
- 窗口切换不重连:在全屏与”跟随焦点窗口”之间切换时不重启媒体连接,无缝过渡。
直连优先,就近兜底
连接优先尝试点对点直连(P2P);只有当双方的网络无法直接打通时,才回退到经我们就近的 TURN 节点中转。无论走哪条路,内容都是端到端加密的——中转节点转发的只是密文。
诊断页会明确标记当前是 Direct 还是 TURN,你随时能看到自己走的是哪条路。
一帧画面的链路
ScreenCaptureKit → 编码(60fps · 最长边 1920 · 端到端加密)
│ │
Mac 采集 直连 / 就近 TURN
↓
iPhone 解码 → Metal 渲染
↓
叠加本地预测的光标
聚焦窗口模式
除了整屏采集,Nearshell 还支持只采集并操控当前焦点窗口:减少画面与带宽负担,也让你在手机小屏上更聚焦。切换时不重启媒体连接;无焦点时冻结最后一帧并暂停输入。