游戏优先,而非设备优先
已配对设备存在时,启动直接进入最近主机的游戏库。设备选择器只是全局切换入口,不再成为每次启动都必须经过的上一级页面。
从 PC 串流工具,演进为面向多游戏平台的统一入口
基于 Moonlight Android、Sunshine 与 chiaki-ng 的多端重构:已完成统一游戏库、设备管理、PC 会话接管和 PS5 实机串流,并以本地视觉识别验证 PlayStation 游戏目录与按游戏启动;Xbox 与原装 Switch 继续沿平台适配边界推进。
01启动直达游戏库
02统一平台目录
03平台协议适配
04低延迟串流
05会话接管
背景与目标
原版产品围绕一台 PC 展开:先选择宿主机,再查看由这台主机提供的应用。Moonlight+ 的目标则是让用户从一个游戏库进入不同平台,所以平台必须成为稳定的领域属性,而 PC、PlayStation、Xbox 或 Switch 只是提供游戏与串流会话的不同 Provider。
改造先在不破坏 PC 串流能力的前提下完成信息架构、交互状态和会话模型,再把各平台的发现、认证、目录、启动、输入与断线恢复收口为可替换适配层。PlayStation 已从前期协议调研进入真实 PS5 联调;视觉目录虽然已经形成可运行原型,但仍明确保留识别概率、系统界面变化和自动化超时等能力边界。
设计与架构
页面调整同时落实到领域属性和会话状态模型。
已配对设备存在时,启动直接进入最近主机的游戏库。设备选择器只是全局切换入口,不再成为每次启动都必须经过的上一级页面。
平台是默认领域分组;名称、添加时间是组内排序。先按平台聚合,再分别排序,避免把不同生态的游戏混成一条全局序列。
每个快捷串流入口都同时表达开始、继续、退出;跨设备接管则由服务端能力声明、客户端确认和原子化切换共同完成。
协议调研
参考代码已按版本保存在本地,后续使用真实硬件逐项验证。
沿用成熟的 GameStream 兼容协议与硬件编解码链路,并在客户端和宿主端同时扩展会话能力。
作为 Android Library 与 JNI 原生库进入同一 APK,已验证注册、唤醒、局域网音视频和输入;视觉游戏目录仍按实验能力管理。
MIT 许可,覆盖微软认证、xHome 与 WebRTC;greenlight 作为桌面端行为和兼容性的第二参考。
原装系统没有 Remote Play 协议;Bridge 负责采集、识别和编码,ESP32-S3 在底座 USB 口模拟手柄,SysDVR 仅保留为 CFW 参考。
Switch 的实现约束
底座 HDMI 交给 1080p60 UVC/UAC 采集卡,x86 Bridge 负责视觉识别、硬件编码和 Sunshine 会话;ESP32-S3 插在底座 USB 口模拟 Pro Controller,并通过串口或局域网与 Bridge 交换按键、手机体感和震动。自动唤醒优先评估二手官方 Pro Controller 的 HOME 触点混合方案,游戏扫描则沿用“缓存优先、差异提示、用户确认刷新”的产品策略。
PlayStation 实机阶段
协议核心保持独立,设备、游戏和会话在 Moonlight+ 入口统一呈现。
chiaki-ng 的 Kotlin UI、Room 数据层、C/C++ Remote Play 核心与 JNI 以 Android Library 进入主工程,四种 ABI 均可构建,不再跳转到独立安装的客户端。
受限 WebView 承载 Sony 登录页,回调后只换取 numeric user_id 并转换为 Chiaki 所需的 8 字节 Account ID;注册过程以进度文本替代底层日志。
可隐藏整套虚拟按键,同时保留可拖动、贴边、三秒后半隐藏的悬浮 PS 键;Touchpad Only 模式也不会丢失系统菜单入口。
解码帧只在设备本地进入 OCR 与版面分析,扫描时不确认启动游戏;名称、封面指纹和位置写入按主机隔离的缓存,返回游戏库后稳定展示。
已运行目标游戏时直接恢复画面;释放旧 Remote Play 会话后遇到暂时性的主机占用,会按有限次数重试,而不是把用户重新带回注册或首页遍历。
在联想 Y700 上复现“长按后持续按下”的触控板故障,逐层追踪 Android MotionEvent、反馈队列与终止包,最终分离 terminal event 并保证 release 到达。
视觉目录没有 Sony 官方游戏列表接口可依赖,当前仍可能受主题、语言、首页状态和 OCR 命名影响而漏扫或误命名;因此扫描、自动启动和失败回退持续以可取消实验能力呈现。
24 秒实机演示
传统 PS Remote Play 客户端通常以“选择主机—进入当前画面”为入口。Moonlight+ 在主机注册后进一步扫描并缓存游戏,让 PlayStation 条目与 PC 游戏一起出现在统一游戏库;用户点击封面后,应用在不展示菜单跳转的准备层中定位并启动目标游戏。
开发日志
下载并固定 Moonlight、Sunshine、chiaki-ng、XStreaming、greenlight、SysDVR、ns-remote 与 pyremoteplay 源码;把协议参考仓库与应用工程隔离,避免许可证和构建系统意外混入。
替换应用图标,增加品牌载入动画;读取最近使用的主机,在启动阶段直接打开游戏库,消除先出现“添加机器页”再跳转的闪屏。
设备管理从默认首页变成独立页面。游戏库左上角入口负责打开设备选择器,但两页保持平级;系统返回仍按 Android 预期退出应用。
删除厂商排序,以平台作为默认且不可关闭的一级分组;空平台不渲染,名称或添加时间排序在各平台内部独立执行。
Desktop 与 Steam 快捷入口加入运行态判断;再次点击时提供继续或退出选项,并复用已有的确认、停止与轮询逻辑。
在 Sunshine 暴露能力与活动会话数;新设备确认接管后仅终止旧 RTSP 会话、保留当前应用,再通过 takeover 参数恢复串流。
把 chiaki-ng Android 客户端、C/C++ 核心和 JNI 作为库模块打进 Moonlight+,保留 Room 凭据边界,并完成 PS5 发现、账号、注册、唤醒、解码和输入的实机闭环。
把添加 PS 主机收口到统一设备页,注册过程隐藏底层日志并改为进度状态;主机详情、设置、缓存展示和游戏库刷新遵循与 PC 相同的交互语言。
在 Remote Play 解码帧上使用本地 OCR、版面特征和封面指纹扫描 PS5 首页;目录与封面按主机缓存,自动启动期间用可取消进度层隐藏菜单操作。
目标游戏已经运行时直接恢复画面,并对释放旧会话后的暂时占用进行有限重试;同时通过实机日志修复 Y700 上触控板长按后 release 丢失和滑动失效。
界面对比
同一台横屏 Android 设备上的原版 Moonlight 12.0.1 与当前 Moonlight+ 实机截图。
新版记忆最近主机并直达游戏库;左上角设备按钮负责添加、删除和切换主机,同时不改变 Android 系统返回的含义。


平台分类默认生效且空分组自动隐藏;排序在每个平台内部单独执行。Desktop 与 Steam 作为有运行状态的快捷入口固定在顶部工具区。


构建与验证
统一 APK 已覆盖 arm64-v8a、armeabi-v7a、x86 与 x86_64,并在 Android 设备和真实 PS5 上验证注册、唤醒、串流与输入;Sunshine 端为 takeover 参数增加了服务端能力和单元测试。
当前证据覆盖 PC、Sunshine 接管和 PS5 局域网主链路。PlayStation 视觉识别仍需提高完整率与命名稳定性;远程 IPv6、Xbox 与 Switch 硬件桥尚未进入完成状态。
后续计划
补充不同首页位置、主题、语言和运行状态样本,提高漏扫、命名与直接恢复的确定性。
继续区分可开始、可继续、未下载完成、需要用户选择及其他不可直接游玩的状态。
采购 1080p60 UVC/UAC 采集卡和 x86 Bridge,先测量采集、编码与端到端延迟。
使用 ESP32-S3 验证 USB HID、手机体感和震动回传,再进入视觉游戏目录阶段。