Skip to content

按键映射与群控高级应用

云手机不仅支持鼠标点击,在重度操控场景下,键盘按键映射(Keymapping)和高帧率群控同步是直接影响商业应用落地的重要技术。


⌨️ 可视化按键映射(Keymapping)系统

在 Web UI V2 版本中,我们集成了强大的可视化改键编辑器。用户只需按下物理键盘按键,即可将其绑定到云手机屏幕的特定虚拟坐标上。

1. 按键类型与实现机制

按键映射引擎目前支持以下四大核心按键类型的定义与向量换算:

  • Tap (点击型)
    • 将单个物理键盘按键(例如 Space)绑定到屏幕的固定坐标(X, Y)。
    • 按键按下 ➔ 发送 ACTION_DOWN
    • 按键抬起 ➔ 发送 ACTION_UP
  • Joystick (摇杆型 - 轮盘移动)
    • 用于游戏中的虚拟跑图轮盘(通常绑定 WASD 四个键)。
    • 编辑器记录摇杆中心坐标(CenterX, CenterY)及触控偏移半径(Radius)。
    • 引擎检测 W/A/S/D 的组合状态,动态计算 8 轴运动的单位方向向量,并自动在中心坐标附近快速滑移,实现云端操控丝滑跑步: $$\vec{V} = (\cos\theta, \sin\theta)$$
  • Swipe (线性滑移型 - 预设轨迹)
    • 支持绑定一条自定义起点至终点的线性滑动轨迹(如映射 F 键执行向右滑屏)。
    • 包含 Duration 变量(滑移时长),用于平滑模拟物理滑动手势。
  • Command (系统命令直连型)
    • 直接与系统物理指令连接。例如:将物理键盘的 Esc 键直接转化为 Android 物理的 BACK 按键,无需模拟屏幕点击。

📄 按键配置文件 JSON 格式规范

按键映射方案以 JSON 配置文件的形式管理,保存在浏览器的 localStorage 中。下面是一个标准的配置文件数据样本:

json
{
  "profileName": "刺激战场默认键位",
  "mappings": [
    {
      "key": "KeyF",
      "type": "tap",
      "x": 860,
      "y": 420,
      "label": "捡装备"
    },
    {
      "key": "KeyW",
      "type": "joystick",
      "keys": {
        "up": "KeyW",
        "left": "KeyA",
        "down": "KeyS",
        "right": "KeyD"
      },
      "x": 200,
      "y": 800,
      "radius": 80,
      "label": "移动轮盘"
    }
  ]
}

👥 高帧率群控大盘机制

群控大盘支持管理员同时管理几十甚至上百台在线虚机。我们在前端和通信层引入了精密的流优化:

1. 批量同步逻辑 (主从控制)

  • 主控节点定义:用户从大盘矩阵中选定一台主设备。
  • 事件抓取与广播:主控画面捕获用户的全部鼠标点击、拖拽以及改键行为。
  • 事件通道并行分发:主设备画面产生的输入事件,不仅下发给自己的 input-channel,还会同步克隆、并广播下发到所有从设备的 WebRTC input-channel 数据通道中,实现上百台手机毫秒级的动作完全一致性。

2. 积压熔断与降帧预览机制

当大盘同时加载上百台虚机时,多路高码率 WebRTC 视频流会瞬间吃满开发机的 CPU 解码与显卡渲染,引起浏览器奔溃。

  • 快照静默监视:非控制态下的从设备,在闲置状态下默认关闭 WebRTC 视频流。
  • 二进制高效上报:闲置设备每隔 10s 通过 Agent 底层的高效 NN 处理,上报 30KB 大小的 JPEG 快照,维持大盘仪表盘矩阵的静默监视。
  • 按需激活与视频降级:只有在用户选中多开同步或进入详情控制时,才按需热启动 WebRTC 视频流,并自动协商将视频帧率(-max-fps)和码率(-bitrate)降级,确保大盘整体流畅稳定。

基于开源协议分发。本文档持续同步 AOSP 与 scrcpy 优化规范。