- Moonshineは、PCゲームの映像をMoonlightクライアントへ送信し、キーボード・マウス・コントローラー入力をホストへ返送してリモートプレイを実現するLinuxホスト
- ストリームごとに独立したWaylandコンポジタを使用してデスクトップと分離し、ストリーミング中でもホストPCを使い続けられ、モニターのないサーバーでも実行可能
- GPUによるH.264・H.265・AV1エンコード、10ビットHDR、モーション・タッチパッド・ハプティクスを含む入力、Opusベースの低遅延5.1・7.1chオーディオをサポート
- Linuxとsystemd、Vulkanビデオエンコードに対応したNVIDIA RTX・AMD RDNA2+・Intel Arc GPU、Moonlight v6.0.0以降が必要
- GameStreamプロトコルのトラフィックはアプリケーション層で完全には暗号化されないため、ポートをインターネットへ直接公開してはならず、外部アクセスにはTailscale・WireGuard・ZeroTierのようなVPNが必要
分離されたゲームストリーミング
- 各アプリケーションは、ホストのデスクトップから分離された専用のストリーミングセッションで実行される
- ストリーミング中でもホストPCを別の作業に使える
- アクティブなデスクトップセッションやモニター、HDMIダミープラグなしでヘッドレスサーバー上で動作する
- GPUのVulkanビデオエンコードでH.264・H.265・AV1を処理する
- 対応ゲームでは実際の10ビットHDRストリーミングを提供する
- マウス、キーボード、ゲームパッドに対応し、ゲームパッドのモーション・タッチパッド・ハプティクス入力も扱える
- オーディオは低遅延のOpusエンコードを使用し、ステレオと5.1・7.1サラウンドに対応する
動作要件
- 現在はLinux専用で、Arch Linuxでテストされており、ほかのLinuxディストリビューションでも動作例がある
- アプリケーションプロセスの起動と管理にはsystemdが必要
- VulkanビデオエンコードをサポートするNVIDIA RTX、AMD RDNA2以降、またはIntel Arc GPUが必要
- クライアントはMoonlight v6.0.0以降である必要があり、それ以前のバージョンや非公式ポートとの互換性は保証されない
インストールと実行
- Arch LinuxではAUR経由で
yay -S moonshineとしてインストールできる - ユーザーがログアウトした状態でもアプリケーションを実行するには
sudo loginctl enable-linger $USERを使う- ストリーミング時にユーザーが常にログインしているなら、この手順は省略できる
sudo systemctl enable --now moonshine@$USERで起動時にサービスを開始し、即座に実行する- ソースビルドにはclang、CMake、Rust、Wayland、Vulkanヘッダー、shaderc、Mesa、Opus、PulseAudio関連ライブラリなどが必要
- ビルド後は
cargo run --release -- /path/to/config.tomlで実行する
設定とクライアント接続
- 指定したパスにファイルがなければ設定ファイルを自動生成する
- AURパッケージの既定パスは
$XDG_CONFIG_HOME/moonshine/config.toml
- AURパッケージの既定パスは
- Moonlightは初回接続時にPINを表示し、ホスト通知または
http://localhost:47989/pinからペアリングできる /submit-pinエンドポイントへuniqueidとpinをPOSTして、コマンドラインからもペアリング可能
アプリケーション構成
config.tomlの[[application]]ごとに、分離セッションで実行するプログラムを定義するtitle: Moonlightに表示する名前boxart: 任意のカバー画像パスcommand: 実行ファイルと引数の一覧
pre_commandはアプリケーション開始前にコマンドを順番に同期実行し、すべて完了するまでセッションは待機するpost_commandはストリーミング終了後にコマンドを順番に同期実行し、すべて完了するまでサーバーは待機する- これを使って競合するサービスを停止したり、ストリーミング前後でGPU状態を変更したりできる
自動アプリケーション探索
- Steamスキャナーは指定したSteamライブラリからインストール済みゲームを見つけ、ゲームIDを含む実行コマンドを構成する
- Desktopスキャナーは指定ディレクトリ内の
.desktopファイルからアプリケーションを見つける- ターミナルアプリケーションを含めるかどうか、アイコンパスを解決するかどうかを設定できる
Sunshineとの違いと制限
- Sunshineはより多くのプラットフォームと全体的に多くの機能をサポートするが、MoonshineはLinux専用
- Moonshineの差別化ポイントは、ストリーミングセッションをデスクトップから分離することでホストを使い続けられ、アクティブなデスクトップがなくても動作する点
- 2つのクライアントへの同時ストリーミングは現在サポートされておらず、プロジェクトの重点でもない
ネットワークセキュリティ
- Moonshineは公開ネットワーク向けには設計されていない
- 基盤となるGameStreamプロトコルの制約により、トラフィックはアプリケーション層で完全には暗号化されない
- インターネット越しのストリーミングにはTailscale、WireGuard、ZeroTierのようなVPNを使う必要があり、Moonshineのポートを直接公開してはならない
ベースとなるプロジェクト
- Moonlight: Moonshine向けクライアントを提供
- Sunshine: ホストAPIの基盤を提供
- Inputtino: 入力デバイス実装の基盤を提供
- magic-mirror: VulkanとWaylandコンポジタを使ったヘッドレスストリーミングの着想元
1件のコメント
Hacker Newsのコメント
要するに、Nvidia GameStreamは独自技術だったがNvidiaが廃止し、その後SunshineとMoonlightが全プラットフォームで低遅延ストリーミングをサポートするオープンソースのサーバー・クライアントとして登場した
Game on Whalesはマルチユーザーストリーミングと仮想ディスプレイを加え、既存のログインセッションに影響しないセルフホスト版Stadia/GeForce Nowに近く、Steam・Firefoxなどを選別されたコンテナで実行する
その後ApolloとArtemisが仮想ディスプレイのストリーミングを簡単にしたが、Apolloの仮想ディスプレイは実質的にWindows専用で、MoonshineはこれをLinuxサーバーで実装している
Apolloから分岐したVibepolloはほぼ全面的にバイブコーディングで作られた改良版なので、個人的には使うつもりはないが、この系譜で抜けているものがあるか気になる
SteamはGoogleと違ってすでに顧客基盤まで持っているので、明日にでもあらゆるハードウェアで所有ゲームを実行するStadia風サービスを発表しても驚かない気がする
Sunshineはストリーミング中にホスト画面にもゲームが表示されるが、Moonshineは物理ディスプレイなしで実行したり、複数のゲームを同時に実行できるという意味なのか確認したい
Sunshineがそれを実ディスプレイとして認識するので、電源とLANケーブルだけ残せばよく、HDMIダミープラグや仮想ディスプレイドライバーなしでもLinuxゲームサーバーがうまく動く
Windowsでリモートゲーム中でも他の人がサーバーを使えるのか気になる。見つけた仮想ディスプレイソリューションの大半はサーバーディスプレイを消してしまう
Moonshineの開発者です。中核はSunshineと似ているが、既存のデスクトップ環境に依存せず独自コンポジターを生成する点が違う
デスクトップ環境なしでヘッドレス実行でき、ダミープラグなしで任意の解像度・リフレッシュレートを作れ、モニターが対応していなくてもHDRを使える。既存デスクトップを使いながら同時にゲームをストリーミングすることも可能だ
技術的には、Vulkanエンコーダー1つ、Linux 1つ、GUIなし、旧Moonlightクライアント非対応という狭い範囲を意図的に選び、コードベースを軽く保っている。その代わり、比較的新しいGPU・ドライバーと新しいMoonlightクライアントが必要になる
2022年から作っていた趣味プロジェクトで、当初はSunshineより劣っていたためREADMEで使わないよう勧めていたが、差別化できる機能が生まれた後にその文言を削除した
新規ユーザーには、情報が豊富でうまく動く可能性が高いSunshineをまず勧めるが、新しいものを触るのが好きならMoonshineも悪くない
独自コンポジター構造の都合上、完全なデスクトップ環境を動かすのは難しそうだが、Linuxにはアプリを1つずつでも安定してリモート実行できる方法が切実に必要だ。KDEやGNOMEの内蔵サーバーは全般的に問題が多く、モニターも点いていなければならない
SunshineとMoonlightで、デスクトップ上でエミュレーションしてアップスケールしたPS2ゲームSSX Trickyを、7年以上前のAndroidセットトップボックスに非常に滑らかにストリーミングできた
ただしデスクトップ画面にゲームがそのまま表示されるので、他の人が遊んでいる間はホストを使えなかったが、Moonshineはこれを解決してくれそうだ。すでに素晴らしかった組み合わせに最後の仕上げを加えたようなものだ
MacBookにDualSenseを接続し、Moonlightを開いてゲーム用デスクトップへフルスクリーン接続し、SteamのAAAゲームを起動する形でMoonlightとApolloを使っている
Wi‑Fi 7では体感できるような遅延はほとんどなく、大型TVにつないだMinisforumにもDualSenseの別ボタン組み合わせで接続できる。Apolloが設定を保存してくれるので、2台の機器の間をほぼ問題なく切り替えられる
スマホは映像を再生するだけなので熱くならず、バッテリーも長持ちする
Moonshineがセッションごとに仮想デスクトップのようなものを作るのか、単なる別画面なのか、それとも完全に独立したコンポジターインスタンスなのか気になる
PCでSwitchゲームをエミュレーションし、旧型のWii Uと3DSへストリーミングするのにこの方式を使っている
MoonlightとSunshineの組み合わせをRTX 4000 Pro GPUサーバーで満足して使っている
接続されたクライアントに合わせた自動解像度調整だけが惜しかったが、Home Assistant Windowsクライアントでスクリプトを書いて解決した
ノートPCから携帯電話へSunshineとMoonlightのストリーミングを設定しようとガイドに従ったが、実用的な結果は得られなかった
休息として遊ぶはずのゲームのための限られた余暇の1週間を、コーデック・遅延・Wi‑Fi設定・複数アプリの調整に費やしてしまい諦めたが、約3年経った今は改善されたのか気になっている
結局やろうとしていたゲームはローカルマルチプレイしか対応しておらず、ProtonDBの限定的互換判定とは違ってノートPCでそのまま動いたのでストリーミングは不要だったが、設定自体は容易だった。Tailscaleも使った
無線は理想的な環境でも再送が必要なパケットがはるかに多いので、Wi‑Fiはクライアント側だけで使うほうがよい
GPUを直結したROS 2開発用VMにリモート接続するためにSunshineとMoonlightを使っている
古いUbuntuが必要だったのでVMを選び、GazeboシミュレーションのためGPU直結が必要だった。RDPではデスクトップがひどく遅く無反応だったが、この組み合わせで実用的になった
自前のPCゲームストリーミングは、Nvidiaの機能を有効にするだけだった時代より設定がずっと難しくなった
最後に試したときは動かし方がわからず諦めてしまい、ほかの利点はあってもオープンソース開発者は使い勝手を十分に重視していないように思える
YouTubeのガイドやAIの助けも借りられ、実際にLinuxディストリビューションのファイアウォールがストリーミング用ポートを塞いでいる原因をAIと一緒に突き止めたこともある
最初はローカルネットワークから始めて、インターネット経由のストリーミングは後で設定するのがよいが、WireGuardやTailscaleのようなホームVPNがあれば難しくないかもしれない。ホストは有線が最適で、クライアント側のWi‑Fiも6GHz対応ならだいたい問題ない
PS Remote Playほど魔法のように簡単ではないが、もう一度試してみることを勧める
推奨事項とは違ってホストもWi‑Fiだったが問題なく、ここ数年で体験した技術の中で最も魔法のような瞬間だった。ただし使ったのはローカルWi‑Fiストリーミングだけだった