You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化屏幕共享鼠标移动性能,寻求媲美AnyDesk/TeamViewer的方案

如何优化远程控制应用的鼠标移动响应速度,媲美AnyDesk/TeamViewer?

我正在用Electron、React、NodeJS(信令服务器)和RobotJS开发一款类似AnyDesk或TeamViewer的屏幕共享应用。目前已完成以下优化,但鼠标移动响应速度仍不及AnyDesk或TeamViewer:

  • 从Socket.io(WebSocket)切换到WebRTC数据通道传输鼠标事件,提升了传输速度
  • 给连续的鼠标移动事件添加防抖机制,优化连续事件传输效率

测试发现robot.moveMouse()函数本身耗时约10ms,想了解还有哪些方法可以缩小与专业远程控制工具的差距。

控制端代码

const handleMouseMove = (e: React.MouseEvent < HTMLDivElement > ) => {
  if (connectionState === "connected" && videoRef.current && videoRects) {
    const relativeX = (e.clientX - videoRects.left) / videoRects.width;
    const relativeY = (e.clientY - videoRects.top) / videoRects.height;

    if (dataChannel.current) {
      const message = JSON.stringify({
        type: 'mouse-move',
        payload: {
          x: relativeX,
          y: relativeY,
        }
      });

      if (debounceTimeout.current) {
        clearTimeout(debounceTimeout.current);
      }

      debounceTimeout.current = setTimeout(() => {
        dataChannel.current!.send(message);
        debounceTimeout.current = null;
      }, 14); // Adjust the delay as needed
    }
  }
};

被控端代码

ipcMain.on('mouse-move', (_, data) => {
  try {
    console.time("Mouse move")
    const {
      x,
      y
    } = data;

    const adjustedX = Math.round(x * screenWidth) + nativeOrigin.x;
    const adjustedY = Math.round(y * screenHeight) + nativeOrigin.y;

    robot.moveMouse(adjustedX, adjustedY);
    console.timeEnd("Mouse move")
  } catch (e) {
    console.log("Mouse Move error: ", e);
  }
});

优化建议

  • 替换防抖为节流+事件采样:防抖会引入固定延迟,改用节流(比如每8-10ms发送一次最新坐标),或者直接丢弃中间冗余事件,只发送最新的鼠标位置,既减少传输量又降低延迟。
  • 减少序列化开销:放弃JSON.stringify,改用二进制格式传输坐标。比如将relativeX和relativeY打包成Float32Array,再转成ArrayBuffer发送;被控端直接读取二进制数据计算坐标,比JSON解析快数倍。
  • 替换RobotJS为原生系统调用:RobotJS的跨平台封装会带来性能损耗,直接调用系统原生接口:
    • Windows:调用user32.dll的SetCursorPos
    • macOS:使用CoreGraphics的CGDisplayMoveCursorToPoint
    • Linux:调用Xlib的XWarpPointer
      原生调用能把鼠标移动的耗时压缩到更低。
  • 消除IPC通信开销:当前被控端通过ipcMain转发事件,可将鼠标事件处理逻辑直接放在主进程执行,避免IPC的来回通信耗时。
  • 优化WebRTC数据通道配置:初始化数据通道时设置ordered: false、maxRetransmits: 0,允许鼠标事件丢包,避免旧事件重传阻塞新事件,提升实时性。
  • 跳过冗余事件处理:如果被控端收到多个未处理的鼠标移动事件,直接处理最新的那个,忽略中间的事件——用户只关心最终的鼠标位置,中间过程无意义。

内容的提问来源于stack exchange,提问作者Dipankar Prasad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:13:17