virglrenderer(VirGL)是給QEMU虛擬機用的顯示技術,可給虛擬機提供3D硬體加速。舉例來說:Linux電腦用QEMU跑Android-x86虛擬機,能透過virglrenderer改善虛擬機的3D圖形性能。
在Android手機透過Termux執行virglrenderer伺服器,就能達到類似效果,解決Termux的Linux環境圖形效能不彰的問題。
這樣我們就可以在Termux的Proot Linux環境看4K60p影片、玩3D遊戲了。支援proot與chroot環境。
用講的太抽象,不如先看看影片所呈現的效果:
- 測試手機:Sony Xperia 5 II,系統版本Android 12,處理器Snapdragon 865,GPU Adreno 650,RAM 8GB。
1. 安裝Termux與Termux X11#
安裝 Termux,並安裝 Termux X11。
理論上XSDL或VNC也可以,我個人偏好用Termux X11來顯示圖形環境。
2. 安裝Proot發行版#
安裝一個Proot發行版並設定桌面環境。個人推薦安裝 Debian。
3. 安裝virglrenderer#
二擇一,建議優先嘗試試virglrenderer-android。
方案1:安裝virglrenderer-android#
virglrenderer-android使用Android GL/ES,適用於大多數Android裝置。
架構:Android GL/ES → Termux VirGL renderer server → proot / chroot virpipe MESA gallium driver
- 安裝virglrenderer-android
pkg install virglrenderer-android
- 執行Virgl伺服器:
virgl_test_server_android &
方案2:安裝virglrenderer-zink#
Zink是模擬Vulkan的驅動程式,效能可能比上面的virlglrenderer-android好。只支援Qualcomm處理器的Android裝置。
- 包含Zink的virglrenderer可透過tur-repo安裝:
pkg install tur-repo
pkg update -y && pkg upgrade -y
pkg install mesa-zink virglrenderer-mesa-zink vulkan-loader-android
- 欲啟動Virgl伺服器,執行以下指令。下面proot在使用
GALLIUM_DRIVER
變數的時候把virpipe
換成zink
。
MESA_LOADER_DRIVER_OVERRIDE=zink GALLIUM_DRIVER=zink ZINK_DESCRIPTORS=lazy virgl_test_server --use-egl-surfaceless --use-gles &
4. virglrenderer的用法#
Termux本身用於執行virglrenderer的伺服器,但是Termux沒什麼程式能利用virglrenderer,必須使用proot或chroot才行。
4.1. 在Proot使用virgl執行程式#
在Termux啟動virgl的伺服器。
啟動Termux X11 APP。回到Termux,執行Termux X11
export DISPLAY=:0
termux-x11 :0 &
- 從螢幕左邊滑進來,按New Session開啟第二個終端機。以一般帳戶
user
登入proot-distro,掛載Termux的tmp目錄至Proot-distro,
proot-distro login debian --user user --shared-tmp
- 啟動XFCE4桌面環境。
export DISPLAY=:0
dbus-launch --exit-with-session startxfce4 &
在Termux X11的界面開啟終端機。在執行程式前加入
GALLIUM_DRIVER=virpipe
或GALLIUM_DRIVER=virgl
啟用virgl硬體加速,如果不加系統會回復使用CPU渲染的llvmpipe
。有些程式加MESA_GL_VERSION_OVERRIDE=4.0
會開不起來,需要自行測試。例如要執行方塊遊戲Minetest:
GALLIUM_DRIVER=virpipe MESA_GL_VERSION_OVERRIDE=4.0 minetest
virpipe下glxgears的FPS相比llvimpipe高出一些。
llvmpipe與virpipe比較,Minetest的FPS從10FPS增長到最多20FPS。
VLC、MPV啟用virpipe後4K60p影片也播得動了,但基本上是拼盡全力在算繪,一有程式(例如錄影)跟影片播放器搶資源就會畫面撕裂。
賽車遊戲SueprTuxKart成長最明顯:llvmpipe模式下是幻燈片,有了virpipe後就能正常遊玩了。
Firefox在about:config
強制啟用WebGL後,WebGL Aquarium的FPS翻倍。
也可以考慮用GALIIUM_DRIVER=virpipe startxfce4
的指令啟動桌面環境,讓所有程式預設都吃到virpipe渲染,增加桌面環境流暢度。若有程式開virpipe會崩潰,那麼再用GALIIUM_DRIVER=llvmpipe <程式名稱>
改回CPU渲染。
4.2. 在chroot使用virgl執行程式#
設定XFCE4桌面的 chroot Ubuntu with XFCE4
將SELinux設定為Permissive
sudo setenforce 0
- 啟動Termux X11 APP,返回Termxu,執行:
XDG_RUNTIME_DIR=${TMPDIR} termux-x11 :0 -ac &
- 將Termux的tmp掛載至chroot的tmp
export CHROOT_DIR=/data/local/tmp/chrootubuntu
sudo busybox mount --bind $PREFIX/tmp $CHROOT_DIR/tmp
- 登入chroot,啟動XFCE4
sudo chmod -R 777 /tmp
export DISPLAY=:0 PULSE_SERVER=tcp:127.0.0.1:4713
dbus-launch --exit-with-session startxfce4 &
- 以virgl 啟動應用程式
GALLIUM_DRIVER=virpipe MESA_GL_VERSION_OVERRIDE=4.0 minetest
4.3. 執行Windows遊戲#
請先安裝 Box86 + Wine。
在Termux啟動virgl伺服器。
並在執行exe前同樣加上GALLIUM_DRIVER
參數,例如:
GALLIUM_DRIVER=virpipe MESA_GL_VERSION_OVERRIDE=4.0 box86 wine AIR.exe
virgl能讓部份需要硬體加速的Windows遊戲正常執行,例如Tobyfox製作的《Undertale》
以及Key製作的視覺小說《Air》,需另外安裝日文字體。