- Moonshine คือโฮสต์บน Linux ที่รองรับการเล่นระยะไกล โดยส่งภาพเกม PC ไปยังไคลเอนต์ Moonlight และส่งอินพุตจากคีย์บอร์ด เมาส์ และคอนโทรลเลอร์กลับไปยังโฮสต์
- ใช้ Wayland compositor แยกสำหรับแต่ละสตรีมเพื่อแยกออกจากเดสก์ท็อป ทำให้ยังใช้ PC โฮสต์ต่อได้ระหว่างสตรีม และรันได้แม้บนเซิร์ฟเวอร์ที่ไม่มีมอนิเตอร์
- รองรับการเข้ารหัส H.264, H.265, AV1 ผ่าน GPU, HDR 10 บิต, อินพุตรวมถึง motion, touchpad, haptic และเสียง 5.1/7.1 แชนเนลแบบหน่วงต่ำบน Opus
- ต้องใช้ Linux และ systemd, GPU NVIDIA RTX, AMD RDNA2+ หรือ Intel Arc ที่รองรับ Vulkan video encoding และ Moonlight v6.0.0 ขึ้นไป
- ทราฟฟิกของโปรโตคอล GameStream ไม่ได้เข้ารหัสครบถ้วนในระดับแอปพลิเคชัน จึงไม่ควรเปิดพอร์ตให้เข้าถึงจากอินเทอร์เน็ตโดยตรง และต้องใช้ VPN เช่น Tailscale, WireGuard หรือ ZeroTier สำหรับการเข้าถึงจากภายนอก
การสตรีมเกมแบบแยกส่วน
- แต่ละแอปพลิเคชันจะรันใน เซสชันสตรีมมิง ของตัวเองที่แยกจากเดสก์ท็อปของโฮสต์
- ระหว่างสตรีม ยังสามารถใช้ PC โฮสต์ทำงานอื่นได้
- ทำงานบนเซิร์ฟเวอร์แบบ headless ได้โดยไม่ต้องมีเซสชันเดสก์ท็อปที่ใช้งานอยู่ มอนิเตอร์ หรือปลั๊ก HDMI dummy
- จัดการ H.264, H.265, AV1 ด้วย Vulkan video encoding ของ GPU
- ให้บริการสตรีมมิง HDR 10 บิต จริงในเกมที่รองรับ
- รองรับเมาส์ คีย์บอร์ด เกมแพด รวมถึงประมวลผลอินพุต motion, touchpad และ haptic ของเกมแพด
- เสียงใช้การเข้ารหัส Opus แบบหน่วงต่ำ และรองรับสเตอริโอพร้อม 5.1/7.1 surround
ข้อกำหนดในการรัน
- ปัจจุบันรองรับ เฉพาะ Linux โดยทดสอบบน Arch Linux แล้ว และมีกรณีที่ใช้งานได้บนดิสโทร Linux อื่น
- ต้องใช้ systemd สำหรับรันและจัดการโปรเซสของแอปพลิเคชัน
- ต้องใช้ GPU NVIDIA RTX, AMD RDNA2 ขึ้นไป หรือ Intel Arc ที่รองรับ Vulkan video encoding
- ไคลเอนต์ต้องเป็น Moonlight v6.0.0 ขึ้นไป และไม่รับประกันความเข้ากันได้กับเวอร์ชันเก่าหรือพอร์ตที่ไม่เป็นทางการ
การติดตั้งและรัน
- บน Arch Linux สามารถติดตั้งผ่าน AUR ด้วย
yay -S moonshine - หากต้องการให้แอปพลิเคชันรันได้แม้ผู้ใช้ล็อกเอาต์ ให้ใช้
sudo loginctl enable-linger $USER- หากผู้ใช้ล็อกอินอยู่เสมอขณะสตรีม สามารถข้ามขั้นตอนนี้ได้
- ใช้
sudo systemctl enable --now moonshine@$USERเพื่อเริ่มบริการตอนบูตและรันทันที - การ build จากซอร์สต้องใช้ clang, CMake, Rust, Wayland, Vulkan headers, shaderc, Mesa, Opus, ไลบรารีที่เกี่ยวข้องกับ PulseAudio เป็นต้น
- หลัง build ให้รันด้วย
cargo run --release -- /path/to/config.toml
การตั้งค่าและการเชื่อมต่อไคลเอนต์
- หากไม่มีไฟล์ในพาธที่ระบุ จะสร้าง ไฟล์ตั้งค่า ให้อัตโนมัติ
- พาธเริ่มต้นของแพ็กเกจ AUR คือ
$XDG_CONFIG_HOME/moonshine/config.toml
- พาธเริ่มต้นของแพ็กเกจ AUR คือ
- เมื่อ Moonlight เชื่อมต่อครั้งแรกจะแสดง PIN และสามารถจับคู่ได้จากการแจ้งเตือนบนโฮสต์หรือที่
http://localhost:47989/pin - สามารถจับคู่ผ่าน command line ได้ด้วยการ POST
uniqueidและpinไปยัง endpoint/submit-pin
การกำหนดค่าแอปพลิเคชัน
- แต่ละ
[[application]]ในconfig.tomlกำหนดโปรแกรมที่จะรันในเซสชันแยกtitle: ชื่อที่จะแสดงใน Moonlightboxart: พาธรูปปกแบบไม่บังคับcommand: ไฟล์ปฏิบัติการและรายการอาร์กิวเมนต์
pre_commandจะรันคำสั่งแบบซิงโครนัสตามลำดับก่อนเริ่มแอปพลิเคชัน และเซสชันจะรอจนกว่าทั้งหมดจะเสร็จpost_commandจะรันคำสั่งแบบซิงโครนัสตามลำดับหลังจบการสตรีม และเซิร์ฟเวอร์จะรอจนกว่าทั้งหมดจะเสร็จ- สามารถใช้สิ่งนี้เพื่อหยุดบริการที่ชนกัน หรือเปลี่ยนสถานะ GPU ก่อนและหลังการสตรีมได้
การค้นหาแอปพลิเคชันอัตโนมัติ
- Steam scanner จะค้นหาเกมที่ติดตั้งจากไลบรารี Steam ที่ระบุ และสร้างคำสั่งรันที่มี ID เกมรวมอยู่ด้วย
- Desktop scanner จะค้นหาแอปพลิเคชันจากไฟล์
.desktopในไดเรกทอรีที่ระบุ- สามารถตั้งค่าได้ว่าจะรวมแอปพลิเคชันแบบเทอร์มินัลหรือไม่ และจะ resolve พาธไอคอนหรือไม่
ความแตกต่างและข้อจำกัดเมื่อเทียบกับ Sunshine
- Sunshine รองรับแพลตฟอร์มมากกว่าและโดยรวมมีฟีเจอร์มากกว่า แต่ Moonshine รองรับ เฉพาะ Linux
- จุดต่างของ Moonshine คือแยกเซสชันสตรีมมิงออกจากเดสก์ท็อป ทำให้ยังใช้โฮสต์ต่อได้ และทำงานได้แม้ไม่มีเดสก์ท็อปที่ใช้งานอยู่
- ปัจจุบันยังไม่รองรับ การสตรีมพร้อมกัน ไปยังไคลเอนต์สองตัว และไม่ใช่จุดเน้นของโปรเจกต์
ความปลอดภัยเครือข่าย
- Moonshine ไม่ได้ออกแบบมาสำหรับเครือข่ายสาธารณะ
- เนื่องจากข้อจำกัดของโปรโตคอล GameStream ที่เป็นพื้นฐาน ทราฟฟิกจึงไม่ได้เข้ารหัสครบถ้วนในระดับแอปพลิเคชัน
- สำหรับการสตรีมผ่านอินเทอร์เน็ต ควรใช้ VPN เช่น Tailscale, WireGuard, ZeroTier และไม่ควรเปิดพอร์ตของ Moonshine โดยตรง
โปรเจกต์ที่เป็นพื้นฐาน
- Moonlight: ให้บริการไคลเอนต์สำหรับ Moonshine
- Sunshine: ให้พื้นฐานของ host API
- Inputtino: ให้พื้นฐานสำหรับการทำงานของอุปกรณ์อินพุต
- magic-mirror: เป็นแรงบันดาลใจให้การสตรีมแบบ headless โดยใช้ Vulkan และ Wayland compositor
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
สรุปคือ Nvidia GameStream เคยเป็นเทคโนโลยีแบบปิดของ Nvidia แล้วถูก Nvidia ยกเลิกไป หลังจากนั้น Sunshine และ Moonlight ก็ปรากฏขึ้นในฐานะเซิร์ฟเวอร์·ไคลเอนต์โอเพนซอร์สที่รองรับการสตรีมความหน่วงต่ำบนทุกแพลตฟอร์ม
Game on Whales เพิ่มการสตรีมแบบหลายผู้ใช้และจอแสดงผลเสมือน ทำให้ใกล้เคียงกับ Stadia/GeForce Now แบบโฮสต์เองที่ไม่กระทบเซสชันล็อกอินเดิม และรัน Steam·Firefox ฯลฯ ในคอนเทนเนอร์ที่คัดเลือกไว้
ต่อมา Apollo และ Artemis ทำให้การสตรีมจอเสมือนง่ายขึ้น แต่จอเสมือนของ Apollo แทบจะเป็น Windows-only และ Moonshine นำสิ่งนี้มาใช้งานบนเซิร์ฟเวอร์ Linux
Vibepollo ที่แยกมาจาก Apollo เป็นเวอร์ชันปรับปรุงที่แทบทั้งหมดทำด้วย vibe coding ส่วนตัวเลยคิดว่าจะไม่ใช้ แต่ก็สงสัยว่ามีอะไรที่ตกหล่นไปจากสายวิวัฒนาการนี้หรือไม่
Steam ต่างจาก Google ตรงที่มีฐานลูกค้าอยู่แล้ว จึงคงไม่น่าแปลกใจถ้าพรุ่งนี้จะประกาศบริการสไตล์ Stadia ที่รันเกมที่มีอยู่บนฮาร์ดแวร์ทุกแบบ
Sunshine ระหว่างสตรีมจะยังแสดงเกมบนหน้าจอโฮสต์ด้วย แต่อยากยืนยันว่า Moonshine หมายถึงรันได้โดยไม่มีจอจริง หรือรันหลายเกมพร้อมกันได้หรือเปล่า
Sunshine มองสิ่งนี้เป็นจอจริง จึงเหลือแค่สายไฟกับสาย LAN ก็พอ และเซิร์ฟเวอร์เกม Linux ทำงานได้ดีโดยไม่ต้องใช้ HDMI dummy plug หรือไดรเวอร์จอเสมือน
สงสัยว่าบน Windows ระหว่างเล่นเกมจากระยะไกล คนอื่นยังใช้เซิร์ฟเวอร์ได้หรือไม่ โซลูชันจอเสมือนส่วนใหญ่ที่หาเจอจะปิดหน้าจอของเซิร์ฟเวอร์ไปเลย
ผมเป็นผู้พัฒนา Moonshine แก่นหลักคล้าย Sunshine แต่ต่างกันตรงที่ไม่พึ่งพาเดสก์ท็อปเดิม และสร้าง compositor ของตัวเอง
รันแบบ headless ได้โดยไม่มีเดสก์ท็อป สร้างความละเอียด·อัตรารีเฟรชใด ๆ ได้โดยไม่ต้องใช้ dummy plug และใช้ HDR ได้แม้จอจะไม่รองรับ ยังสามารถใช้เดสก์ท็อปเดิมไปพร้อมกับสตรีมเกมได้ด้วย
ในเชิงเทคนิค ตั้งใจเลือกขอบเขตที่แคบคือ Vulkan encoder หนึ่งตัว, Linux หนึ่งตัว, ไม่มี GUI, ไม่รองรับไคลเอนต์ Moonlight รุ่นเก่า เพื่อให้ codebase เบาไว้ แลกกับการต้องใช้ GPU·ไดรเวอร์ค่อนข้างใหม่และไคลเอนต์ Moonlight รุ่นใหม่
เป็นโปรเจกต์งานอดิเรกที่ทำมาตั้งแต่ปี 2022 ตอนแรกแย่กว่า Sunshine จนใน README แนะนำว่าอย่าใช้ แต่พอมีฟีเจอร์ที่แตกต่างแล้วจึงลบข้อความนั้นออก
สำหรับผู้ใช้ใหม่ แนะนำให้เริ่มจาก Sunshine ก่อน เพราะมีข้อมูลเยอะและมีโอกาสทำงานได้ดีสูงกว่า แต่ถ้าชอบลองของใหม่ Moonshine ก็ใช้ได้
ด้วยโครงสร้าง compositor ของตัวเอง ดูเหมือนจะยากที่จะรันเดสก์ท็อปแบบเต็ม แต่บน Linux ต้องการวิธีรันแอประยะไกลทีละแอปอย่างเสถียรมาก เซิร์ฟเวอร์ในตัวของ KDE และ GNOME โดยรวมมีปัญหา และยังต้องเปิดจอไว้ด้วย
สามารถใช้ Sunshine กับ Moonlight สตรีมเกม PS2 SSX Tricky ที่อีมูเลตและอัปสเกลบนเดสก์ท็อปไปยังกล่อง Android set-top box อายุเกิน 7 ปีได้อย่างลื่นมาก
แต่เกมจะแสดงบนหน้าจอเดสก์ท็อปตามเดิม ทำให้คนอื่นใช้โฮสต์ไม่ได้ระหว่างมีคนเล่นเกม ซึ่ง Moonshine ดูเหมือนจะแก้เรื่องนี้ได้ เหมือนเติมชิ้นสุดท้ายให้ชุดที่ยอดเยี่ยมอยู่แล้ว
ใช้ Moonlight และ Apollo อยู่ โดยต่อ DualSense กับ MacBook เปิด Moonlight แล้วเข้าเดสก์ท็อปสำหรับเล่นเกมแบบเต็มจอ จากนั้นรันเกม AAA บน Steam
บน Wi-Fi 7 แทบไม่รู้สึกถึงดีเลย์ และ Minisforum ที่ต่อกับทีวีจอใหญ่ก็เชื่อมต่อได้ด้วยปุ่มคอมโบอีกชุดของ DualSense Apollo บันทึกการตั้งค่าไว้ ทำให้สลับระหว่างสองอุปกรณ์ได้แทบไม่มีปัญหา
โทรศัพท์แค่เล่นวิดีโอจึงไม่ร้อนและแบตเตอรี่อยู่ได้นาน
สงสัยว่า Moonshine สร้างอะไรคล้ายเดสก์ท็อปเสมือนต่อเซสชันหรือไม่ เป็นแค่หน้าจอแยก หรือเป็น อินสแตนซ์ compositor ที่แยกอิสระอย่างสมบูรณ์
ใช้วิธีนี้เพื่ออีมูเลตเกม Switch บน PC แล้วสตรีมไปยัง Wii U และ 3DS รุ่นเก่า
กำลังใช้งานชุด Moonlight กับ Sunshine บนเซิร์ฟเวอร์ GPU RTX 4000 Pro ได้อย่างน่าพอใจ
สิ่งเดียวที่ขัดใจคือการปรับความละเอียดอัตโนมัติให้ตรงกับไคลเอนต์ที่เชื่อมต่อ แต่แก้ได้ด้วยการเขียนสคริปต์ผ่าน Home Assistant Windows client
เคยทำตามคู่มือเพื่อตั้งค่าการสตรีม Sunshine และ Moonlight จากโน้ตบุ๊กไปยังโทรศัพท์มือถือ แต่ไม่ได้ผลลัพธ์ที่ใช้งานได้จริง
สุดท้ายยอมแพ้ เพราะเอาเวลาว่างอันจำกัดหนึ่งสัปดาห์ที่ตั้งใจจะใช้เล่นเกมพักผ่อนไปหมดกับการปรับ codec, latency, Wi‑Fi settings และแอปหลายตัว เลยสงสัยว่าตอนนี้ผ่านมาราว 3 ปีแล้วดีขึ้นหรือยัง
สุดท้ายเกมที่ตั้งใจจะเล่นรองรับเฉพาะ local multiplayer และแม้ ProtonDB จะให้สถานะความเข้ากันได้แบบจำกัด แต่กลับรันบนโน้ตบุ๊กได้โดยตรง จึงไม่จำเป็นต้องสตรีม อย่างไรก็ตาม ตัวการตั้งค่านั้นทำได้ราบรื่น และใช้ Tailscale ด้วย
แม้ในสภาพแวดล้อมที่เหมาะที่สุด ระบบไร้สายก็มีแพ็กเก็ตที่ต้องส่งซ้ำมากกว่ามาก ดังนั้นควรใช้ Wi‑Fi เฉพาะฝั่งไคลเอนต์จะดีกว่า
กำลังใช้ Sunshine กับ Moonlight เพื่อรีโมตเข้า VM สำหรับพัฒนา ROS 2 ที่ passthrough GPU โดยตรง
ต้องใช้ Ubuntu รุ่นเก่าจึงเลือกใช้ VM และเพราะมีการจำลอง Gazebo จึงต้อง passthrough GPU โดยตรง บน RDP เดสก์ท็อปช้ามากและแทบไม่ตอบสนอง แต่ชุดนี้ทำให้ใช้งานได้พอสมควร
การสตรีมเกม PC ด้วยตัวเองตั้งค่ายากกว่ายุคที่แค่เปิดฟีเจอร์ของ Nvidia มาก
ครั้งล่าสุดที่ลองก็หาวิธีให้ทำงานไม่ได้จนยอมแพ้ และแม้จะมีข้อดีอื่น ๆ แต่นักพัฒนาโอเพนซอร์สดูเหมือนจะยังดูแลเรื่อง usability ได้ไม่ดีพอ
จะใช้คู่มือ YouTube หรือให้ AI ช่วยก็ได้ และเคยหาสาเหตุร่วมกับ AI ได้จริงว่า firewall ของ Linux distribution กำลังบล็อกพอร์ตสตรีมมิงอยู่
ตอนแรกควรเริ่มจากเครือข่ายภายในก่อน แล้วค่อยตั้งค่าสตรีมผ่านอินเทอร์เน็ตภายหลัง แต่ถ้ามี home VPN อย่าง WireGuard หรือ Tailscale ก็อาจไม่ยากนัก โฮสต์ควรเป็นแบบมีสายดีที่สุด และ Wi‑Fi ฝั่งไคลเอนต์ถ้ารองรับ 6GHz ก็มักจะใช้ได้ดี
อาจไม่ได้ง่ายราวเวทมนตร์เท่า PS Remote Play แต่แนะนำให้ลองอีกครั้ง
แม้โฮสต์จะเป็น Wi‑Fi ซึ่งขัดกับคำแนะนำ แต่ก็ใช้งานได้ดี และเป็นหนึ่งในช่วงเวลาที่รู้สึกเหมือนเวทมนตร์ที่สุดในบรรดาสิ่งที่ได้ลองกับเทคโนโลยีช่วงไม่กี่ปีนี้ อย่างไรก็ตาม ใช้เฉพาะการสตรีมผ่าน Wi‑Fi ภายในบ้านเท่านั้น