ゲームをどこでも!ラーメン屋に学ぶ「Sunshine」の導入と活用法
想像してみてください。あなたは最高に美味しいラーメンを作る天才的な職人。あなたのラーメン(ゲーム)を求めて、遠くからお客様(Moonlight)がやってきます。
お客様 (Moonlight)
「あぁ、あの店のラーメンが食べたい!でも遠いな...」
ラーメン職人 (Sunshine)
「大丈夫!私が作ったラーメンの香りを、遠くのあなたに届けてあげましょう。そして、あなたの"いただきます"(操作)を、私の厨房に素早く伝えてもらえれば、本物のラーメンのように楽しめるはずです!」
これが「Sunshine」と「Moonlight」の関係です。 Sunshine(ラーメン職人)はあなたのPCにインストールされ、PCのゲーム画面(ラーメン)を圧縮・エンコードして、ネットワーク経由でMoonlight(お客様のデバイス)に送信します。同時に、Moonlightからのキーボードやコントローラーの入力("いただきます"という合図)を素早く受け取り、ゲームに反映させます。
つまり、このツールを使えば、高性能なゲームPCをリモートで操作し、別のデバイス(スマートフォン、タブレット、別のPCなど)でゲームをストリーミングプレイできます。
単なるゲームツールとしてだけでなく、ソフトウェアエンジニアの視点から見ると、このプロジェクトは非常に魅力的です。
セルフホスト型であること
クラウドサービスのように、月額利用料や通信料を気にせず、自分の環境を完全にコントロールできます。セキュリティやプライバシーの面でも安心。
オープンソースであること
ソースコードが公開されているため、どのように動いているかを深く理解でき、自分のニーズに合わせてカスタマイズや機能追加も可能です。
技術スタック
python、docker、cpp といった、モダンな開発で広く使われる技術が使われています。プロジェクトを通じて、これらの技術を使った開発や運用スキルを磨く良い機会になります。例えば、C++でパフォーマンスが求められるエンコーディング処理を実装し、PythonでWebインターフェースや設定ツールを開発するといった構成は、よくあるアーキテクチャパターンです。
パフォーマンス最適化
ゲームストリーミングでは、いかに低遅延で高画質な映像を転送するかが鍵となります。このプロジェクトのコードを分析することで、リアルタイム通信や動画エンコーディングに関する技術的な知見を深められます。
Sunshineの導入方法はいくつかありますが、ソフトウェアエンジニアに一番おすすめなのはDockerを使う方法です。環境構築の手間が省けて、クリーンに始められます。
まるで、ラーメン屋の厨房をあっという間に組み立てるようなものです。
まずは、お使いのPCにDockerをインストールしてください。
次に、コマンドプロンプトやターミナルを開いて、以下のコマンドを実行します。
docker run -it --network=host --name sunshine \
-v /var/run/dbus:/var/run/dbus \
-v /dev/dri:/dev/dri \
-v /etc/machine-id:/etc/machine-id \
-e PUID=$(id -u) \
-e PGID=$(id -g) \
lizardbyte/sunshine:latest
解説
docker run
コンテナを起動するおまじない。
-it
インタラクティブな操作を可能にします。
--network=host
ホストPCのネットワークを直接使います。これにより、ポートフォワーディングなどを気にせずMoonlightと通信できます。
-v
ボリュームのマウント。PCの特定ディレクトリをコンテナ内に共有します。
/dev/dri
GPUへのアクセスに必要です。高速なエンコーディングには欠かせません。
/etc/machine-id
一部のシステム識別情報に必要です。
コンテナが起動したら、http://localhost:47990 にアクセスして、SunshineのウェブUIを開きます。ここで、ゲームの追加やストリーミング品質の設定などを行います。
ポイント
PINコード
Moonlightから接続する際に必要なPINコードが表示されます。メモしておきましょう。
アプリケーション
「アプリケーション」タブで、ストリーミングしたいゲームやアプリケーションを追加します。Steam、Epic Games Launcher、特定のゲームの実行ファイルなど、何でも追加できます。
最後に、ストリーミングしたいデバイス(スマホ、タブレットなど)にMoonlightクライアントをインストールします。Moonlightを起動すると、ネットワーク上のSunshineホストが自動的に検出されます。
ホストを選択し、表示されたPINコードを入力すれば、接続完了!これで、どこにいてもあなたの作ったラーメン(ゲーム)が楽しめるようになります。
もしあなたが、Sunshineの機能を拡張したいと考えたなら、Pythonで以下のようなスクリプトを作成することができます。これは、特定のゲームが起動したときに、自動的にSunshineの設定を最適化するという例です。
import requests
import time
SUNSHINE_API_URL = "http://localhost:47990/api/v1"
SECRET_KEY = "your_secret_key" # UIで設定したAPIキー
def get_status():
"""Sunshineの現在の状態を取得する"""
headers = {"Authorization": f"Bearer {SECRET_KEY}"}
response = requests.get(f"{SUNSHINE_API_URL}/status", headers=headers)
return response.json()
def set_quality(quality_preset):
"""ストリーミング品質を設定する"""
headers = {"Authorization": f"Bearer {SECRET_KEY}"}
data = {"quality_preset": quality_preset}
requests.post(f"{SUNSHINE_API_URL}/config", json=data, headers=headers)
if __name__ == "__main__":
game_running = False
while True:
status = get_status()
# 例: 「MyGame.exe」が実行中かチェック
if "MyGame.exe" in status["current_application"] and not game_running:
print("MyGameが起動しました。高品質設定に切り替えます。")
set_quality("high_quality") # 高品質プリセットに設定
game_running = True
elif "MyGame.exe" not in status["current_application"] and game_running:
print("MyGameが終了しました。デフォルト設定に戻します。")
set_quality("default") # デフォルトプリセットに設定
game_running = False
time.sleep(5)
このサンプルコードは、SunshineのRESTful APIを利用しています。 APIを使えば、外部のスクリプトからSunshineの設定をプログラム的に変更できるので、自動化や他のサービスとの連携が簡単にできます。