news 2026/8/18 13:16:46

Sunshine 游戏串流应用配置终极指南:从第一次添加游戏到一键流畅串流

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Sunshine 游戏串流应用配置终极指南:从第一次添加游戏到一键流畅串流

Sunshine 游戏串流应用配置终极指南:从第一次添加游戏到一键流畅串流

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

某个周五晚上,你装好了 Sunshine,兴致勃勃地打开电脑上的 3A 大作,却发现客户端那边怎么都拉不起游戏。你翻遍设置,一头雾水——「我明明把游戏装上去了,Sunshine 凭什么不认识它?」

其实答案很简单:Sunshine 只是一个「传话筒」,它并不自动扫描你的游戏,它需要你亲手把「怎么启动某个游戏」这件事告诉它。本文就是一份面向新手的游戏串流应用配置完整教程,从零开始,带你把游戏一个个「登记在册」,再逐步做到启动稳定、画质拉满。读完你就能独立完成应用添加、预备命令编写和常见故障自救。

一、先明白原理:应用清单就像餐厅的点菜单

第一次进入 Sunshine 的 Web 管理界面(默认地址https://localhost:47990),你会看到首页要你先设置用户名和密码,登录后左侧就有「Applications」入口。点进去,你会看到 Sunshine 自带的几个默认应用(比如 Desktop、Steam)。

Sunshine 管理游戏的逻辑,本质上就是维护一份「点菜单」。这份菜单叫apps.json,记录着每个游戏的启动方式、前置操作、图标等信息。当你在客户端发起串流请求时,Sunshine 就像服务员一样,照着菜单去执行对应的启动命令。

整个流程可以简化成一条链路:

Web 管理界面 ↓ 增删改 apps.json 应用清单 ↓ 读取 命令执行引擎(主命令 + 预备命令) ↓ 启动 游戏进程(附带环境变量注入)

理解了这条链路,后面所有配置你都看得懂:你做的所有操作,本质都是在往apps.json里「写菜单」。平时用 Web UI 点点点即可,配置文件会自动同步更新。

二、认识五个必懂的配置项

在动手之前,先花两分钟认识apps.json里的核心字段。别被英文名吓到,其实每个都很好理解:

配置项一句话解释新手易踩的坑
name应用在客户端显示的名字别用中文特殊符号,个别客户端可能显示异常
cmd主启动命令,支持字符串或数组填错路径最常导致「点了没反应」
detached分离式启动命令,适合 URI 唤醒cmd二选一,别同时填两个
prep-cmd启动前/结束后执行的操作(do/undo 成对)忘了配 undo,游戏退出后分辨率回不来
working-dir工作目录,决定命令从哪个路径执行相对路径经常翻车,务必写绝对路径
image-path应用的封面/图标路径用网络图片地址会失效,建议本地 PNG

除此之外,还有auto-detach(启动后自动分离,不等游戏退出)、elevated(是否以管理员权限运行)、wait-allexit-timeout等进阶开关,后面会逐步提到。

💡 类比:cmd是「正餐」,detached是「外卖」——你点外卖(URI)时,店里(游戏平台)自己负责把餐送到,你不需要等它出锅。

三、第一程 · 让游戏先「能跑」:Windows 添加实战

3.1 Steam 游戏:一条 URI 搞定

Steam 游戏是最好配的,因为 Steam 提供了统一的唤醒协议。以《艾尔登法环》为例(AppID 为 1245620),你只需要在应用编辑页新建一条记录:

{ "name": "Elden Ring", "detached": ["steam://rungameid/1245620"], "auto-detach": true, "image-path": "elden-ring.png" }

关键点在于auto-detach:置为true后,Sunshine 发出唤醒指令就不再多管,Steam 自己会拉起游戏进程。这样即使游戏要跑几十秒才出画面,串流会话也不会因为「主命令返回了」而提前中断。

3.2 本地 exe 游戏:直接指向启动文件

对于不依赖任何平台的本地游戏,用cmd指定可执行文件即可:

{ "name": "本地游戏示例", "cmd": "GameLauncher.exe -windowed", "working-dir": "D:\\Games\\MyGame", "elevated": false }

这里有两个细节值得注意:一是working-dir要写绝对路径,否则游戏可能找不到自己的存档目录;二是如果游戏需要管理员权限,记得把elevated设为true,否则可能出现「闪一下黑框就没了」。

3.3 Epic 平台游戏:走商店的唤醒协议

Epic 商店的游戏可以借助其 Launcher 的 URL Scheme:

{ "name": "Epic 商店游戏示例", "cmd": "com.epicgames.launcher://apps/ExampleGame?action=launch", "working-dir": "E:\\EpicGames\\ExampleGame" }

把示例中的ExampleGame换成游戏在 Epic 目录中的标识即可。这类「平台托管」的游戏,思路和 Steam URI 完全一致——把启动权交给平台自己。

四、第二程 · 跨平台补课:Linux 下的不同玩法

Windows 上的套路在 Linux 上要「入乡随俗」。最典型的差异是:很多用户用 Flatpak 安装 Steam,此时 Sunshine 和 Steam 不在同一个沙箱里,直接调用steam://前缀会无效。

正确姿势是用flatpak-spawn从宿主环境发起唤醒,配合setsid让命令脱离会话独立运行:

{ "name": "Steam 大屏幕模式(Flatpak)", "detached": ["flatpak-spawn --host setsid steam steam://open/bigpicture"], "prep-cmd": [ { "do": "flatpak-spawn --host setsid steam steam://open/bigpicture", "undo": "flatpak-spawn --host setsid steam steam://close/bigpicture" } ] }

💡 小结:无论 Windows 还是 Linux,核心思路只有一条——「能用平台协议唤醒的,就别手写 exe;需要手写的,就确保路径、权限、工作目录三件套齐全。」

另外提醒一句:Linux 下如果 Sunshine 是通过 systemd 服务运行的,它没有桌面环境上下文,很多图形程序需要额外处理;这也是为什么上面要借助flatpak-spawn --host这类「借壳」手段。跨平台配置差异并不复杂,只要记住「平台协议优先、路径写绝对、沙箱要穿透」就够了。

五、第三程 · 让游戏「跑得稳」:预备命令 do 与 undo

光能启动还不够,很多游戏在串流时还需要「提前铺路」。比如:进游戏前把分辨率切到客户端匹配的分辨率,退出后还原回桌面分辨率;或者启动前关掉可能会弹窗的软件。这些活儿,交给预备命令(prep-cmd)干。

预备命令就像演出前的彩排:do是开演前布置舞台,undo是散场后收拾道具。Sunshine 在串流会话建立前执行所有do,在会话结束时执行所有undo,保证「好借好还」。

5.1 Windows:动态切换分辨率

以常见的分辨率切换工具为例,写进prep-cmd

"prep-cmd": [ { "do": "cmd /C \"nircmd setdisplay %SUNSHINE_CLIENT_WIDTH% %SUNSHINE_CLIENT_HEIGHT% %SUNSHINE_CLIENT_FPS%\"", "undo": "cmd /C \"nircmd setdisplay 2560 1440 120\"" } ]

do里的%SUNSHINE_CLIENT_WIDTH%等变量,会在执行时被替换成客户端实际请求的分辨率;undo则固定还原回你的桌面分辨率。

5.2 Linux:用 xrandr 完成同样的任务

Linux 下思路一致,工具换成xrandr

"prep-cmd": [ { "do": "sh -c \"xrandr --output DP-1 --mode ${SUNSHINE_CLIENT_WIDTH}x${SUNSHINE_CLIENT_HEIGHT} --rate ${SUNSHINE_CLIENT_FPS}\"", "undo": "xrandr --output DP-1 --mode 2560x1440 --rate 120" } ]

注意两点:显示器名称(如DP-1)要先用xrandr查清楚;写do命令时套一层sh -c是因为变量展开需要 shell 参与。至于那些「必须等前置条件完成才启动游戏」的场景,可以在预备命令里依次写下多个步骤,Sunshine 会按顺序执行。

六、环境变量速查表:给游戏程序递小纸条

看到这里你可能好奇:%SUNSHINE_CLIENT_WIDTH%这些变量是哪来的?这是 Sunshine 在启动应用时自动注入的环境变量——相当于 Sunshine 悄悄给游戏程序塞了张「小纸条」,告诉它客户端想要什么。

变量名它代表什么典型用途
SUNSHINE_CLIENT_WIDTH客户端请求的画面宽度动态切换分辨率
SUNSHINE_CLIENT_HEIGHT客户端请求的画面高度动态切换分辨率
SUNSHINE_CLIENT_FPS客户端请求的帧率同步刷新率
SUNSHINE_CLIENT_HDR客户端是否支持 HDR条件式开启 HDR 模式
SUNSHINE_APP_NAME当前正在启动的应用名日志区分、脚本分支判断
SUNSHINE_APP_ID当前应用的唯一标识脚本/工具联动

💡 用法提示:Windows 下在命令里用%变量名%引用,Linux 下用$变量名${变量名}引用,别混用。你也可以在自己的批处理/脚本里读取这些变量,实现更复杂的自动化。

七、第四程 · 让游戏「跑得爽」:完整方案组合拳

把前面所有招式组合起来,就是一个「跑得爽」的完整配置。以一台 4K 显示器的 Windows 主机为例,最终的应用配置长这样:

{ "name": "Elden Ring", "detached": ["steam://rungameid/1245620"], "auto-detach": true, "image-path": "elden-ring.png", "prep-cmd": [ { "do": "cmd /C \"nircmd setdisplay %SUNSHINE_CLIENT_WIDTH% %SUNSHINE_CLIENT_HEIGHT% %SUNSHINE_CLIENT_FPS%\"", "undo": "cmd /C \"nircmd setdisplay 3840 2160 120\"" } ] }

整套流程是这样的:客户端发起串流 → Sunshine 先执行do(把显示器切成客户端分辨率)→ 通过 Steam URI 唤醒游戏 → 游戏以原生分辨率运行 → 会话结束执行undo(恢复桌面分辨率)。一个闭环,干净利落。

如果游戏本身吃不满帧,还可以配合 Sunshine 的编码侧设置(码率、编码器、帧率上限)做整体调优——应用配置负责「启动正确」,编码设置负责「画面流畅」,两者互补。

八、翻车自救手册:三个高频故障排查

配置写好了,实际跑起来难免翻车。下面三个问题是出现频率最高的,按「症状 → 排查思路 → 解决方案」给你列好:

8.1 游戏启动后会话立即结束

  • 症状:客户端点开游戏,画面一闪,串流直接断开。
  • 排查思路:八成是主命令进程「先退场」了,Sunshine 误以为游戏结束。
  • 解决方案:改用detached分离式启动;或设置"auto-detach": true;同时检查游戏是否真的启动成功(去主机上看一眼进程)。

8.2 输入设备没反应

  • 症状:画面正常,但鼠标键盘手柄全部失灵。
  • 排查思路:输入通道权限问题。
  • 解决方案:Linux 下把运行 Sunshine 的用户加入input组(sudo usermod -a -G input 你的用户名)并重新登录;Windows 下检查虚拟手柄驱动(ViGEm)是否安装成功。

8.3 分辨率对不上

  • 症状:客户端画面拉伸、模糊,或者游戏内分辨率不是客户端请求的。
  • 排查思路:预备命令没生效,或显示模式不支持该分辨率。
  • 解决方案:确认prep-cmddo确实执行成功(看日志);确认目标分辨率是显示器原生支持的;确认变量名在对应系统下写法正确。

💡 记住这条铁律:所有翻车,先看日志。Sunshine 的日志页面会记录预备命令执行、应用启动的每一步,错误原因通常就藏在最后几行里。

九、让配置更省心:最佳实践与性能优化清单

跑顺之后,再教你几招「偷懒但专业」的优化姿势:

  1. 平台协议优先:Steam、Epic 能走 URI 就走 URI,别自己去拼启动参数,最稳。
  2. 预备命令保持轻量:少放与串流无关的脚本,避免拖慢启动;能用一条命令解决的就别写三行。
  3. 合理配置超时:给应用加上"exit-timeout": 3,避免退出流程卡死;如果某应用不需要等前置命令,"wait-all": false能明显加快启动。
  4. 善用全局预备命令:所有应用都要执行的步骤(比如统一关闭通知弹窗)可以放在全局设置里,再用"exclude-global-prep-cmd": true给个别应用开「免跑」特权。
  5. 图标用本地 PNG:别用远程图片地址,断网或失效都会让封面变空白。
  6. 定期备份apps.json是你所有配置的心血,改出问题随时能回滚。
  7. 改完必测:每新增一个应用,都走一遍完整的「启动 → 操作 → 退出」流程,确认 do/undo 都干净。
{ "wait-all": false, "exit-timeout": 3, "exclude-global-prep-cmd": true }

上面的代码片段就是一次典型的「启动加速」配置:不等所有前置完成、退出超时设为 3 秒、跳过全局预备命令——适合追求极速启动的场景。

十、现在,打开你的第一份应用清单

回顾一下整条进阶路线:先理解apps.json的「点菜单」本质,接着用 URI 或 exe 让游戏「能跑」,再借助预备命令和撤销命令让流程「跑得稳」,最后通过环境变量和动态分辨率让体验「跑得爽」,翻车了也有日志和自查清单兜底。

现在轮到你了:打开 Sunshine 的 Web 管理界面,新建你的第一个应用——挑你常玩的 Steam 游戏,用一条steam://rungameid/前缀的detached命令完成添加,然后从手机或另一台电脑发起串流,体验第一次「一键进游戏」的快乐。

如果配置过程中遇到问题,回到本文的「翻车自救手册」对照排查,Sunshine 的日志永远是你最可靠的队友。祝串流愉快,游戏快乐!🎮

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/18 13:16:16

迁移学习实战思路:如何用预训练模型完成文本分类

迁移学习实战思路:如何用预训练模型完成文本分类 从零训练语言模型往往需要大量语料、算力和时间。迁移学习的思路是复用预训练模型已经学到的通用语言表示,只用领域数据完成适配。这不是简单加载一个模型,而是一组围绕数据、训练范围和评估的…

作者头像 李华
网站建设 2026/8/18 13:11:35

67.QT-QSharedMemory

1.QSharedMemory介绍 QSharedMemory提供了多个线程和进程对共享内存段的访问。它还提供了一种方法,让单个线程或进程锁定内存以进行独占访问。当使用这个类时,请注意以下平台差异:Windows: QSharedMemory不“拥有”共享内存段。当有QSharedMemory实例附加…

作者头像 李华
网站建设 2026/8/18 13:10:09

加密音乐打不开?3个问题带你彻底搞懂

加密音乐打不开?3个问题带你彻底搞懂 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https://gitcode.com/g…

作者头像 李华
网站建设 2026/8/18 13:09:52

Java设计模式---代理模式

引言 在软件设计领域,代理模式(Proxy Pattern)作为一种经典的结构型设计模式,其核心思想是在客户端与目标对象之间引入一个代理对象,以控制对目标对象的访问。这种模式不仅能够在不修改原有代码的基础上增强功能&…

作者头像 李华
网站建设 2026/8/18 13:09:28

第 4 篇:「当数据库坏了」— 优雅降级与七层防守

开场:系统设计的最高考验 现实很残酷:没有什么系统永远可用。 SQLite 可能失败的方式有很多: ❌ 磁盘满了 → 无法写索引 ❌ 权限拒绝 → 无法创建 .loopagent 目录 ❌ 文件锁冲突 → 5 秒超时 ❌ Writer 太慢 → Reader 等待中... ❌ 数据库损坏 → 打开时 SQLITE_CORRU…

作者头像 李华