1. GameStream 谢幕之后:Sunshine 凭什么接棒
1.1 事件回顾:一次“砍掉”引发的社区接力
先说背景。NVIDIA 在 GeForce Experience 里内置了 GameStream 功能,让用户可以把自己电脑上的游戏串流到 Shield 设备、手机或另一台电脑上。这个功能在局域网内表现非常出色,延迟低、画质好,是很多人搭建家庭云游戏的默认选择。但 NVIDIA 在 2023 年初宣布从 GeForce Experience 3.27 版本开始移除 GameStream,官方推荐用户转向 Steam Remote Play 或者其他方案。对于已经习惯用 GameStream 串流的玩家来说,这算得上是一次“被迫搬家”。
问题在于,市面上现成的串流方案要么绑定特定硬件,要么走公网中转,画质和延迟都受制于人。于是社区里早就存在的两个开源项目被推到了台前:Sunshine 承担服务端角色,负责接收串流请求、采集画面、编码视频、回传输入;Moonlight 承担客户端角色,负责解码并显示画面、采集本地输入。两者合在一起,几乎是 GameStream 的“完全体替代方案”。Sunshine 的 GitHub Star 数量能够冲到 4 万级别,靠的并不是运气,而是整个自托管云游戏需求在 GameStream 退场之后集中爆发的真实结果。
1.2 项目定位:Sunshine 和 Moonlight 的分工
要理解 Sunshine,必须先理解它和 Moonlight 之间的关系。Moonlight 最初是为了连接 NVIDIA GameStream 而开发的客户端,它实现了 NVIDIA 串流协议的解码端。Sunshine 则是一个逆向工程实现的 GameStream 服务端,让 Moonlight 客户端不需要连到 NVIDIA 的闭源服务,而是直接连到 Sunshine 所在的电脑上。换句话说,Sunshine 把原来只能跑在 NVIDIA 显卡和 GeForce Experience 上的服务端能力,移植到了任意平台、任意显卡上。
Sunshine 本身是一个高性能的串流服务器,支持 Windows、Linux、macOS,视频编码端支持 NVIDIA NVENC、AMD AMF、Intel QSV,甚至还能跑软件编码 x264/x265。这意味着只要你的电脑有主流显卡,哪怕是一台 AMD 核显轻薄本,也能变成一台云游戏服务器。这一点是 GameStream 时代完全不敢想的——彼时串流服务被锁死在 NVIDIA 生态里,A 卡和 I 卡用户根本没有官方途径享受低延迟串流。
1.3 自托管云游戏到底是什么
很多人一听“云游戏”就想到谷歌 Stadia 或者 GeForce NOW 这类服务,但自托管云游戏是完全不同的逻辑。自托管的意思是:服务器是你自己的电脑,串流链路也是你自己的局域网或者你自行打通的网络。数据不经过第三方的云服务器中转,延迟、画质、隐私都由你自己掌控。
Sunshine 解决的核心问题可以拆成三个:
- 我不在电脑前,怎么远程玩到这台电脑上的游戏?
- 我不想被网线束缚,怎么在客厅、卧室、手机、平板上随时接着玩?
- 我不想把游戏存档和处理能力交给云服务商,数据和算力都在自己手里?
这三点分别对应了 Sunshine 在串流服务、客户端兼容、数据可控性上的价值。对于普通用户来说,它就是一套“自己家开的云游戏机房”,只不过机房只有一台电脑,观众和玩家都只有你自己。
2. 串流链路全解析:一条游戏数据是怎么从电脑到手机的
2.1 整体架构与核心模块
把 Sunshine 部署好之后,一次完整的串流会话从玩家在 Moonlight 客户端点击“开始串流”开始,到画面在客户端呈现、手柄输入反馈回服务器端生效为止,中间会经过一串非常紧密配合的模块。
单说 Sunshine 服务端,它的内部大致由几个核心部分组成:
- 控制服务器:负责处理 Moonlight 客户端的配对、握手、会话建立、心跳维持。
- 视频采集模块:在 Windows 上通常抓取显示器输出,在 Linux 上依靠 KMS/DRM 或 NVFBC 等接口抓取桌面画面。
- 输入模拟模块:将手机触摸屏、手柄按键、鼠标键盘动作转成服务器端的虚拟 HID 输入。
- 编码分发模块:调用硬件编码器对视频帧进行实时编码,再通过 RTSP/HTTPS 等通道传输给客户端。
- Web 管理界面:Sunshine 内置了一个配置页面,用来管理配对码、视频参数、网络参数、音频设置等。
这些模块之间通过内部消息循环协作。客户端发来一个控制信号,服务端解析后改写输入状态;同时服务端每一帧从采集模块取回画面,塞给编码器处理,再打包发送出去。整体上,Sunshine 就是一个“图像采集 + 视频编码 + 输入回传”的三明治结构。
2.2 握手、配对与端口:网络层的准备工作
Sunshine 和 Moonlight 之间使用 RTSP(实时流协议)进行会话控制,数据通道则分为视频流和音频流。整个通信依赖固定端口,这也是部署时最容易出问题的环节。
默认端口分配如下:
| 用途 | 协议 | 端口 |
|---|---|---|
| HTTPS 配对/控制 | TCP | 47984 |
| HTTP 流媒体 | TCP | 47989 |
| Web 管理界面 | TCP | 47990 |
| 视频流 | UDP | 48010 |
| 客户端控制/音频流 | UDP | 47998、47999 |
Moonlight 客户端首次添加主机时,会通过 HTTPS 和 Sunshine 建立配对。Sunshine 的 Web 管理界面会生成一个 PIN 码,客户端手动输入这串数字完成密钥交换。这个机制保证了即使服务端暴露在公网上,没有配对过的设备也无法直接发起串流。配对完成后,Sunshine 会把客户端信息保存在本机,后续启动串流时会自动匹配。
2.3 视频编码环节:为什么必须用硬件编码器
串流体验好不好,编码器是关键。游戏画面是动态实时渲染的,每一帧都必须尽快编码、发送、解码,不能像视频剪辑那样花几秒钟慢慢压。软件编码虽然画质上限高,但 CPU 占用惊人,打游戏时本来 CPU 就要负责游戏逻辑和物理计算,再分出一大块算力去跑编码,画面帧率和延迟都会崩。所以 Sunshine 几乎必须调用硬件编码器。
硬件编码器就是显卡里专门负责视频编码的那一小块电路,比如 NVIDIA 的 NVENC、AMD 的 AMF、Intel 的 QSV。它们的好处是几乎不占用 CPU 和 GPU 的主要计算资源,编码速度快,延迟低。Sunshine 在 Windows 上默认会优先调用 NVENC,如果是 A 卡环境,它会自动切到 AMF,I 卡则用 QSV。这里有个容易让新手误解的点:Sunshine 对 AMD 和 Intel 的支持不是靠某个特殊安装包,而是同一个主程序在运行过程中自动检测编码器。所以网上那些“AMD 处理器选择哪个 Sunshine 安装包”的疑问,其实是被误导了——安装包都是一样的,设备上的 GPU 是什么,Sunshine 就会自动匹配什么编码方案。
为了压低延迟,Sunshine 的视频编码参数里通常会设置很低的关键帧间隔和短的 GOP(画面组),这样客户端丢失数据后能快速恢复画面。编码预设也会偏向低延迟模式,比如 NVENC 里的p1(最快预设)或者llhq(低延迟高质量)。画质和延迟永远在博弈,Sunshine 提供了大量参数让用户自己权衡。
2.4 输入回传与虚拟显示器:体验里的隐形功臣
串流最容易忽略的其实是“反向链路”——客户端不只是显示画面,它还要把玩家的输入送回服务器。Moonlight 客户端会把键盘、鼠标、手柄、触摸屏的输入事件打包发送,Sunshine 收到后在服务器本地模拟成对应的物理设备操作。
Windows 上,Sunshine 通过虚拟 HID 驱动实现鼠标键盘和手柄的模拟,这就解释了为什么安装时它需要管理员权限。实际体验中,这部分做得相当成熟:手感接近直连,延迟几乎感觉不到。
还有一个很多人不知道的细节:串流时如果你的物理显示器没开,或者选的分辨率和物理显示器不匹配,画面可能会出现黑屏、花屏、无法切换分辨率等问题。解决方案是装一个虚拟显示器驱动,让系统认为有一个不存在的显示器连接在显卡上。Sunshine 在虚拟显示器环境下可以稳定输出指定分辨率和刷新率,这也是延迟优化里非常关键的一步。Sunshine 官方文档推荐了 VDD(Virtual Display Driver)方案,安装在系统里后,显卡会额外挂一个“虚拟屏幕”,串流时画面从虚拟屏幕输出,物理显示器关不关都无所谓。
3. 从下载到跑通:Sunshine 部署与基础配置实录
3.1 安装与准备工作(Windows / Linux 分别说)
部署 Sunshine 绝对算不上难,但细节很多。先说 Windows 环境。
- 去 Sunshine 的 GitHub Releases 页面下载最新版,文件名一般是
sunshine-windows-installer.exe或类似格式。这里不需要区分 AMD 或 Intel,同一个包覆盖所有显卡。 - 安装时选择默认路径即可,安装完成后首次启动需要以管理员身份运行,因为它要装虚拟显示驱动和虚拟 HID 驱动。有些杀毒软件会对驱动安装行为弹窗,放行即可。
- 准备一对硬件:建议游戏主机有独立显卡,NVIDIA 的 GTX 10 系及以上、AMD RX 5000 系及以上、Intel 核显都能胜任。Windows 上还需要装好显卡驱动,N 卡用户最好装上 NVIDIA 驱动里附带的 NVENC 编解码组件(新版驱动默认自带)。
Linux 环境下会稍微复杂一些,但有两种省事路径:
- 直接下载官方提供的 AppImage,在大多数发行版上双击或
chmod +x后运行。 - 使用发行版的包管理器安装,比如 Arch 的 AUR 里就有
sunshine包,Ubuntu/Debian 系可以用官方维护的.deb包。
Linux 上需要注意显卡驱动和权限问题。N 卡用户要安装 NVIDIA 专有驱动,A 卡走 amdgpu 开源驱动,I 卡走 i915 驱动。想要采集桌面画面,用户需要属于video组,并且要有访问/dev/dri设备的权限。如果安装完启动后日志提示无法打开 GPU 设备,大概率就是权限或驱动问题。
3.2 Web 管理界面的初始化与配对
Sunshine 启动后,在浏览器里访问https://localhost:47990就能进入 Web 管理界面。首次访问因为自签名证书,浏览器会警告“不安全”,不用管,点继续访问即可。
进入界面后第一步是创建用户名和密码,这是管理界面的登录凭证,和 Moonlight 配对的 PIN 码不一样。登录后,界面分为几个主要区域:General(常规)、Audio(音频)、Video(视频)、Network(网络)、Advanced(高级)等。想添加 Moonlight 客户端时,在 General 页面或“Pairing”区域点击生成 PIN 码,然后打开客户端,选择手动添加主机,输入电脑 IP,Moonlight 会提示输入配对码,填进去就成了。
这里我踩过一次坑:如果你有两台 Sunshine 设备,或者主机名有特殊字符,Moonlight 里添加主机时可能会显示“找不到主机”。解决办法是手动输入 IP 地址而不是主机名,并且在同一个局域网网段内操作。配对码有时效性,过期后重新生成就行。
3.3 视频与网络参数配置:照着抄就行
Web 界面里最核心的是 Video 配置区。我常用的配置如下:
- 编码器:NVIDIA NVENC / AMD AMF / Intel QSV,按实际硬件选,选错会导致启动串流时报错。
- 分辨率:按客户端屏幕比例选,比如 1920x1080 或 2560x1440。建议固定,不要用“自动”,否则每次串流都要重新握手。
- 帧率:60 FPS 是平衡点,如果你是 144Hz 显示器玩家,可以试 90 或 120,但要注意码率会相应上涨。
- 码率:局域网 20-30 Mbps 起步,无线环境可以降到 10-15 Mbps。
- CRF/CQP:这是决定画质的关键参数。Sunshine 支持设置恒定质量系数,数值越低画面越好、码率越高。我一般设 20-24,画质和码率比较均衡。
- 编码预设:NVENC 推荐
p1或p2,AMF 推荐speed,QSV 推荐veryfast,优先保延迟。 - 关键帧间隔:设为 2-4 秒,别太长,否则丢包后画面恢复很慢。
Network 区里主要关注端口和帧延迟控制。端口默认值不要乱改,除非你有多个 Sunshine 实例要跑。网络带宽上限可以配合码率设置,给其他设备留出余量。
3.4 防火墙与常见环境坑
部署完成后最常遇到的问题就是“配对成功但无法串流”或者“客户端一直转圈”。排查顺序里第一个就是防火墙。
Windows 上安装 Sunshine 时,安装向导一般会弹出防火墙许可提示,很多人手滑点了取消,导致客户端连不上端口。解决办法是手动到“允许应用通过防火墙”里添加 Sunshine,并且同时放行 TCP 47984/47989/47990 和 UDP 47998/47999/48010。如果服务器在 Linux 上,用ufw或firewalld放行同样的端口。
路由器上如果开了 AP 隔离(无线设备互相隔离),手机和电脑之间就没法通信,串流自然失败。这个问题在办公网络或某些公共 WiFi 上尤其隐蔽,排查时要想到。
4. 性能调优:把延迟从“能用”压到“敢玩”
4.1 延迟都藏在哪里
串流延迟不是单一数值,而是一条链路上所有环节延迟的总和。一次串流的延迟大体由以下几段构成:
- 采集延迟:画面从 GPU 输出到编码器输入端的时间。Windows 上用 WGC 或者 NVFBC 采集,延迟通常在 1-5ms 之间。
- 编码延迟:视频帧被硬件编码器压缩的时间,NVENC 在低延迟预设下大约 2-5ms。
- 网络传输延迟:局域网内 1ms 左右,走公网则取决于你的网络环境,可能几十毫秒。
- 解码延迟:客户端硬件解码耗时,手机和平板一般在 3-10ms。
- 显示延迟:显示器或屏幕本身的刷新延迟。
如果你在家里局域网内测试,端到端延迟能控制在 20-40ms 之间,这已经非常接近直连电脑的体验了。如果你想把延迟压得更低,优先从采集和编码环节下手。
4.2 编码器与码率选择建议
编码器选择是最影响体验的决策。N 卡用户直接选 NVENC,这是目前各项表现最均衡的硬件编码器,画质和延迟几乎无可挑剔。A 卡用户选 AMF,I 卡用户选 QSV,虽然绝对画质与整卡性能相关,但 Sunshine 的适配已经相当成熟,正常用不会有大问题。
码率设置有两个方向:
- 固定码率(CBR):适合网络不稳定的场景,保持恒定数据量。
- 可变码率(VBR/CRF):按画面复杂程度动态调整码率,画质更好,但瞬时码率可能冲得很高。
我建议局域网环境用 VBR / CRF 方案,画质优先;公网串流或无线环境用固定码率,避免拥塞导致花屏卡顿。一个比较实用的经验值:1080p/60fps 下 CRF 22 的局域网码率大约在 20-40 Mbps,如果在手机 5G 网络下串流,手动限到 15 Mbps 会更稳定。
4.3 不同硬件组合的实际表现参考
我实测过几套配置,可以作为参考:
| 硬件组合 | 编码器 | 1080p/60fps 延迟(局域网) | 4K/60fps 表现 |
|---|---|---|---|
| NVIDIA RTX 4070 | NVENC | 约 15-20ms | 良好,码率 40Mbps 画面干净 |
| AMD Radeon RX 6700 XT | AMF | 约 20-25ms | 可以跑,但 4K 高码率时延迟略高 |
| Intel Iris Xe 核显 | QSV | 约 25-35ms | 不适合 4K,1080p 完全能玩 |
| 无独显纯 CPU 压片 | x264 | 约 40-60ms | 不推荐 |
数据不是绝对的,和驱动版本、系统负载、网络设备都有关系,但可以得出一个结论:想获得接近本地直连的体验,N 卡依然是首选,A 卡居中,核显适合轻量场景。
4.4 进阶:虚拟显示器、HDR 与多显示器
如果你打算长期用串流代替直连,虚拟显示器几乎是必装项。安装虚拟显示器驱动后,即使物理显示器断电,系统也能保持一个稳定的虚拟屏幕输出,串流端不会黑屏,分辨率切换也稳定。virtual-display-driver 项目在 GitHub 上可以找到,安装后去系统显示设置里把虚拟显示器设为“扩展这些显示器”或者“复制”,再在 Sunshine 的 Video 配置里把分辨率锁定到目标值。
HDR 串流是另一个可玩性很高的进阶项。Sunshine 支持 HDR 透传,前提是客户端解码设备支持 HDR,并且你的游戏画面本身是 HDR 输出。开启后需要在 Web 配置里启用 HDR 选项,编码码率适当调高,否则暗部细节会被压成一团黑。
多显示器环境要注意指定输出显示器。Sunshine 的配置里有一项“Display Output”或“Output Name”,你可以选择抓取哪一块屏幕的画面。如果选错了,串流端看到的可能是桌面壁纸而不是游戏画面。我自己的习惯是:游戏跑在主显示器上,串流也固定抓主显示器,副屏只放聊天工具和浏览器。
5. 常见问题与排查技巧实录
5.1 配对失败 / 连不上 / 黑屏
这三个问题是所有串流用户绕不开的坎,我按优先级整理一下排查路径。
配对失败时,先确认 Sunshine 是否处于运行状态、Web 管理界面能否正常打开。如果 Web 界面打不开,说明服务没起来,去查看系统日志或 Sunshine 的日志文件。其次确认客户端输入的主机 IP 是否正确,有些路由器分配了多个网段,手机和电脑可能不在同一个网段,互相之间ping不通。
配对成功但连不上串流端口,多半是防火墙。Windows 上检查“允许应用通过防火墙”里是否放行了 Sunshine,Linux 上用ss -lntu看端口监听状态,再用telnet或nc从客户端侧测试 TCP 47989 是否连通。
黑屏问题的根源几乎都在视频采集端。先试试把虚拟显示器装好,再确认 Sunshine 的编码器选项和实际显卡匹配。如果黑屏时还有声音,说明链路已经通了,只是画面没采到。这时候去系统设置把显示器扩展出来,或者指定正确的采集输出,问题基本能解决。
5.2 日志里的“Failed to initialize”类报错怎么查
有人反馈在日志或者命令终端里看到类似failed to initialize NVML或者更完整的every 5.0s: nvidia-smi ... failed to initialize这样的输出,这正是排查时的重要线索。这个报错出现在需要调用 NVIDIA GPU 的环境里,意思是 NVIDIA 管理库(NVML)无法初始化,也就是系统没有正确暴露或加载 NVIDIA 驱动。
先说一个最容易出现这个问题的场景:在虚拟机或容器里跑 Sunshine,但并没有把物理 NVIDIA 显卡直通进去,系统只看到了虚拟显卡。这时候 nvidia-smi 确实跑不起来,Sunshine 自然也无法用 NVENC 编码。解决办法是确认宿主机显卡直通配置,或者在物理机上运行 Sunny。如果确认是物理机,那么先卸载驱动再重新安装最新版驱动,重启后执行nvidia-smi,能正常输出显卡信息和驱动版本才算恢复。
Linux 下还有一个隐蔽问题:开源驱动nouveau会和 NVIDIA 专有驱动冲突,导致 NVML 无法初始化。检查方式是执行lsmod | grep nouveau,如果有输出,需要把 nouveau 加入内核黑名单并重建 initramfs,然后重启。这个坑比较深,但一旦遇到,靠改配置是绕不过去的,必须从驱动加载层面解决。
5.3 音频、手柄和外设类问题
串流时没有声音,优先检查 Sunshine 的 Audio 配置。Windows 上它默认会捕获系统默认播放设备的音频,如果默认播放设备是静音或者物理声卡被禁用,串流端就会无声。把系统默认播放设备切换到正常设备,或者安装虚拟声卡驱动,可以根治这个问题。
手柄失灵的排查方向很明确:先看客户端是否识别到手柄,再看 Sunshine 的输入状态是否收到事件。Windows 上 Sunshine 通过虚拟 HID 模拟手柄,如果系统装了第三方手柄映射工具(例如 DS4Windows),可能会出现冲突。建议先关掉这些映射工具再测试。手机端串流时虚拟按键不响应,多半是客户端的手柄映射配置问题,去 Moonlight 的按键设置里重新映射即可。
5.4 常见问题速查表
| 现象 | 可能原因 | 解决动作 |
|---|---|---|
| Web 管理界面打不开 | 服务未启动 | 查看服务状态,重新启动 Sunshine |
| 配对时提示找不到主机 | IP 网段不一致 | 确认客户端与服务端同网段,手动填 IP |
| 串流黑屏但有声音 | 显示器采集失败 | 安装虚拟显示器驱动并指定采集输出 |
| 画面卡顿、马赛克 | 码率不足 | 提高码率上限或降低分辨率/帧率 |
| 延迟忽高忽低 | 无线信号不稳定 | 换 5GHz 频段或改有线连接 |
| 音频无声 | 默认播放设备不对 | 设置正确的系统默认音频设备 |
| 手柄无响应 | 输入映射冲突 | 关闭手柄映射工具,重新配置 Moonlight |
| 日志报 NVML 初始化失败 | 驱动未加载或虚拟化环境未直通 GPU | 重装驱动,检查 GPU 直通/黑名单配置 |
6. 写在最后:关于 Sunshine 的一些个人体会
Sunshine 打动我的地方不在于它有多少 Star,而在于它真的把“云游戏”这个概念变成了普通人能拿在手里的工具。GameStream 被砍之后,很多人以为这条路断了,结果社区用开源方式把它重新铺了一遍,而且铺得更宽——不再绑死 NVIDIA,不再依赖 GeForce Experience,不再需要 NVIDIA 账户在线验证。这整个替代过程在我看来是典型的技术社区自救案例,也解释了为什么它能积累到 4 万颗 Star。
如果让我给一个上手建议,那就是别一上来就追求 4K 120 帧那些极限参数。先把 1080p/60fps 跑通,摸清楚自己网络环境的底线,再一步步加码。我在实际使用中最常用的场景其实是“躺在床上用平板接着打电脑上的 RPG”,延迟几乎感知不到,画面和键位手感都接近原生。这个小需求听起来不算什么,但真要用串流方案实现它,Sunshine 是目前几乎没有对手的选择。
最后分享一个小技巧:如果你同时有室内和室外串流需求,建议在路由器上给 Sunshine 主机配置固定 IP,并开启 UPnP 或手动端口转发。公网串流时延迟会高一些,但配合低码率和合适的帧率设置,大多数回合制、养成类游戏完全能玩。这个扩展方向很值得折腾,也是自托管云游戏最爽的部分——你的游戏,真的可以跟着你走到哪玩到哪。