快轉到主要內容

Termux以virglrenderer達成GPU 3D硬體加速

智慧型手機 Termux教學 VirGL Wine
🗓️ 民國112年 癸卯年
✍ 切換正體/簡體字
目錄

🇺🇸 English version

virglrenderer(VirGL)是給QEMU虛擬機用的顯示技術,可給虛擬機提供3D硬體加速。舉例來說:Linux電腦 用QEMU跑Android-x86虛擬機,能透過virglrenderer改善虛擬機的3D圖形性能。

在Android手機透過Termux執行virglrenderer伺服器,就能達到類似效果,解決Termux的Linux環境圖形效能不彰的問題。

這樣我們就可以在Termux的Proot Linux環境看4K60p影片、玩3D遊戲了。支援proot與chroot環境。

SuperTuxKart, Glxgears

用講的太抽象,不如先看看影片所呈現的效果:

  • 測試手機: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

  1. 安裝virglrenderer-android
pkg install virglrenderer-android
  1. 執行Virgl伺服器:
virgl_test_server_android &

方案2:安裝virglrenderer-zink
#

Zink是模擬Vulkan的驅動程式,效能可能比上面的virlglrenderer-android好。只支援Qualcomm處理器的Android裝置。

  1. 包含Zink的virglrenderer可透過tur-repo安裝:
pkg install tur-repo
pkg update -y && pkg upgrade -y
pkg install mesa-zink virglrenderer-mesa-zink vulkan-loader-android
  1. 欲啟動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執行程式
#

  1. 在Termux啟動virgl的伺服器。

  2. 啟動Termux X11 APP。回到Termux,執行Termux X11

export DISPLAY=:0
termux-x11 :0 &
  1. 從螢幕左邊滑進來,按New Session開啟第二個終端機。以一般帳戶user登入proot-distro,掛載Termux的tmp目錄至Proot-distro,
proot-distro login debian --user user --shared-tmp
  1. 啟動XFCE4桌面環境。
export DISPLAY=:0
dbus-launch --exit-with-session startxfce4 &
  1. 在Termux X11的界面開啟終端機。在執行程式前加入GALLIUM_DRIVER啟用virgl硬體加速,如果不加系統會回復使用CPU渲染的llvmpipe。有些程式加MESA_GL_VERSION_OVERRIDE=4.0會開不起來,需要自行測試。

  2. 例如要執行方塊遊戲Minetest:

GALLIUM_DRIVER=virpipe MESA_GL_VERSION_OVERRIDE=4.0 minetest

virpipe下glxgears的FPS相比llvimpipe高出一些。

llvmpipe與virpipe比較,Minetest的FPS從10FPS增長到最多20FPS。

VLC啟用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執行程式
#

  1. 設定XFCE4桌面的 chroot Ubuntu with XFCE4

  2. 將SELinux設定為Permissive

sudo setenforce 0
  1. 啟動Termux X11 APP,返回Termxu,執行:
XDG_RUNTIME_DIR=${TMPDIR} termux-x11 :0 -ac &
  1. 將Termux的tmp掛載至chroot的tmp
export CHROOT_DIR=/data/local/tmp/chrootubuntu
sudo busybox mount --bind $PREFIX/tmp $CHROOT_DIR/tmp
  1. 登入chroot,啟動XFCE4
sudo chmod -R 777 /tmp
export DISPLAY=:0 PULSE_SERVER=tcp:127.0.0.1:4713
dbus-launch --exit-with-session startxfce4 &
  1. 以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》,需另外安裝日文字體。

參考資料
#

相關文章

Termux Proot安裝Box64與Box86,Android手機執行Windows exe
智慧型手機 Termux教學 Box86 Box64 Wine Raspberry Pi ExaGear
Android手機寫Python:Termux安裝Anaconda環境 (miniforge)
智慧型手機 Termux教學 Anaconda Python Android
用Proot-Exagear在Android手機上跑Windows exe程式
智慧型手機 Termux教學 ExaGear Wine QEMU User Mode

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur連結。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。