平板游戏环境部署计划
今日计划
- 实现平板上配置游戏环境。
由于游戏大多面向windows这样开箱即用的系统开发,Linux并不是游戏运行的一等公民。所以如果想要在一台arm64架构的·android系统,甚至不是一个纯种linux系统的·纯64位,对32位指令完全不支持的环境下配置windows游戏运行环境,我们需要摄入适量的前置知识。
本篇要素
- wine:一个让windows程序可以跑在linux系统的工具;
- box64:一个将x86_64指令翻译为arm64指令的工具;
- mesa:一套开源图像驱动集合;
- dxvk:图像api翻译器
- turnip & zink:mesa组件,负责驱动vulkan和翻译图像api指令;
Wine
Wine Is Not Emulator,一个递归式的缩写。wine是一个兼容层,旨在让POSIX兼容的操作系统(如Linux)上可以运行原本为Windows开发的应用程序。它的实现方法与虚拟机有巨大差异,并不模拟硬件,而是在运行时实时地将windows api调用翻译为POSIX调用。所以wine的理论性能显著优于虚拟机。
几个核心概念:
WINEPREFIX(Wine前缀)
类似python的虚拟环境,一个wine前缀代表了一个独立的windows虚拟环境。不过在实现层面,wine的行为可能更加类似于conda,都采用了集中式文件管理架构。
wineprefix存在的意义在于避免前置地狱的痛苦。通过环境隔离,你可以在同一台机器上运行前置相互冲突的程序,只要你把它们放在不同的前缀中。
WINEARCH(Wine架构)
初始化前缀时指定模拟的是32位windows还是64位windows。
DLL覆盖
windows程序的运行依赖于大量的动态链接库(即dll)。wine内置了这些dll的开源实现,但是有时出于兼容性考虑需要用windows提取原装版本来替换内建版本。
Winetricks
一个shell脚本,用来下载和安装各种windows运行时库,辅助wine环境配置。
WoW64 Mode
wine的新能力,可以将32位windows api调用转换为64位windows api调用。
局限
- 内核级反作弊的网络游戏无法运行。
- 配置复杂。
- 不是所有软件都能完美运行。
Box64
一个二进制指令翻译器,用来在非x86_64架构的Linux系统(尤其是树莓派和Android平板或手机)上运行原本为x86_64处理器编译的Linux程序。与wine类似的,它的实现也不是使用虚拟机。核心功能是在Linux程序运行时将x86_64架构CPU指令实时地转换为arm64能理解的指令。
Box64性能优异的原因有二,一方面它采用了动态重编译技术,并不100%的解释运行所有指令,而是运行时动态的将指令重写为arm64机器码。此外,box64采用了原生库包装技术,在一些图形处理上直接调用arm64原生库,使得图像处理上几乎可以以原生速度进行。
Box64最夯的应用即和Wine一起打出combo。Box64提供硬件适配,Wine提供系统适配,一同使用就可以在一个树莓派或者高性能arm机器上几乎不损失性能地运行windows程序以及游戏。
Mesa
Mesa是一个开源图形驱动集合,实现了跨平台图形api规范。当我们在Linux上运行游戏时,Mesa会接收游戏发出的绘图指令,并将它们翻译为特定的GPU硬件指令。
由于本人从未涉足过图形学编程的领域,此处额外补充一些必备的图形学知识。所谓的图形api,常见的图像api有OpenGL和Vulkan,它们的作用是将CPU给出的图形绘制指令翻译为GPU指令。其中,OpenGL是一个老资历图形api,特点是相对容易上手,缺点是性能一般;而Vulkan是一个相对更新的图形api,特点是上手难度地狱,但是性能可以比OpenGL强的多。如果类比的话,OpenGL就类似于Python,它帮你做了很多事,代价是性能不够理想;Vulkan则是C语言,所有事情都要你自己控制,所以没有中间商赚差价,性能也自然很高,代价是配置和学习痛苦。
此外,在微软windows系统中还存在Direct3D图形api。同样是一个相较于OpenGL更加现代的图形api。很多windows应用和游戏以Direct3D为图像api。
DXVK
DirectX over VulKan,即将微软Direct3D图像api调用翻译为Vulkan api调用。
在dxvk出现前,wine默认将direct3d指令翻译为openGL指令,由于Direct3D和OpenGL架构差异巨大,这种翻译效率低下,导致CPU瓶颈严重。DXVK的理念是在Direct3D和与它架构更接近、性能更优的Vulkan api之间建立映射。
在Wine容器中运行windows游戏时,Wine会调用DXVK提供的动态链接库,将指令转换为Vulkan并发送给Mesa,Mesa接受到指令后指挥GPU绘制图像。
在winetricks中可以通过winetricks dxvk来一键安装dxvk并覆盖动态链接库。
Turnip&Zink
Turnip和zink是arm64架构设备上运行桌面级应用的热门mesa组件。
其中turnip是linux上运行vulkan应用的首选驱动。不同于Vulkan官方的驱动,Turnip由社区维护,更新速度快,并且针对DXVK做了大量的优化。主要的应用场景是Android运行PC游戏。
Zink的功能则是将OpenGL翻译为Vulkan。对于一个老旧的OpenGL游戏,只使用Turnip无法运行,这时就需要Zink将OpenGL指令翻译为Vulkan指令。因为OpenGL过于老旧臃肿,即使加上了Zink这一翻译层,Vulkan的运行速度也会比原生的OpenGL更快。
全要素再放送
- 宿主层 (Host): Android Kernel + Termux (基础终端环境)。
- 容器层 (Container): PRoot Distro (Ubuntu)。必须是纯 64 位环境。
- 显示层 (Display): Termux:X11 (X Server) + Ubuntu 桌面环境 (XFCE4/MATE) 或 窗口管理器。
- 指令翻译层 (Translator): Box64 (将 x86_64 翻译为 ARM64)。
- 图形驱动层 (Driver): Mesa (Turnip + Zink)。这是 Adreno 显卡的生命线。
- 兼容层 (Compatibility): Wine (WoW64 Build),负责在纯 64 位环境下运行 32 位 Windows 程序。
- 图形转译层 (Graphics Wrapper): DXVK (DX11 -> Vulkan)。
- 应用层 (App): Windows Steam 客户端 + 游戏。
环境配置阶段性任务
- 完成基本环境配置,纯净64位ubuntu distro环境+termux x11桌面环境基本配置;
- 构建指令翻译器,安装box64并注册Binfmt;
- 部署图形驱动,获取Mesa并验证Vulkan支持;
- 部署wine兼容层;
- 部署steam;
- 测试游戏运行;
目前进度
基本环境配置完成,可以打开桌面环境并在桌面环境中运行终端。
