Gaming on Linux with Steam Proton, or gaming in Windows VM with GPU passthrough on Linux Host?
最近幾年我一直在研究Linux系統玩Windows遊戲的方法,在嘗試了各種方案後,逐漸有了答案。
這裡有二個前提:
主力用Ubuntu Linux,我拒絕雙系統開機的模式,所以便剩下Steam Proton和VFIO Windows虛擬機的方案。
我知道很多遊戲是有跨平台版本的,比如Minecraft,但是大部分開發者依然只在乎Windows,所以只要遊戲玩得多了,遇到Windows限定的遊戲是不可迴避的問題,「拒玩」不是選項,也無「替代品」可尋。
1. 名詞定義#
Steam Proton指透過Proton遊玩Steam上架的Windows遊戲。由於近年來Valve大力投資Linux軟體開發,甚至出了Steam Deck,使得玩Steam遊戲基本上是開箱即用。但是Proton不是Valve獨立開發的,它延伸自開源的Wine專案,所以其實不需要Steam,你可以用其他遊戲啟動器搭配Wine轉譯玩Windows遊戲。不過Steam的界面設計確實是最無腦的,所以我用Steam Proton代稱用Wine轉譯Windows遊戲的玩遊戲方式。
- 相關文章: Linux安裝Steam玩Windows遊戲
VFIO Windows虛擬機 (VFIO Gaming VM),這個名詞來自於歐美玩家的稱呼,指的是依賴QEMU/KVM技術建立Windows虛擬機玩遊戲的方式。光是建立虛擬機是不夠的,還要透過Linux核心的VFIO技術將GPU直通給虛擬機,使其能夠負載3D運算。最後設定Looking Glass或Moonlight + Sunshine服務,就能從Linux桌面低延遲的存取Windows桌面。由於虛擬機是完整的Windows系統環境,所以執行起來跟實機幾乎沒有差別。
或許你會跟我爭論說,在Windows虛擬機玩遊戲根本就不是在Linux玩遊戲了呀!但這個Windows虛擬機還是跑在Linux上、且依賴Linux的KVM虛擬化技術才有的結果呀!
2. 二者的不確定因素#
Steam Proton的不確定因素:
- 遊戲開發者重視Linux的程度
- Proton轉譯的穩定性
- 輸入法
- 驅動程式問題
- 反作弊程式相容性
- 安裝第三方模組、外掛、中文化的難易度
VFIO Windows虛擬機的不確定因素:
- 架設虛擬機環境的難易度
- 反作弊程式偵測虛擬機
- 虛擬化的硬體性能損耗
- 存取虛擬機的容易度
3. 現在傾向使用VFIO Windows虛擬機方案#
以前,我認為VFIO Windows虛擬機的方案只是對Steam Proton的補充,真有無法執行的遊戲程式再使用VFIO。但是,現在卻覺得應當反過來了。
如果要比較的話,我覺得Steam Proton的問題比較大。因為變數太多了。
遊戲開發者要怎麼展現對Linux系統用戶的誠意呢?至少推出原生版的程式吧!很可惜這是幾乎不可能的事情,市面上半數遊戲開發商依然只會推出Windows版的遊戲。Windows遊戲可以透過Proton跑不代表就完美無缺的說。而且很多時候是玩家以第三者的角度認為Proton轉譯讓遊戲可以玩,但遊戲開發者根本就不在乎這方面問題,你能玩只是運氣好而已。
再者,安裝遊戲之後如果不需要特別打模組那倒還好,直接體驗原作內容。但,要使用第三方程式的遊戲就會很痛苦了,需要調整一堆有的沒的WINE環境,還得注意有哪些.Net的依賴套件要裝。
最糟糕的情況是Proton轉譯後遊戲有莫名的bug,無法在Windows重現,此時就只能依賴玩家社群尋求解方。若是遊戲太小眾根本找不到解答,所以tweak Wine的環境很多時候是在自虐。每當有一款遊戲能在Linux成功執行,就好像發現寶藏一樣的感覺,問題是失敗的例子也很多啊。
這裡有個想法強化了支持VFIO虛擬機的論點:「我是來玩遊戲的,你們要幹什麼?點一下按鈕就該開玩,不要跟我說要打指令打patch什麼碗糕的!」
我沒有貶低Linux社群開發者的努力,輔助工具越來越多,Linux玩遊戲越來越方便了,但就2024年的現狀來看,Steam Proton還是很吃腦力的玩遊戲方式。
Steam Proton安裝起來很容易,但後續的問題還多著呢,屬於是先甘後苦。
相較之下,VFIO Windows虛擬機環境一旦架設起來了,至少軟體部份不會有太多變數。唯一的問題大概就反作弊程式擋虛擬機的問題,這個有很多解法能繞過。
至於硬體損耗問題,Linux的虛擬機是跑在KVM上的,遊戲執行效率的確會比實機差一些,但是不會到性能變成一半的誇張情況。假若硬體強度足夠支撐,那麼這點損耗可以忽略不計,例如一台電腦有8核心CPU,分一半核心數給Windows虛擬機就足夠輕度遊戲了吧。
那麼,如何存取虛擬機的問題,我講過了,Looking Glass或者Moonlight + Sunshine都能簡單的解決「從Linux桌面存取虛擬機桌面」的問題。
VFIO初期繁雜的問題搞定了之後,往後的遊戲執行都不會有太大問題。算是先苦後甘。
所以,我選擇進入虛無。
補充一點,身為Linux用戶,我依然會關注Steam Proton未來的開發進展,但由於VFIO綁定GPU直通,宿主機無法測試遊戲,那麼我就只有兩種選擇:
第一種,手動GPU直通切換,視需要分配給給宿主機或虛擬機,這個應該能用libvirt hook達成。參見: 虛擬機直通Nvidia GPU後讓Linux宿主機重新使用GPU
第二種,將Linux玩遊戲的環境也虛擬化,也就是另外開一個Linux虛擬機,分配GPU給虛擬機,再用Sunshine存取該虛擬機的桌面。參見: Sunshine裝在QEMU/KVM虛擬機裡,從Linux宿主機串流玩遊戲