- Moonshine là host Linux hỗ trợ chơi từ xa bằng cách truyền hình ảnh game PC tới client Moonlight và gửi lại đầu vào bàn phím, chuột và tay cầm về máy chủ
- Mỗi luồng dùng một Wayland compositor riêng để tách biệt với desktop, nên vẫn có thể tiếp tục dùng PC host trong khi đang stream và cũng có thể chạy trên server không có màn hình
- Hỗ trợ mã hóa H.264·H.265·AV1 bằng GPU, HDR 10-bit, đầu vào gồm motion·touchpad·haptic, cùng âm thanh Opus độ trễ thấp 5.1·7.1 kênh
- Yêu cầu Linux và systemd, GPU NVIDIA RTX·AMD RDNA2+·Intel Arc có thể mã hóa video Vulkan, cùng Moonlight v6.0.0 trở lên
- Lưu lượng giao thức GameStream không được mã hóa hoàn toàn ở tầng ứng dụng, vì vậy không nên phơi trực tiếp cổng ra Internet; truy cập từ bên ngoài cần VPN như Tailscale·WireGuard·ZeroTier
Truyền phát game tách biệt
- Mỗi ứng dụng chạy trong phiên streaming riêng, tách khỏi desktop của host
- Vẫn có thể dùng PC host cho việc khác trong khi đang stream
- Chạy trên server headless mà không cần phiên desktop đang hoạt động, màn hình hay HDMI dummy plug
- Xử lý H.264·H.265·AV1 bằng mã hóa video Vulkan của GPU
- Cung cấp streaming HDR 10-bit thật trên các game được hỗ trợ
- Hỗ trợ chuột, bàn phím, gamepad, đồng thời xử lý cả đầu vào motion·touchpad·haptic của gamepad
- Âm thanh dùng mã hóa Opus độ trễ thấp và hỗ trợ stereo cùng surround 5.1·7.1
Yêu cầu chạy
- Hiện tại chỉ dành cho Linux, đã được thử nghiệm trên Arch Linux và có ghi nhận chạy được trên các bản phân phối Linux khác
- Cần systemd để chạy và quản lý tiến trình ứng dụng
- Cần GPU NVIDIA RTX, AMD RDNA2 trở lên hoặc Intel Arc hỗ trợ mã hóa video Vulkan
- Client phải là Moonlight v6.0.0 trở lên; không đảm bảo tương thích với phiên bản cũ hơn hoặc các bản port không chính thức
Cài đặt và chạy
- Trên Arch Linux có thể cài qua AUR bằng
yay -S moonshine - Để chạy ứng dụng ngay cả khi người dùng đã đăng xuất, dùng
sudo loginctl enable-linger $USER- Có thể bỏ qua bước này nếu người dùng luôn đăng nhập khi stream
- Dùng
sudo systemctl enable --now moonshine@$USERđể khởi động dịch vụ khi boot và chạy ngay lập tức - Build từ mã nguồn cần clang, CMake, Rust, Wayland, header Vulkan, shaderc, Mesa, Opus, các thư viện liên quan đến PulseAudio, v.v.
- Sau khi build, chạy bằng
cargo run --release -- /path/to/config.toml
Cấu hình và kết nối client
- Nếu không có tệp ở đường dẫn chỉ định, tệp cấu hình sẽ được tạo tự động
- Đường dẫn mặc định của gói AUR là
$XDG_CONFIG_HOME/moonshine/config.toml
- Đường dẫn mặc định của gói AUR là
- Moonlight sẽ hiển thị PIN khi kết nối lần đầu, và có thể ghép cặp qua thông báo của host hoặc tại
http://localhost:47989/pin - Cũng có thể ghép cặp từ dòng lệnh bằng cách POST
uniqueidvàpintới endpoint/submit-pin
Cấu hình ứng dụng
- Mỗi
[[application]]trongconfig.tomlđịnh nghĩa một chương trình sẽ chạy trong phiên tách biệttitle: tên hiển thị trong Moonlightboxart: đường dẫn ảnh bìa tùy chọncommand: tệp thực thi và danh sách đối số
pre_commandchạy đồng bộ các lệnh theo thứ tự trước khi ứng dụng khởi động, và phiên sẽ chờ cho đến khi tất cả hoàn tấtpost_commandchạy đồng bộ các lệnh theo thứ tự sau khi streaming kết thúc, và server sẽ chờ cho đến khi tất cả hoàn tất- Có thể dùng việc này để dừng các dịch vụ xung đột hoặc thay đổi trạng thái GPU trước và sau khi stream
Tự động dò ứng dụng
- Steam scanner tìm game đã cài trong thư viện Steam được chỉ định và tạo lệnh chạy có chứa ID game
- Desktop scanner tìm ứng dụng từ các tệp
.desktoptrong thư mục được chỉ định- Có thể cấu hình việc có bao gồm ứng dụng terminal hay không và có phân giải đường dẫn icon hay không
Khác biệt với Sunshine và các hạn chế
- Sunshine hỗ trợ nhiều nền tảng hơn và nhìn chung có nhiều tính năng hơn, còn Moonshine chỉ dành cho Linux
- Điểm khác biệt của Moonshine là tách phiên streaming khỏi desktop để có thể tiếp tục dùng host và hoạt động cả khi không có desktop đang mở
- Hiện chưa hỗ trợ stream đồng thời tới hai client và đây cũng không phải trọng tâm của dự án
Bảo mật mạng
- Moonshine không được thiết kế cho mạng công cộng
- Do giới hạn của giao thức GameStream nền tảng, lưu lượng không được mã hóa hoàn toàn ở tầng ứng dụng
- Khi stream qua Internet, phải dùng VPN như Tailscale, WireGuard, ZeroTier, và không được công khai trực tiếp các cổng của Moonshine
Các dự án nền tảng
- Moonlight: cung cấp client cho Moonshine
- Sunshine: cung cấp nền tảng cho host API
- Inputtino: cung cấp nền tảng triển khai thiết bị đầu vào
- magic-mirror: mang lại cảm hứng cho streaming headless dùng Vulkan và Wayland compositor
1 bình luận
Các ý kiến trên Hacker News
Tóm lại, Nvidia GameStream từng là công nghệ độc quyền rồi bị Nvidia khai tử; sau đó Sunshine và Moonlight xuất hiện như bộ server·client mã nguồn mở hỗ trợ streaming độ trễ thấp trên mọi nền tảng.
Game on Whales bổ sung streaming đa người dùng và màn hình ảo, gần giống một Stadia/GeForce Now tự host, không ảnh hưởng đến phiên đăng nhập hiện có, chạy Steam·Firefox, v.v. trong các container được chọn lọc.
Sau đó Apollo và Artemis giúp streaming màn hình ảo trở nên đơn giản hơn, nhưng màn hình ảo của Apollo thực tế gần như chỉ dành cho Windows, còn Moonshine triển khai điều đó trên server Linux.
Vibepollo, một nhánh tách từ Apollo, là bản cải tiến gần như hoàn toàn được tạo bằng vibe coding nên cá nhân tôi không định dùng; không biết trong phả hệ này còn thiếu cái gì không.
Khác với Google, Steam đã có cả nền tảng khách hàng sẵn có, nên nếu ngay ngày mai họ công bố một dịch vụ kiểu Stadia cho phép chạy các game đã sở hữu trên mọi phần cứng thì tôi cũng không thấy ngạc nhiên.
Với Sunshine, khi streaming thì game cũng hiển thị trên màn hình host; tôi muốn xác nhận liệu Moonshine có nghĩa là có thể chạy mà không cần màn hình vật lý, hoặc chạy nhiều game cùng lúc hay không.
Sunshine nhận nó như một màn hình thật, nên chỉ cần để lại nguồn và cáp LAN; server game Linux vẫn chạy tốt mà không cần HDMI dummy plug hay driver màn hình ảo.
Tôi thắc mắc trên Windows, liệu người khác có thể dùng server trong lúc đang chơi game từ xa không. Hầu hết các giải pháp màn hình ảo tôi tìm thấy đều tắt màn hình server.
Tôi là nhà phát triển Moonshine. Điểm cốt lõi là nó giống Sunshine, nhưng khác ở chỗ không phụ thuộc vào môi trường desktop hiện có mà tạo compositor riêng.
Nó chạy headless mà không cần môi trường desktop, tạo được độ phân giải·tần số quét tùy ý mà không cần dummy plug, và dùng được HDR ngay cả khi màn hình không hỗ trợ. Cũng có thể vừa dùng desktop hiện có vừa streaming game cùng lúc.
Về mặt kỹ thuật, tôi cố ý chọn phạm vi hẹp: một Vulkan encoder, một Linux, không GUI, không hỗ trợ client Moonlight cũ, để giữ codebase nhẹ. Đổi lại, cần GPU·driver tương đối mới và client Moonlight mới.
Đây là dự án sở thích tôi làm từ năm 2022; ban đầu nó kém Sunshine nên trong README tôi còn khuyên không nên dùng, nhưng sau khi có các tính năng khác biệt thì tôi đã gỡ câu đó.
Với người dùng mới, tôi vẫn khuyên nên ưu tiên Sunshine vì tài liệu phong phú và khả năng chạy tốt cao hơn; còn nếu thích vọc cái mới thì Moonshine cũng ổn.
Với cấu trúc compositor riêng, có vẻ khó chạy cả một môi trường desktop hoàn chỉnh, nhưng Linux rất cần một cách chạy ứng dụng từ xa ổn định, dù chỉ từng app một. Server tích hợp của KDE và GNOME nhìn chung đều có vấn đề và còn yêu cầu màn hình phải bật.
Với Sunshine và Moonlight, tôi đã có thể stream game PS2 SSX Tricky được giả lập và upscale trên desktop sang một set-top box Android hơn 7 năm tuổi một cách rất mượt.
Tuy nhiên game vẫn hiển thị nguyên trên màn hình desktop nên không thể dùng host khi người khác đang chơi; có vẻ Moonshine giải quyết được điều này. Nó giống như mảnh ghép hoàn thiện cho một combo vốn đã tuyệt vời.
Tôi đang dùng Moonlight và Apollo theo cách kết nối DualSense với MacBook, mở Moonlight để vào toàn màn hình desktop chơi game, rồi chạy các game AAA trên Steam.
Trên Wi-Fi 7 hầu như không cảm nhận được độ trễ, và chiếc Minisforum nối với TV lớn cũng có thể truy cập bằng một tổ hợp nút khác của DualSense. Apollo lưu cấu hình nên việc chuyển giữa hai thiết bị gần như không gặp vấn đề.
Điện thoại chỉ phát video nên không nóng và pin cũng lâu.
Tôi thắc mắc Moonshine tạo thứ gì đó như desktop ảo cho từng phiên, hay chỉ là một màn hình riêng, hay là một instance compositor hoàn toàn độc lập.
Dùng cách này để giả lập game Switch trên PC rồi stream sang Wii U và 3DS đời cũ
Đang dùng khá hài lòng bộ đôi Moonlight và Sunshine trên máy chủ GPU RTX 4000 Pro
Chỉ tiếc là thiếu tự động điều chỉnh độ phân giải theo client được kết nối, nhưng đã giải quyết bằng cách viết script với Home Assistant Windows client
Tôi đã làm theo hướng dẫn để thiết lập stream Sunshine và Moonlight từ laptop sang điện thoại, nhưng không đạt được kết quả dùng được
Cuối cùng tôi bỏ cuộc vì đã tiêu hết một tuần thời gian rảnh ít ỏi dành cho game để chỉnh codec, độ trễ, thiết lập Wi-Fi và đủ loại ứng dụng; giờ đã khoảng 3 năm trôi qua nên không biết đã cải thiện chưa
Rốt cuộc game tôi định chơi chỉ hỗ trợ nhiều người cục bộ, và trái với đánh giá tương thích hạn chế trên ProtonDB, nó chạy trực tiếp trên laptop nên không cần stream, nhưng bản thân việc thiết lập thì khá dễ. Tôi cũng dùng Tailscale
Ngay cả trong môi trường lý tưởng, kết nối không dây vẫn có nhiều gói cần truyền lại hơn hẳn, nên tốt nhất chỉ dùng Wi-Fi ở phía client
Tôi đang dùng Sunshine và Moonlight để truy cập từ xa vào VM dùng phát triển ROS 2 có GPU passthrough
Tôi chọn VM vì cần Ubuntu cũ, và cần kết nối trực tiếp GPU do mô phỏng Gazebo. Với RDP, desktop rất chậm và gần như không phản hồi, nhưng bộ đôi này khiến nó đủ dùng
Tự stream game PC giờ khó thiết lập hơn nhiều so với thời chỉ cần bật tính năng của Nvidia
Lần thử gần nhất tôi không tìm ra cách làm cho nó hoạt động nên đã bỏ cuộc; bất chấp các ưu điểm khác, có vẻ các lập trình viên mã nguồn mở vẫn chưa chăm chút đúng mức cho tính dễ dùng
Bạn cũng có thể nhờ hướng dẫn YouTube hoặc AI; thực tế tôi từng cùng AI tìm ra nguyên nhân là tường lửa của bản phân phối Linux đang chặn các cổng stream
Ban đầu nên bắt đầu trong mạng cục bộ, rồi hãy thiết lập stream qua Internet sau; nhưng nếu có VPN tại nhà như WireGuard hoặc Tailscale thì có thể không khó. Host tốt nhất là dùng dây, còn Wi-Fi phía client nếu hỗ trợ 6GHz thì nhìn chung ổn
Không tiện lợi như phép màu kiểu PS Remote Play, nhưng tôi khuyên nên thử lại
Trái với khuyến nghị, host cũng dùng Wi-Fi nhưng vẫn chạy tốt; đó là một trong những khoảnh khắc kỳ diệu nhất tôi từng có với công nghệ trong vài năm gần đây. Tuy nhiên tôi chỉ dùng stream qua Wi-Fi cục bộ