如果Linux電腦有雙顯示卡,不妨試試內顯為主,獨顯為輔的策略。
作業系統:Arch Linux 6.1.10,KDE Plasma X11
我的桌上型電腦有Intel i5-7400的內顯HD630,還有Nvidia的獨立顯示卡GTX 1050Ti。螢幕一部,插在獨顯的HDMI孔上。
Nvidia不時會造成Linux畫面撕裂,還會讓系統動畫lag、小機率關不了機、開機無法進tty、對Wayland的支援哩哩拉拉,等等的問題。一度讓我想不開想買AMD顯示卡取而代之,或是改用nouveau驅動。但一想到要跑AI相關程式沒CUDA不行,便打消了念頭,
所以採用「內顯」用於畫面輸出,需要時再呼叫「獨顯」出來幹活的方案。用Intel內顯當主畫面輸出,看影片解碼夠力了,還能無痛跑Waydroid和Android-x86的virglrenderer。
其實,有雙顯卡的筆電就常常會碰到這個問題,通常Linux開機會使用Intel內顯,而Nvidia的獨顯需要另外裝軟體才能叫出來使用。常見的方案有Optimus-manager,能在內顯和獨顯之間切換。此外還有Nvidia官方支援的方法:PRIME Render Offload,允許在使用Intel顯示卡顯示螢幕時,用prime-run指令以Nvidia顯示卡執行特定應用程式。
Nvidia PRIME現已支援X和Wayland工作階段,本文說明Nvidia PRIME指令的用法。
1. 安裝Nvidia專有驅動
- 檢查目前使用的是nouveau還是Nvidia專有驅動,顯示nouveau就是前者了。
|
|
雖說若有安裝開源Nvidia驅動nouveau,應先將其解除安裝,但它是含在Mesa套件裡面的,而Intel驅動需要Mesa,所以頂多只能禁止其載入。在安裝Nvidia驅動後,nouveau應會自動被停用。
安裝Nvidia專有驅動和相關工具,重開機。
|
|
- 列出目前使用的GPU。如果螢幕的線是插在獨顯的HDMI孔上,那麼應該只會看到Nvidia
|
|
- 因為等下要改用Intel內顯啟動,安裝Intel的開源驅動,還有Vulkan。
|
|
檢查GRUB參數:
cat /etc/default/grub
,確認GRUB_CMDLINE_LINUX_DEFAULT
沒有設定nomodeset
,否則用Intel顯卡開機會沒畫面。電腦關機。
2. BIOS調整為內顯優先開機
進入電腦的BIOS,設定為內顯優先開機。
我的主機板的該設定位置Advanced → System Agent (SA)Configuration,設定IGFX優先開機。
之後電腦重開機,將插在獨顯的HDMI線拔掉,改插到主機板的HDMI孔。
3. 使用prime-run指令
開機後,檢查目前使用的顯示卡,應會同時列出Intel和Nvidia的顯示卡
|
|
因此,在這之後所有應用程式預設都會以Intel顯示卡啟動。當需要使用Nvidia顯示卡運算的時候,在指令前面加上prime-run
舉例:從終端機執行Minetest,啟用光影,看FPS高低便能知道效果。
指令:minetest
指令:prime-run minetest
如果prime-run對應用程式無效,試試使用PRIME環境變數啟動程式:
|
|
那切換Nvidia顯示卡能不能更方便些?
如果安裝的是GNOME桌面,對應用程式圖示按右鍵會有「以獨立顯示卡啟動」的選項,這樣就會暫時以Nvidia顯示卡啟動該程式。
KDE的話則是右鍵編輯應用程式,加入PRIME的環境變數:__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia __VK_LAYER_NV_optimus=NVIDIA_only VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.json
,這樣以後點應用程式圖示就會一律以Nvidia顯示卡啟動。
4. 以獨顯啟動Steam遊戲
方法一:從終端機用prime-run
啟動Steam,這樣所有遊戲都會以Nivdia顯示卡啟動。
方法二:點選個別Steam遊戲,右鍵→內容
在啟動選項加入PRIME的環境變數:__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia __VK_LAYER_NV_optimus=NVIDIA_only VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.json %command%
5. PRIME的雙螢幕輸出
在KDE環境下是開箱即用,獨顯的HDMI孔接上第二個螢幕後應該會輸出畫面。
但仍然需要使用prime-run指令才能指定用獨顯渲染程式。
沒看到畫面就用xrandr
指令手動設定。