2021 年,Linux 究竟能用来玩什么游戏?

近些年,国内的 Linux 的环境正在发生翻天覆地的变化。
“国产系统”本身就是喋喋不休的话题,华为被美国制裁以致无法使用 GMS谷歌移动服务 也再次将“可防可控”和“自主研发”推上风口浪尖。
虽然国内本来也用不到 GMS,但这次私企华为失去 GMS 的使用权却意外的在国内掀起一片反谷歌浪潮

随着机关单位开始普及计算机软硬件国产化,统信 UOS 等本地化 Linux 发行版在国内装机量大大提高,GNU/linux 或许终于在国内等到了属于他的春天。

中国的 Linux 生态

不过直到今天,愿意提供原生 Linux 版本软件的国内厂商少得可怜,当然是出于商业利益考量。
在中国,不使用虚拟机或兼容层等技术手段的情况下,普通用户几乎无法考虑以 Linux 作为主系统使用。
不过本篇重点不在此,更多关于 Linux 中国软件生态的内容,包括可用软件和替代品,考虑之后再说。

既然在不远的将来 Linux 可能会真正铺展开,你我作为普通用户,更是个臭打游戏的,当然也关注 Linux 下的游戏生态。

原生游戏有,好少 qwq……
能不能让 Windows 上的游戏运行在 Linux 中呢?能?!

首先我们需要知道,计算机是如何运行应用的——
准确来说,是“操作系统是如何在软件层面上运行应用的”。

API

先不看内部,简化地介绍一下应用程序在操作系统上大概的运行原理。

linux 架构示意图

API,aka 应用程序接口,wiki上说:

应用程序接口是指电脑操作系统或程序库提供给应用程序调用使用的代码,其主要目的是让应用程序开发人员得以调用一组例程功能,而无须考虑其底层的源代码为何、或理解其内部工作机制的细节。API 本身是抽象的,它仅定义了一个接口,而不涉及应用程序在实际实现过程中的具体操作。

应用程序类似一个箱子,箱子上的孔负责箱子内的应用与外界的系统的沟通,实现各种功能,
系统 api 就相当于箱子上的孔。
当然 Windows 这样不太注重权限管理的系统,箱子已经跟筛子差不多了(

不同的系统孔的形状不一样,孔的实现方式不一样,孔外面的世界也不一样,导致一般同一份二进制文件不能在不同系统上运行。

Windows NT 架构示意图

想要让 Windows 的应用高效快捷地运行在其他系统上,看看 Wine。

Wine

不同系统上的不同的接口,使跨平台运行应用产生困难。
从诞生起 Windows 就赢得市场的选择,许多应用只发布 Windows 版本。天下苦 Windows 久已,Wine 应之而生。

WINE, acronym for "Wine Is Not an Emulator"
与虚拟机通过虚拟化技术运行一个完整的系统来达到运行 Windows 应用的目相比,Wine 不能说一模一样,只能说毫不相干。
Wine 是兼容层,采取原生转译 Windows 的 api 的方式。“将 Windows API 调用翻译成为动态的 POSIX 调用”,以解耦 Windows 的运行依赖,让 Windows 应用可以以一种类似原生的方式,优雅的运行在类 unix 系统上。
嘿嘿,这像不像某“操作系统”的其中一版的宣传词?
用了二十多年的时间,在社区维护下,Wine 可以说是做到了。现在已经有相当一部分软件可以在 Wine 和修改版的 Wine 中运行了。
当然,还是有很多未实现的部分。
毕竟专有的 Windows 真给你一个开源项目完全实现了,那谁还去用 Windows,微软还赚不赚钱了。

计算机图形接口

因为咱们讨论的是游戏,而游戏往往不需要很多复杂的特有的系统 api,这似乎给游戏移植降低了很多难度——
但是游戏却很大程度地依赖图形渲染,所以跨平台移植还是很困难

图形接口,图形 api,可以实现图形的渲染,让开发者将精力放在画面、内容等方面,而不许要知道复杂的底层原理,大大地便于开发。
图形 api 涉及到计算机图形学,一门十分深奥的学科。
这也注定图形 api 的模拟不会顺利

当下有这些主流的图形库:

  • DirectX
  • OpenGL
  • Vulkan
  • Metal

DirectX,简称 dx,是微软创建的一系列“专为多媒体以及游戏开发的应用程序接口”,对 Windows 系统依赖程度极高。如 dx12,只有跟随微软升级到新版本 Windows 10 才能使用最新特性。
OpenGL 和 Vulkan 都是原生提供多平台支持的,Vulkan 可以说是 OpenGL 的后继者。
Metal 相当于阿普鲁苹果公司的dx。因为几乎没有 Metal 独占的游戏,暂且不做讨论。

其中,原生 DirectX 的游戏最多,这离不开 DirectX 优秀的效率,当然也有很大一部分 Windows 垄断的原因。

具体实现

OpenGL 和 Vulkan 本身就跨平台,很容易就可以完成移植。
可想而知,理论上来说,想要在 Linux 上流畅运行 3A 大作,最大的问题还是出在 dx 上。Wine 原版就有一些 dx 的实现,但是效率堪忧。
这就不得不提 Valve,做 Steam 的那个 Valve。

Valve

Valve 早就在下一盘大棋。
可能是因为钱多的没事干,与国内大厂不同,Valve 很重视 linux 用户的体验。Valve 很早就开始对 linux 进行游戏兼容性优化,参与了很多 wine 的社区项目。
Steam Play 的 Proton 是一个定制版的 Wine,开源,游戏兼容性很大程度上高于原版,优点主要在对 dx 的转译上。
可以在 Linux 版本的 Steam 中使用 Steam Play,从而尝试通过 Proton 运行 Windows 独占游戏。

Steam Play 的官方介绍.png

转译 DirectX

这是一些目标翻译实现 dx 的项目,将 dx 的画面使用其他 api 渲染,主要是 Vulkan。
以下表格内容整理自老虎会游泳在绿虎论坛的帖子

项目名称维护者实现特点
WineD3D社区DX9/DX10/DX11 -> OpenGL性能孱弱
D9VK社区DX9 -> Vulkan性能良好,已并入 DXVK
DXVK社区、ValveDX9/DX10/DX11 -> Vulkan性能良好
VKD3D社区DX12 -> Vulkan兼容性差,非主流
VKD3D-ProtonValve 主导DX12 -> VulkanVKD3D 的分支,兼容性好,主流,一般 VKD3D 都指的这个

这些项目可以让 Linuxer 得到不错的游戏体验。

现状

说完理论,让我们来看看 Linux 下游戏环境的现状。

打开 Protondb ,这是一个记录 Steam 游戏库中游戏在 Linux 上的兼容性的网站。

Protondb 上记录的 Steam 热门游戏对 Linux 的支持

可以看到,在 Steam 热门前 100 的游戏中,有 77% 被评为“金”及以上,也就是可以以良好的效能大致正常运行,即,能玩,玩起来挺好。

YouTube 博主 FlightlessMango 已对其进行了很多测试,但部分测试年代久远,下文中未说明来源的跑分测试数据均来源于其一年内的测试。罗列较少,有可能以偏概全,具体数据还请浏览原作者的网站或自行进行测试。

原生支持

还是很想表扬一下 Minecraft Java Edition。
以跨平台的 Java 作为编写语言,OpenGL 作为图形渲染引擎,虽然运行效率还有优化的空间,但这种原生多平台支持的精神实在是很感人肺腑。
我和 FlightlessMango 的实际测试都说明,原版 Minecraft 在 Linux 中的运行效率似乎很大程度上的高于 Windows。

Steam top 100 中也有 27% 的游戏已经原生支持了 Linux,这些游戏在 Linux 中的体验可以说是与 Windows 不分上下了,有时甚至可以超过 Windows 和 dx。

CSGO 跑分地图(迷雾部分)在不同环境下运行
CSGO 在 OpenGL、DXVK、DX9 中的表现

通过 Wine 兼容层运行

刚刚讲图形 API 的转译时已经提到,不少大作也可以在 linux 中依靠 Wine 和 Proton 得到优秀的游戏体验。

如果你只是想玩个简单单机 FPS第一人称射击游戏,直接用原版 wine 打开就可以啦。

FPS game on Wine

Steam 游戏的话,也可以在开启 Proton 之后直接启动。

其中 DXVK 完成度很高,在 Linux 中使用 DXVK 转译 dx11,虽有不可避免的损失,但整体效率接近同一游戏在 Windows 下原生 dx 的表现。
VKD3D 似乎不能完全模拟 dx12,有一些特效的效果不太一样,总体差强人意。

Cyberpunk 2077 通过 VKD3D 在 linux 中运行
Cyberpunk 2077 在 VKD3D 和 DX12 下的表现

剩下的,便是“损坏”。
其中,多人游戏“损坏”评级的最多,这事为什么捏?

损坏 - 反作弊

大多常用图形接口虽然转译效率良莠不齐,但至少可以保证游戏运行
真正阻碍游戏运行的,是为 Windows 设计的反作弊程序——
虽然 Steam 有向开发者建议不要使用第三方 DRM数字版权管理

之前说到

游戏往往不需要很多复杂的特有的系统 api,这似乎给游戏移植降低了很多难度

游戏本身不需要用到复杂的系统 api,但是没想到吧,多人游戏内置的反作弊原理就没有那么简单了。
反作弊高度依赖系统底层 api,检测游戏的运行环境,进行内存保护等,现阶段无解。

以《糖豆人》为例,这个爆款多人游戏在上线初期一度在 protondb 评价良好。
但在一次更新中,因为加入了 EACEasy Anti-cheat 反作弊程序,评级直接由铂金掉到损坏,无法启动。
风评被害
虽然 EAC 本身有 Linux 版本,但是由于《糖豆人》是 Windows 游戏,提供的 Windows 版本的 EAC 安装包,也依赖 Windows 版本的 EAC 运行,故实在是无语。

总结

整体来说,随着 wine、proton 等项目的发展,Linux 下的游戏体验正在快速提升。
当下,大部分只支持 Windows 的单机游戏均可以在 Linux 下运行,且体验良好。
前段时间有消息称 Valve 正在与 NVIDIA 等公司共同努力,将把 dx12 的光追带到 Linux 上。

至于反作弊系统,我们也希望 Valve 可以积极与游戏厂商沟通,可以修改反作弊在不同系统下的工作方式,如使 EAC 在 Linux 中使用 Linux 版本,尽量避免这种可以运行,但不可以运行的情况(

放在最后

为什么我在要 2021 年写这样一篇文章呢?
当下,wine、reactos 等项目是开源项目,依赖于社区维护。
虽然有 crossover 等商业化的 wine 软件,但这些特定版本的 wine 都是专有的。
而近期,Steam Dock 开始预售了,默认搭载 Steam OS,Steam OS 是一个定制的 linux 发行版。
消息说新版本 Steam OS 基于 Archlinux
在重视著作权的地区,不使用 Windows,转而使用 GNU/linux 可以剩下很大一笔授权费,显著降低商品的成本。
Valve 很早就大力的参与 wine 的社区项目,之后也会继续大力投入。
社区中来自维护者的热情热爱的高效,远不及商业公司亲自下马进行资本投入,趋利而为的效率。
可以说 Valve 公司在很大程度上的促进了开源项目 wine 的发展。
明年 linux 游戏生态会怎么样,我们拭目以待。


鄙人乃 2022 年应届高考生,在今年利用空闲时间作完这篇稿件
小生不才,如有错误望包涵,还请在评论区多多指教

参考资料
https://www.wikipedia.org/
https://www.winehq.org/
https://www.hu60.cn/q.php/bbs.topic.97298.html
https://www.youtube.com/c/FlightlessMango
https://flightlessmango.com/
https://www.protondb.com/
https://arstechnica.com/gaming/2021/08/valves-upcoming-steam-deck-will-be-based-on-arch-linux-not-debian/