ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Sunshine 虚拟手柄实战指南:三步搞定无手柄的 PC 游戏串流

Sunshine 虚拟手柄实战指南:三步搞定无手柄的 PC 游戏串流

Sunshine 虚拟手柄实战指南:三步搞定无手柄的 PC 游戏串流

【免费下载链接】SunshineSelf-hosted game stream host for Moonlight.项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine

Sunshine 是一个自托管游戏串流服务器,通常与 Moonlight 客户端配合使用。它的虚拟手柄功能可以让没有实体控制器的平板或手机被系统识别为标准手柄:Moonlight 客户端发来的触摸、陀螺仪信号会被转换成 Windows 或 Linux 能识别的手柄信号,游戏侧的表现等价于接入了一个物理控制器。下面按操作顺序记录最小配置、三个高频坑以及平台差异。

让虚拟手柄跑起来的三个步骤

第一步:确认并安装 ViGEmBus 驱动

Windows 上的虚拟手柄依赖 ViGEmBus 驱动,版本要求 1.17 或更高。不必自己去官网翻安装包:打开 Sunshine 的 Web 界面,进入“故障排除”页面,会直接显示驱动是否缺失,页面上的按钮可以自动安装最新版本。安装完成后重启一次系统,确认驱动已加载再开始测试。

第二步:写入最小配置

配置文件位于 Linux 的~/.config/sunshine/或 Windows 的%APPDATA%\sunshine\。要启用虚拟手柄,只需要两项:

{ "input": { "controller": "enabled", "gamepad": "auto" } }

auto模式下,Sunshine 根据客户端上报的能力选择模拟对象:客户端带陀螺仪或触摸板时模拟 DualShock 4,否则回落到 Xbox 360。多数设备组合下,这个默认值就足够。

第三步:连接并验证

重启 Sunshine 服务,在 Moonlight 客户端搜索并连接你的电脑,选择桌面或某个游戏条目。连接成功后屏幕上会出现虚拟按键。验证分两层:先按几个按键,确认游戏里手柄状态变为“已连接”;再操作触摸区域,确认视角或光标按预期响应。第一层通过,说明虚拟手柄主链路已经打通。

三个常见坑与绕法

坑一:手柄完全无响应

按依赖关系从下往上排查,效率最高:

  1. 驱动层(Windows):ViGEmBus 是否装对。用管理员权限卸载后重装,必要时核对版本号是否 ≥ 1.17;
  2. 权限层:Sunshine 是否有输入设备权限。Linux 上即用户是否属于input组,见下文平台差异一节;
  3. 网络层:防火墙是否拦了串流端口。先临时关闭确认能通,再回头做精确放行,不要长期裸奔。

以上都排除后,在配置中加入min_log_level = debug重启复现,再到故障排除页面读虚拟手柄相关的日志输出。

坑二:按键映射错乱、类型识别不对

通常是两个原因:游戏本身使用了非标准布局,或者自动模式选错了模拟类型。对策分两步。先在配置中手动指定类型:

{ "input": { "gamepad": "x360" } }

可替换为ds4、xone等,逐一试验哪种类型下按键行为正确。其次在 Moonlight 客户端的“控制器布局”里选择自定义布局,把按钮拖到符合游戏习惯的位置,可以保存到所有游戏,也可以只针对单个游戏生效。另外注意:部分防作弊软件会拦截虚拟输入,把游戏改成普通用户权限运行再试。

坑三:延迟明显

体感延迟的大头在视频编码和网络链路,而不是手柄通道本身。调整优先级从高到低:

  1. 比特率降到 10000~15000 区间;
  2. 非强需求把 fps 从 60 降到 30;
  3. 换成有线连接或 5GHz Wi-Fi,路由器上为串流流量设置 QoS;
  4. 客户端与服务器跨网段时,用 UPnP 自动处理端口转发,避免手工配置出错。

对应配置项:

{ "stream": { "fps": 60, "bitrate": 15000 } }

平台差异:Windows 与 Linux 的配置要点

Windows

  • 保持显卡驱动更新,编码链路对延迟的影响普遍比预期大;
  • 检查 Windows Defender 隔离记录,确认 Sunshine 进程与 ViGEmBus 驱动没有被告警拦截;
  • 更新驱动或改动手柄配置后,重启 Sunshine 再测试,排除旧状态干扰。

Linux

虚拟输入需要/dev/uinput的读写权限,两条命令加上 udev 规则:

# 把当前用户加入 input 组 sudo usermod -aG input $USER # 让 uinput 设备节点归属 input 组 echo 'KERNEL=="uinput", GROUP="input", MODE="0660"' | sudo tee /etc/udev/rules.d/99-sunshine-input.rules sudo udevadm control --reload-rules

组变更需要注销重新登录后生效。改完配置后,用min_log_level = debug跑一轮连接,确认日志里没有权限类报错。

延伸用法 🎮

  • 本地多人:多个 Moonlight 客户端各自模拟一个手柄,一台主机即可组本地合作/对抗;
  • 旧设备再利用:闲置手机当专用控制器,配合自定义触摸布局,不占主设备的口袋;
  • 按游戏建档:借助 Moonlight 的每游戏设置,为不同游戏保留不同的手柄类型与按键布局,不用来回改 Sunshine 的配置文件。

完整的驱动说明与排障入口见官方文档 docs/getting_started.md 和 docs/troubleshooting.md。

连接前检查清单 ✅

  • ViGEmBus 版本 ≥ 1.17,安装后系统已重启
  • 配置文件路径正确(~/.config/sunshine/或%APPDATA%\sunshine\),并留了一份备份
  • gamepad从auto起步,只有定位到问题后才改成手动值
  • 串流链路优先有线,路由器已开启 QoS
  • 排查问题时先开min_log_level = debug,防火墙临时关闭隔离

【免费下载链接】SunshineSelf-hosted game stream host for Moonlight.项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进