上次做自適應同步(adaptive sync),或著稱為可變更新率(VRR)的實驗:
【程式】AMD FreeSync測試
那次用HDMI連接螢幕結果只能在Windows用。之後弄到一台USB type-C孔可以輸出DisplayPort訊號的電腦,可以做另一個實驗了。
程式教學目錄
晶片是Core i5-1135G7的內顯。這個晶片必須用DisplayPort連接螢幕才能用adaptive sync,HDMI不行。
準備Type-C轉DP的轉接器和DisplayPort線。

插在Type-C孔。

這種轉接器比較難買。Type-C轉HDMI,或DP轉HDMI的轉接器很多店都可買到,Type-C轉DP的要到光華商場附近才有,不然就要網購。
Type-C孔麻煩的的地方是同樣形狀的孔功能不一定相同,孔旁邊有個D標誌如圖,或有Thunderbolt標誌就表示可以輸出DisplayPort,但也有沒標示但有支援的情況。
在Windows設定GPU的程式是這樣:

用跟上次相同的程式測試。
介紹 https://github.com/Nixola/VRRTest
下載處 https://github.com/Nixola/VRRTest/releases/tag/v2.1.0
.zip是Windows版,.AppImage是Linux版。
查了一下這個程式底層是什麼,是用一個Lua框架LÖVE製作,而LÖVE處理底層是用SDL,所以想了解這個程式怎麼做的要查SDL程式碼。
執行,讓視窗在外接螢幕,可以看到程式更新率和螢幕更新率一樣。

Windows 11好像比較先進,上次在Windows 10用print screen鍵抓不到這個程式的畫面,這次可以了。
如果視窗在筆電本身的螢幕且vsync關閉,肉眼可以看到下方的長條橫向錯開,不過用print screen鍵抓圖看不出來。
在Windows執行的情況跟上次一樣,這次主要想在Linux試。在以下兩組環境測試。
Fedora 42, Wayland, KDE Plasma
Mint 22, X11, Cinnamon
先是Wayland這組。螢幕有開adaptive sync的話,顯示器設定會多出自適應同步的項目。開啟這項並把刷新頻率調高。

執行測試程式,按alt+左或右讓視窗在外接螢幕,然後按上、下調整FPS。可以看到程式顯示的FPS和螢幕顯示的很相近。


再來測試自己寫程式怎麼做到,拿「【程式】OpenGL ES 3.0初始化(X Window)」修改,雖然系統執行的是Wayland,但可以相容X Window程式。
呼叫XMapWindow()後,先用XMoveResizeWindow()填入xywh讓視窗剛好填滿螢幕,然後將視窗設成無邊框且可以用Alt+Tab切換,X Window有兩種方法:設定_MOTIF_WM_HINTS屬性或_NET_WM_STATE屬性,只有_NET_WM_STATE的方法可以啟用adaptive sync。
這樣螢幕更新率就會跟著程式走。eglSwapInterval()本來是用來控制vsync,裡面填什麼不影響adaptive sync。
在此不列出設屬性的程式碼,可以參考SDL程式碼:
https://github.com/libsdl-org/SDL/blob/main/src/video/x11/SDL_x11window.c
map window之前要用X11_SetNetWMState()的方法,map window之後則要用X11_SetWindowFullscreenViaWM()的方法。
再來X11這組。雖然Wayland問世很多年了,Cinnamon預設還是用X11。
這篇最下面有寫,X11必須只接能支援VRR的螢幕,所以把筆電本身的螢幕停用,只用外接的。
Variable refresh rate - ArchWiki
參考這兩篇修改系統設定:
Enabling VRR - Linux Mint Forums
[Solved]Mint 20.1 - Cinnamon and VRR / FreeSync - Linux Mint Forums
用管理員權限新增一個文字檔:/usr/share/X11/xorg.conf.d/20-amdgpu.conf,填以下內容。
用xrandr --props指令,以及查看/var/log/Xorg.0.log都顯示有開VRR。


不過開啟顯示器設定,裡面並沒有adaptive sync或variable refresh rate的項目。

執行測試程式和我寫的程式,螢幕更新率也一直是100而沒有跟隨程式。
參考資料寫的是AMD晶片而我用的是Intel晶片,不知道xorg.conf.d裡要填的值有沒有不同,但去查Intel晶片在X11要填什麼設定也找不到資料。
Cinnamon桌面在登入時可以選要不要用Wayland,試過用Wayland,也沒能啟用adaptive sync。

支援adaptive sync的螢幕是借來的,我能借的時間有限,不想再研究了。
結論是如果想在Linux用自適應同步,還是DisplayPort+Wayland安定,也要看桌面環境支援度。
過程中發生一個案外案:在Fedora 42打這篇文章時,在Visual Studio Code不能用中文輸入法。調查發現顯示系統是Wayland但VS Code用的是X11,因為Electron framework的bug(VS Code用到這個framework),讓X11程式不能用輸入法。
參考:
Using Fcitx 5 on Wayland - Fcitx
Setting up VSCode for GNOME and Wayland | Fisher Sun
解決方法是叫VS Code使用Wayland,用這個指令執行VS Code:
在開始功能表裡VS Code的項目按右鍵選編輯,自己加命令列參數。
【程式】AMD FreeSync測試
那次用HDMI連接螢幕結果只能在Windows用。之後弄到一台USB type-C孔可以輸出DisplayPort訊號的電腦,可以做另一個實驗了。
程式教學目錄
晶片是Core i5-1135G7的內顯。這個晶片必須用DisplayPort連接螢幕才能用adaptive sync,HDMI不行。
準備Type-C轉DP的轉接器和DisplayPort線。
插在Type-C孔。
這種轉接器比較難買。Type-C轉HDMI,或DP轉HDMI的轉接器很多店都可買到,Type-C轉DP的要到光華商場附近才有,不然就要網購。
Type-C孔麻煩的的地方是同樣形狀的孔功能不一定相同,孔旁邊有個D標誌如圖,或有Thunderbolt標誌就表示可以輸出DisplayPort,但也有沒標示但有支援的情況。
在Windows設定GPU的程式是這樣:
用跟上次相同的程式測試。
介紹 https://github.com/Nixola/VRRTest
下載處 https://github.com/Nixola/VRRTest/releases/tag/v2.1.0
.zip是Windows版,.AppImage是Linux版。
查了一下這個程式底層是什麼,是用一個Lua框架LÖVE製作,而LÖVE處理底層是用SDL,所以想了解這個程式怎麼做的要查SDL程式碼。
執行,讓視窗在外接螢幕,可以看到程式更新率和螢幕更新率一樣。
Windows 11好像比較先進,上次在Windows 10用print screen鍵抓不到這個程式的畫面,這次可以了。
如果視窗在筆電本身的螢幕且vsync關閉,肉眼可以看到下方的長條橫向錯開,不過用print screen鍵抓圖看不出來。
在Windows執行的情況跟上次一樣,這次主要想在Linux試。在以下兩組環境測試。
Fedora 42, Wayland, KDE Plasma
Mint 22, X11, Cinnamon
先是Wayland這組。螢幕有開adaptive sync的話,顯示器設定會多出自適應同步的項目。開啟這項並把刷新頻率調高。
執行測試程式,按alt+左或右讓視窗在外接螢幕,然後按上、下調整FPS。可以看到程式顯示的FPS和螢幕顯示的很相近。
再來測試自己寫程式怎麼做到,拿「【程式】OpenGL ES 3.0初始化(X Window)」修改,雖然系統執行的是Wayland,但可以相容X Window程式。
呼叫XMapWindow()後,先用XMoveResizeWindow()填入xywh讓視窗剛好填滿螢幕,然後將視窗設成無邊框且可以用Alt+Tab切換,X Window有兩種方法:設定_MOTIF_WM_HINTS屬性或_NET_WM_STATE屬性,只有_NET_WM_STATE的方法可以啟用adaptive sync。
這樣螢幕更新率就會跟著程式走。eglSwapInterval()本來是用來控制vsync,裡面填什麼不影響adaptive sync。
在此不列出設屬性的程式碼,可以參考SDL程式碼:
https://github.com/libsdl-org/SDL/blob/main/src/video/x11/SDL_x11window.c
map window之前要用X11_SetNetWMState()的方法,map window之後則要用X11_SetWindowFullscreenViaWM()的方法。
再來X11這組。雖然Wayland問世很多年了,Cinnamon預設還是用X11。
這篇最下面有寫,X11必須只接能支援VRR的螢幕,所以把筆電本身的螢幕停用,只用外接的。
Variable refresh rate - ArchWiki
參考這兩篇修改系統設定:
Enabling VRR - Linux Mint Forums
[Solved]Mint 20.1 - Cinnamon and VRR / FreeSync - Linux Mint Forums
用管理員權限新增一個文字檔:/usr/share/X11/xorg.conf.d/20-amdgpu.conf,填以下內容。
| Section "Device" Identifier "AMD" Driver "amdgpu" Option "TearFree" "true" Option "DRI" "3" Option "VariableRefresh" "true" EndSection |
用xrandr --props指令,以及查看/var/log/Xorg.0.log都顯示有開VRR。
不過開啟顯示器設定,裡面並沒有adaptive sync或variable refresh rate的項目。
執行測試程式和我寫的程式,螢幕更新率也一直是100而沒有跟隨程式。
參考資料寫的是AMD晶片而我用的是Intel晶片,不知道xorg.conf.d裡要填的值有沒有不同,但去查Intel晶片在X11要填什麼設定也找不到資料。
Cinnamon桌面在登入時可以選要不要用Wayland,試過用Wayland,也沒能啟用adaptive sync。
支援adaptive sync的螢幕是借來的,我能借的時間有限,不想再研究了。
結論是如果想在Linux用自適應同步,還是DisplayPort+Wayland安定,也要看桌面環境支援度。
過程中發生一個案外案:在Fedora 42打這篇文章時,在Visual Studio Code不能用中文輸入法。調查發現顯示系統是Wayland但VS Code用的是X11,因為Electron framework的bug(VS Code用到這個framework),讓X11程式不能用輸入法。
參考:
Using Fcitx 5 on Wayland - Fcitx
Setting up VSCode for GNOME and Wayland | Fisher Sun
解決方法是叫VS Code使用Wayland,用這個指令執行VS Code:
| /usr/share/code/code --enable-features=UseOzonePlatform --ozone-platform=wayland --enable-wayland-ime |