2017年10月4日 星期三

在低解析度的實體螢幕上用動態視野換取高解析度的享受

xrandr panning 的效果 筆電的解析度只有 1366x768, 跑 kvm 時, 虛擬機的解析度就只能調成 800x600, 好呆的感覺, guest 裡面的 app 如果不夠貼心 (對解析度的需求太貪心), 可能會連按鈕都按不到。 以這個例子來說, 可以按著 alt 鍵再用滑鼠移動視窗, 問題就解決了。

不過更一般地來說, 要怎樣才能用低解析度 (小螢幕) 的價格與重量得到高解析度 (大螢幕) 的享受呢? X Window 有一個神奇的功能, 讓你的實體螢幕彷彿只看到想像中的虛擬螢幕的一小部分, 每當滑鼠移到邊界時, 這一小塊看得見的視野的範圍也就跟著改變。 看 這支影片 比較清楚: 他的解析度也是只有 1366x768, 但是到了 1:01 時, 「panned screens」 按下 ok, game 的程式碼就以為螢幕變大了。 注意看他每次滑鼠移到邊邊時, 遊戲背景就會跟著移動; 但是對 game (或是其他任何 apps) 的程式碼而言, 它一直以為螢幕就是很大、 背景其實一直是保持固定不動的。

很久以前在 enlightenment 環境下就玩過這個功能; 今天才知道這是底層 X window 的基本功能, 任何桌面環境都可採用。 先在命令列下: xrandr | grep ' connected' 查看螢幕的名稱及解析度。 例如我看到的是: LVDS-1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 277mm x 156mm 得知名稱為 LVDS-1。 然後下 xrandr --output LVDS-1 --fb 1600x1200 --panning 1600x1200 口中唸著咒語 「tiida!」 虛擬解析度突然變成 1600x1200! 超爽 der! 從 archlinux linux questions 學來的。 [11/1 根據 這一篇, 其實不必加 --fb 也可以, 它會自己計算正確的值。]

但是等一下... 工具列為什麼卡在螢幕中間啊? 這顯示視窗管理員並沒有認出 1600x1200 的解析度。 (忘記試了: 當時如果 xrand 命令列上再加上 --mode 1366x768 不知有沒有作用?) 猜想應該要在剛登入的時候、 視窗管理員還沒啟動之前就馬上設定才對。 我的 linux 是 lubuntu 16.04, 登入管理員是 lightdm, 於是用 「xrandr lightdm」 搜尋, 找到 askubuntugist, 得知只要在 /etc/lightdm/lightdm.conf 裡面加一句 session-setup-script=/etc/X11/ckhung.sh 之類的設定即可。 /etc/X11/ckhung.sh 裡面就放那句 xrandr 設定。 要記得 chmod a+x /etc/X11/ckhung.sh 。 要 systemctl restart lightdm 或是重開機才會生效。

看來我那些已經冰凍很久的 eeepc 還是有機會拿出來用的...

6 則留言:

  1. 請問 Windows 有沒有類似的應用程式呢?我也有部冰凍很久的 eeepc 呢。

    回覆刪除
    回覆
    1. 這個不知有沒有用? https://superuser.com/questions/50501/change-screen-resolution-to-exceed-the-maximum-on-windows-7 不過這麼舊的電腦,從安全性跟硬體效能來看,不如裝 linux 比較實在吧。

      刪除
    2. 謝謝您的意見

      刪除
  2. 標題取的真好。
    另外我有幾個問題

    不知道 "--fb" 是幹麻的,用
    "xrandr --output DVI-I-0 --mode 800x600 --panning 3000x2000"
    一樣可以運作。

    不知道為什麼延伸的黑色的區域一直閃爍,而且切換到 virtual screen mode 以後,視窗用滑鼠點兩下讓它 "最大化",視窗的大小還是依照舊有的大小 (800x600),不會吃新的大小 (3000x2000),變成我要手動拉大,拉不好還會看到黑色區域一直閃爍。

    不過讚,以後用 Inkscape 會很方便,Inkscape 的界面在 1440x900 解析度所剩下的畫布空間其實很小。

    回覆刪除
  3. 嗯, 果然沒錯, 不必加 --fb 也可以。
    我也沒試過其他排列組合,

    閃爍的問題我沒遇過。
    用 flickering 也搜尋不到。
    聽起來會不會是驅動程式
    把不該用的記憶體拿來用啊?
    (因為它沒預期螢幕會用這麼多記憶體?)

    回覆刪除
    回覆
    1. 不知道,目前無解,不過沒有大礙,只要把視窗手動拉大到虛擬螢幕全部的大小就看不到了。
      偶爾要畫圖用 xrandr 這樣做很方便。

      刪除