Moonlight Game Streaming(月光)是能讓你用手機筆電串流玩另一台電腦遊戲的開源軟體,同時有遠端桌面的功能。
Moolight最初是針對Nvidia Gamestream所開發的開源軟體。後來出現了另一款Sunshine伺服器軟體,使遊戲串流能在Intel、AMD顯示卡運作,不限於Nvidia顯示卡。並且Sunshine能夠在Linux、Windows、macOS系統執行。
Moonlight主要依賴GPU傳輸畫面,因此CPU佔用較低。它的串流能力十分優秀,能夠做到低延遲玩遊戲的效果。
實際操作請看以下影片
本文將示範在性能較強的Linux桌機安裝Sunshine,並用性能較弱的Linux筆電遊玩桌機上的《戰爭雷霆》,後面再討論如何架設ZeroTier服務以達成在外面也能連線到家中電腦。
1. 安裝Sunshine伺服器#
Sunshine最初由 loki-47-6F-64開發,現請使用 LizardByte維護的新版本Sunshine。
- 安裝Sunshine的電腦必須要連著實體螢幕,讓Linux能輸出畫面,不然就得準備HDMI欺騙器了。
如果你懂得撰寫X.org設定檔的話,也可以參考 Level1Techs玩家的作法在headless伺服器新增虛擬螢幕。
Sunshine支援X11與Wayland工作階段,Nvidia顯示卡記得要 安裝CUDA套件。
接著安裝Sunshine本體: 官方文件有列出各發行版的安裝方法。例如Ubuntu就是從 Github裝對應版本的deb檔:
wget https://github.com/LizardByte/Sunshine/releases/download/v0.23.1/sunshine-ubuntu-24.04-amd64.deb
sudo apt install -f ./sunshine-ubuntu-24.04-amd64.deb
sudo reboot
- 安裝Sunshine後還要設定Sunshine的服務。
2. 設定Sunshine伺服器服務#
- 將自己加入input群組:
sudo usermod -a -G input $USER
sudo reboot
- 編輯Sunshine規則:
sudo vim /etc/udev/rules.d/85-sunshine-input.rules
- 加入以下內容:
KERNEL=="uinput", GROUP="input", MODE="0660"
- 編輯uinput:
sudo vim /etc/modules-load.d/uinput.conf
- 加入以下內容,防止
Could not create Sunshine Mouse: Permission denied
錯誤:
uinput
- UFW開啟防火牆,允許以下幾個通訊埠(port)連入:
sudo ufw allow 47984/tcp
sudo ufw allow 47989/tcp
sudo ufw allow 48010/tcp
sudo ufw allow 47988/udp
sudo ufw allow 47998/udp
sudo ufw allow 47999/udp
sudo ufw allow 48000/udp
sudo ufw allow 48002/udp
sudo ufw allow 48010/udp
sudo ufw reload
- 啟用Avahi服務
sudo systemctl enable --now avahi-daemon
- 啟動Sunshine系統服務。注意Sunshine是使用者服務,不是系統服務。
systemctl --user start sunshine
# 設定開機登入後自動啟動
systemctl --user enable sunshine
# 查看Sunshine運作情況
systemctl --user status sunshine
# 若是AppImage,service可能會指向tmp目錄導致無法啟動,要自行編輯~/.config/systemd/user/sunshine.service,修正Exec=為sunshine.AppImage的所在路徑
# 查看更詳細的Sunshine log
journalctl --user-unit sunshine
用瀏覽器開啟
https://localhost:47990
,設定Sunshine後台的帳號密碼。之後頁面會重新載入,登入Sunshine後台。
3. 安裝Moonlight客戶端#
Moonlight的客戶端(Client)支援Linux/Windows/MacOS/Android/iOS,請到 官網下載。
開啟Moonlight連線客戶端,確認桌機和筆電都連線到同一個Wifi,筆電的Moonlight客戶端應該就會掃描到電腦了。點選電腦圖示,會出現一組配對碼。
桌機Sunshine後台點選Pair,輸入配對碼。
點選電腦圖示再點選"Desktop",筆電端就可以存取電腦桌面了。
選擇Desktop的界面能使用設定檔(
~/.config/sunshine/sunshine.conf
)或是Sunshine後台加入要快速啟動的程式。如果延遲嚴重試著在Moonlight客戶端調低畫質和FPS。
遠端桌電的聲音也會一併傳輸過來,聽不到的話試著調整遠端主機的PulseAudio輸出模式。
4. Moonlight啟動Steam遊戲#
Moonlight客戶端支援用遊戲手把、鍵盤、觸控螢幕遠端操控遊戲;手機版Moonlight APP由下往上三指滑動開啟鍵盤。由於手把要看遊戲有無支援,甚至還要搞按鍵映射,因此這邊是用筆電的鍵盤滑鼠作遠端操控。
Moonlight客戶端能夠直接啟動Steam的Big Picture Mode,不過若Steam是用Snap或Flatpak安裝的就得手動開啟。
進入Big Picture Mode後,直接開啟遊戲吧。
實際用Moonlight遠端遊戲打了幾場空戰,偏靜態的畫面還算清楚。
不過畫面一複雜就可能變馬賽克了(下圖畫面是真的很模糊)。即使是區域網路都有這種問題,從外面連線回來這種真遠端就更不用說了,後面會探討一些解決方式。
5. 透過內網穿透遠端存取Sunshine#
虛擬區域網路軟體是用於內網穿透的工具,使其不受Wifi網路的限制,讓二部不同網路的裝置連線到一個虛擬區域網路。
此處使用ZeroTier,請參考 ZeroTier使用教學,原理差不多,將二台裝置都連上ZeroTier網路,並開啟9993通訊埠給ZeroTier做P2P。
Moonlight客戶端連線會找不到ZeroTier網路上的電腦,請直接按右上角以ZeroTier分配的區域IP新增電腦:
6. 解決Moonlight連線延遲#
非區域網路連線下,Moonlight(Sunshine)的伺服端上傳網速需求為40Mbps(每秒5MB)以上,ping值小於50ms,才能流暢串流720p30FPS的遊戲;要玩1080p60FPS遊戲則是需要160Mbps的上傳速度。
Moonlight客戶端的位元速率(Bitrate)最好設定為低於遠端電腦的上傳速度,串流才不會卡卡。
藉ZeroTier從外網連線到桌機上的Sunshine服務一定會有延遲,下面是我嘗試過的解決方法。
- 將系統NetworkManager的DNS伺服器設定為
8.8.8.8
- 用
zerotier-cli peers
查看二個節點間是否有P2P成功,若成功會顯示為LEAF
。 - 從本機ping遠端主機的IP看延遲,100ms以內延遲才夠低。
- Speedtest測試一下網速。
- 重開數據機與路由器。