ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Sunshine 应用配置实战指南:从 Desktop 到 Steam/Epic 的 App Examples 全解析

Sunshine 应用配置实战指南:从 Desktop 到 Steam/Epic 的 App Examples 全解析 音视频【免费下载链接】foundation-sunshineSunshine fork: an enhanced sunshine, a self-hosted game streaming host for Moonlight with HDR10/HDR Vivid, virtual displays, advanced audio, optimized encoders, and a modern control panel.项目地址https://gitcode.com/gh_mirrors/sunshine5/foundation-sunshine点击查看免费下载本文以 foundation-sunshine 官方文档 docs/app_examples.md 为主体结合 src/process.h、src/process.cpp、src/config.cpp 等源码系统讲解如何在 Sunshine 中添加游戏与应用、配置启动命令、工作目录、分离命令Detached Commands与准备命令Prep Commands。读完本文你将掌握跨 Linux / macOS / Windows 三平台的常见应用配置模板、基于环境变量的分辨率/帧率联动方案以及 Windows 服务模式下命令提权等高级技巧。并非所有应用都以相同方式启动有的需要以 URI 协议唤起有的要求固定工作目录有的启动后主进程会被更新程序杀死还有的必须在管理员权限下运行。因此 Sunshine 将应用配置抽象为若干字段并针对常见场景提供了官方示例。理解这些示例背后的字段语义与执行逻辑是配置好自托管串流主机、获得一键开玩体验的关键。一、应用配置的核心字段与执行逻辑在 Sunshine 中一个应用条目由以下核心字段组成对应 src/process.h 中proc_app_t的定义字段含义备注name应用名称显示在 Moonlight 客户端与 Web UI 中cmd主命令应用的启动命令可含参数detached分离命令列表由 Sunshine 启动但脱离其生命周期管理见下文working-dir工作目录部分游戏必须设置才能正常运行elevated是否以管理员权限启动仅 Windows 服务模式有效值为字符串true/falseimage-path应用图标/封面留空则使用默认图标output日志文件路径可用来收集应用输出日志排查启动失败prep-cmd准备命令数组每个元素含do启动前执行与undo退出后执行exclude-global-prep-cmd是否跳过全局准备命令字符串true/false原文档特别提醒两点示例中未展示的字段一律留空。你可以通过image-path字段为应用添加封面图通过output字段指定日志文件进一步提升使用体验。当未指定working-dir时工作目录默认为目标应用可执行文件所在的文件夹。这一默认行为对应 src/process.cpp 的find_working_directory()它从命令中解析出可执行文件路径并取其父目录作为工作目录。prep-cmd的执行时机由 src/process.cpp 控制应用启动前按顺序执行每个do命令应用退出后执行对应undo命令若cmd为空而仅配置detached则只启动分离命令而不进行生命周期托管。这一机制是下文分辨率切换等场景的基础。二、通用示例Common Examples2.1 Desktop最简单的桌面串流字段值Application NameDesktopImagedesktop.png这是最基础的配置应用名称为Desktop配上一张封面图src_assets/common/assets目录下的desktop.png命令字段留空。Sunshine 会把它当作直接串流当前桌面的入口即不做任何额外启动操作直接进入桌面画面。2.2 Steam Big Picture三平台的分离命令写法Steam 启动后会先运行自更新进程随后杀掉最初的启动进程。如果按普通cmd托管Sunshine 会误判应用已退出。因此必须使用detached分离命令让命令脱离 Sunshine 的生命周期管理对应 src/process.h 注释中commands detached from Sunshine的说明平台字段值LinuxApplication NameSteam Big PictureLinuxDetached Commandssetsid steam steam://open/bigpictureLinuxImagesteam.pngmacOSApplication NameSteam Big PicturemacOSDetached Commandsopen steam steam://open/bigpicturemacOSImagesteam.pngWindowsApplication NameSteam Big PictureWindowsDetached Commandssteam://open/bigpictureWindowsImagesteam.png要点解析Linux 使用setsid让 Steam 脱离当前会话避免串流进程树清理误杀 SteammacOS 用open唤起应用这是 macOS 启动 GUI 应用的标准方式Windows 直接用steam://open/bigpicture协议 URI 唤起 Big Picture 模式detached命令的启动在 src/process.cpp 中实现日志会输出Spawning [...] in [...]便于确认命令确实被发起。2.3 Epic 游戏商店游戏URI 与二进制两种启动路径官方指出使用 URI 方法在不同游戏之间的一致性最好因为它不依赖具体安装路径。URI 方式Windows字段值Application NameSurviving MarsCommandscom.epicgames.launcher://apps/d759128018124dcabb1fbee9bb28e178%3A20729b9176c241f0b617c5723e70ec2d%3AOvenbird?actionlaunchsilenttrue该 URI 由三部分组成游戏 IDd759128018124dcabb1fbee9bb28e178、可选的安装 ID20729b9176c241f0b617c5723e70ec2d以及应用名Ovenbird三者用%3A即冒号的 URL 编码连接actionlaunchsilenttrue表示静默启动。实际使用时可到 Epic 游戏目录的.egstore文件中找到对应 ID 替换。二进制方式带工作目录Windows字段值Application NameSurviving MarsCommandMarsEpic.exeWorking DirectoryC:\Program Files\Epic Games\SurvivingMars命令只写可执行文件名配合引号包裹的完整工作目录让进程在正确的目录下启动。注意 Windows 路径中的反斜杠需按 JSON 转义规则书写。二进制方式不带工作目录Windows字段值Application NameSurviving MarsCommandC:\Program Files\Epic Games\SurvivingMars\MarsEpic.exe命令直接给出带完整路径的可执行文件Sunshine 会自动将工作目录推导为该 exe 所在目录见 src/process.cpp 的find_working_directory。两种写法都能启动游戏区别仅在于工作目录的显式与隐式。2.4 Steam 游戏同样优先推荐 URIURI 方式三平台平台字段值LinuxApplication NameSurviving MarsLinuxDetached Commandssetsid steam steam://rungameid/464920macOSApplication NameSurviving MarsmacOSDetached Commandsopen steam://rungameid/464920WindowsApplication NameSurviving MarsWindowsDetached Commandssteam://rungameid/464920464920是《Surviving Mars》的 Steam AppID。使用steam://rungameid/AppID协议可绕过安装路径差异是最稳的 Steam 游戏启动方式Steam 主进程同样是启动即自更新型程序因此统一走detached。二进制方式带工作目录三平台平台字段值LinuxApplication NameSurviving MarsLinuxCommandMarsSteamLinuxWorking Directory~/.steam/steam/SteamApps/common/Survivng MarsmacOSApplication NameSurviving MarsmacOSCommandMarsSteammacOSWorking Directory~/.steam/steam/SteamApps/common/Survivng MarsWindowsApplication NameSurviving MarsWindowsCommandMarsSteam.exeWindowsWorking DirectoryC:\Program Files (x86)\Steam\steamapps\common\Surviving MarsLinux/macOS 下工作目录中的~会被展开Windows 下则需使用引号包裹的完整绝对路径注意官方文档中Survivng为原样例拼写实际请以你机器上的目录名为准。二进制方式不带工作目录三平台平台字段值LinuxApplication NameSurviving MarsLinuxCommand~/.steam/steam/SteamApps/common/Survivng Mars/MarsSteammacOSApplication NameSurviving MarsmacOSCommand~/.steam/steam/SteamApps/common/Survivng Mars/MarsSteamWindowsApplication NameSurviving MarsWindowsCommandC:\Program Files (x86)\Steam\steamapps\common\Surviving Mars\MarsSteam.exe直接给出完整可执行路径工作目录自动推导为其所在目录。此方式下若游戏依赖 CWD 加载资源可能出现资源读取失败这也是官方推荐 URI 方案的原因之一。三、Prep Commands分辨率与刷新率联动切换Prep Commands 的核心价值在串流会话开始前把主机显示器切换到与客户端匹配的分辨率/刷新率会话结束后还原。Sunshine 会在启动应用前注入客户端参数环境变量供 Prep 命令读取环境变量含义注入位置SUNSHINE_CLIENT_WIDTH客户端请求的宽度像素src/nvhttp.cpp、src/process.cppSUNSHINE_CLIENT_HEIGHT客户端请求的高度像素同上SUNSHINE_CLIENT_FPS客户端请求的帧率同上这三个变量在会话建立时由服务端根据客户端分辨率协商结果写入子进程环境因此do/undo命令中可以直接${SUNSHINE_CLIENT_WIDTH}形式引用。3.1 Linux X11xrandrPrep StepCommandDosh -c xrandr --output HDMI-1 --mode ${SUNSHINE_CLIENT_WIDTH}x${SUNSHINE_CLIENT_HEIGHT} --rate ${SUNSHINE_CLIENT_FPS}Undoxrandr --output HDMI-1 --mode 3840x2160 --rate 120官方提示上述命令仅在对应 mode 已存在时有效。macOS 与 iOS 客户端使用非标准分辨率通常需要先创建新 mode。可将Do命令替换为自定义脚本bash -c ${HOME}/scripts/set-custom-res.sh \${SUNSHINE_CLIENT_WIDTH}\ \${SUNSHINE_CLIENT_HEIGHT}\ \${SUNSHINE_CLIENT_FPS}\set-custom-res.sh内容如下#!/bin/bash set -e # Get params and set any defaults width${1:-1920} height${2:-1080} refresh_rate${3:-60} # You may need to adjust the scaling differently so the UI/text isnt too small / big scale${4:-0.55} # Get the name of the active display display_output$(xrandr | grep connected | awk { print $1 }) # Get the modeline info from the 2nd row in the cvt output modeline$(cvt ${width} ${height} ${refresh_rate} | awk FNR 2) xrandr_mode_str${modeline//Modeline \*\ /} mode_alias${width}x${height} echo xrandr setting new mode ${mode_alias} ${xrandr_mode_str} xrandr --newmode ${mode_alias} ${xrandr_mode_str} xrandr --addmode ${display_output} ${mode_alias} # Reset scaling xrandr --output ${display_output} --scale 1 # Apply new xrandr mode xrandr --output ${display_output} --primary --mode ${mode_alias} --pos 0x0 --rotate normal --scale ${scale} # Optional reset your wallpaper to fit to new resolution # xwallpaper --zoom /path/to/wallpaper.png脚本流程先用cvt依据目标宽高与刷新率生成 modeline再xrandr --newmode注册、--addmode绑定到当前活动显示器最后应用该 mode 并按需缩放。脚本第 4 个参数scale默认0.55用于在分辨率不匹配时缩放画面避免 UI/文字过大或过小。3.2 Linux Waylandwlr-xrandrPrep StepCommandDosh -c wlr-xrandr --output HDMI-1 --mode \${SUNSHINE_CLIENT_WIDTH}x${SUNSHINE_CLIENT_HEIGHT}${SUNSHINE_CLIENT_FPS}Hz\Undowlr-xrandr --output HDMI-1 --mode 3840x2160120Hz官方明确限制wlr-xrandr仅适用于 wlroots 系合成器如 Sway、Hyprland、River 等其他 Wayland 合成器不受支持。注意其 mode 语法为宽x高刷新率Hz与 xrandr 的--rate参数不同。3.3 GNOMEWayland 与 X11Prep StepCommandDosh -c xrandr --output HDMI-1 --mode ${SUNSHINE_CLIENT_WIDTH}x${SUNSHINE_CLIENT_HEIGHT} --rate ${SUNSHINE_CLIENT_FPS}Undoxrandr --output HDMI-1 --mode 3840x2160 --rate 120以上命令在X11 会话下有效但 GNOME Wayland 会话下xrandr无法工作需用gnome-randr.py脚本替代——它是 xrandr 语法的即插即用替代品。可将脚本保存到/usr/local/bin并赋予可执行权限后直接替换命令中的xrandr。3.4 KDE PlasmaWayland 与 X11Prep StepCommandDosh -c kscreen-doctor output.HDMI-A-1.mode.${SUNSHINE_CLIENT_WIDTH}x${SUNSHINE_CLIENT_HEIGHT}${SUNSHINE_CLIENT_FPS}Undokscreen-doctor output.HDMI-A-1.mode.3840x2160120KDE 使用kscreen-doctor工具语法为output.输出名.mode.宽x高刷新率注意输出名是HDMI-A-1带-A后缀与 xrandr 的HDMI-1命名不同。3.5 NVIDIA 显卡nvidia-settingsPrep StepCommandDosh -c ${HOME}/scripts/set-custom-res.sh ${SUNSHINE_CLIENT_WIDTH} ${SUNSHINE_CLIENT_HEIGHT}Undosh -c ${HOME}/scripts/set-custom-res.sh 3840 2160set-custom-res.sh内容#!/bin/bash set -e # Get params and set any defaults width${1:-1920} height${2:-1080} output${3:-HDMI-1} nvidia-settings -a CurrentMetaMode${output}: nvidia-auto-select { ViewPortIn${width}x${height}, ViewPortOut${width}x${height}00 }原理通过nvidia-settings -a CurrentMetaMode直接设置当前 MetaModeViewPortIn控制分辨率采样、ViewPortOut控制输出大小。若驱动未加载或 X 配置不使用 MetaMode此命令可能无效。3.6 macOSdisplayplacerdisplayplacer是第三方分辨率切换工具。使用前需先获取screenId可运行displayplacer list查询再将示例中的screenId替换为实际值Prep StepCommandDodisplayplacer id:screenId res:1920x1080 hz:60 scaling:on origin:(0,0) degree:0Undodisplayplacer id:screenId res:3840x2160 hz:120 scaling:on origin:(0,0) degree:0参数含义res分辨率、hz刷新率、scaling:on开启 HiDPI 缩放、origin屏幕位置、degree旋转角度。它支持一次性配置多显示器用分隔多段描述。3.7 WindowsQResQRes 是 Windows 下的分辨率/刷新率切换命令行工具Prep StepCommandDocmd /C FullPath\qres.exe /x:%SUNSHINE_CLIENT_WIDTH% /y:%SUNSHINE_CLIENT_HEIGHT% /r:%SUNSHINE_CLIENT_FPS%Undocmd /C FullPath\qres.exe /x:3840 /y:2160 /r:120Windows 环境变量引用语法为%VAR%而非 Linux 的$VAR且需用cmd /C包裹。FullPath请替换为 qres.exe 的实际安装路径。除 QRes 外Windows 平台也可考虑结合display_vdd/ 虚拟显示器方案实现分辨率跟随见 src/platform/windows/display_vdd.cpp。四、附加注意事项Additional Considerations4.1 LinuxFlatpak环境由于 Flatpak 包运行在沙箱环境中默认无法访问宿主机因此 Sunshine 的 Flatpak 版本要求所有命令以flatpak-spawn --host作为前缀例如flatpak-spawn --host setsid steam steam://open/bigpictureflatpak-spawn --host会在宿主机上下文中执行后续命令从而突破沙箱限制调用宿主机的显示服务器与游戏进程。4.2 Windows命令提权Elevated如果你以服务方式安装 Sunshine默认行为可以指定命令是否以管理员权限运行。在 Web UI 中勾选 elevated 选项或在 JSON 配置中设置elevated字段即可。该选项同时适用于prep-cmd与普通命令会以当前用户身份启动进程且不弹出 UAC 提示。官方特别提醒JSON 中必须将true/false写成字符串值而不是大多数 JSON 中惯用的布尔值true/false。这对应 src/config.cpp 中elevated的解析逻辑。完整示例如反作弊需要管理员权限的游戏{ name: Game With AntiCheat that Requires Admin, output: , cmd: ping 127.0.0.1, exclude-global-prep-cmd: false, elevated: true, prep-cmd: [ { do: powershell.exe -command \Start-Streaming\, undo: powershell.exe -command \Stop-Streaming\, elevated: false } ], image-path: }要点拆解顶层elevated: true主命令以管理员权限启动exclude-global-prep-cmd: false不排除全局 Prep 命令即全局 prep 与条目级 prep 都会执行prep-cmd数组内每项含do/undo与各自的elevated此处 prep 以普通权限运行output留空字符串表示不写日志image-path留空表示使用默认封面该 JSON 结构由 src/config.cpp 解析支持detached、working-dir、elevated、prep-cmd含do/undo/elevated、menu等节点其中working-dir会先做环境变量展开并剥离多余引号。4.3 源码侧的行为佐证上述字段并非仅在文档中存在执行逻辑均可在 src/process.cpp 中验证工作目录兜底working_dir未配置时find_working_directory 从命令解析可执行文件所在目录do、undo、detached命令统一复用该逻辑见 src/process.cpp分离命令detached命令经platf::run_command(_app.elevated, true, ...)启动属于发射后不管模式src/process.cpp优雅退出兜底若应用在启动后 5 秒内自行退出Sunshine 会将其视为 detached 命令处理不判定为启动失败src/process.cpp这正是 Steam 类自更新后退出首进程应用能正常工作的另一重保障环境变量注入SUNSHINE_CLIENT_WIDTH/HEIGHT/FPS在会话启动时写入应用环境src/process.cpp供所有do/undo/cmd命令引用。五、总结选择配置策略的决策要点场景推荐方案直接串流桌面Desktop 封面图命令留空Steam / Steam 游戏steam://...URI Detached Commands跨平台一致Epic 游戏com.epicgames.launcher://...URI 优先其次二进制 Working Directory客户端分辨率与主机不一致按桌面环境选择对应 Prep Commandsxrandr / wlr-xrandr / kscreen-doctor / displayplacer / QRes非标准分辨率客户端macOS/iOS使用set-custom-res.sh动态创建 mode 并配合缩放Flatpak 安装的 Sunshine所有命令加flatpak-spawn --host前缀Windows 服务模式 反作弊游戏顶层elevated: trueprep 按需独立设置掌握这些模板后你可以直接在 Sunshine Web UI 的应用编辑页逐一填写字段也可以参照 docs/configuration.md 了解配置文件的整体结构再结合 src_assets/linux/assets/apps.json 等平台默认应用清单比对字段格式。所有示例均以最小可运行为原则——先让游戏跑起来再逐步补充封面、日志与分辨率联动即可获得完整的 Moonlight 串流体验。赞分享音视频【免费下载链接】foundation-sunshineSunshine fork: an enhanced sunshine, a self-hosted game streaming host for Moonlight with HDR10/HDR Vivid, virtual displays, advanced audio, optimized encoders, and a modern control panel.项目地址https://gitcode.com/gh_mirrors/sunshine5/foundation-sunshine点击查看免费下载相关推荐大麦抢票自动化完整指南三步搭建你的抢票脚本大麦抢票自动化完整指南三步搭建你的抢票脚本 大麦抢票自动化系统 ticket purchase 是一款基于 Selenium 和 Appium 的开源工具覆GUI 自动化RPASunshine配置完全指南从入门到精通Sunshine是一款开源的游戏串流服务器软件它能够将你的游戏主机或高性能PC的游戏画面通过网络实时传输到其他设备上。无论你是在客厅、卧室还是移动设备上都可音视频后端Create T3 App 应用部署到 Netlify从 netlify.toml 配置到 Dashboard 与 CLI 的完整实战指南Create T3 App 应用部署到 Netlify从 netlify.toml 配置到 Dashboard 与 CLI 的完整实战指南 本指南以官方文档《开发工具CLI代码生成上一篇如何用 ActiveScan 检测盲代码注入时间延迟与 Collaborator 双引擎原理解析下一篇DL on Flink完全指南5步构建实时AI应用 创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表