苹果 macOS M1 上的 Dolphin 构建

788 阅读10分钟

从2020年11月10日宣布的消息来看,用户对新的苹果M1设备寄予厚望。用户和开发者都在好奇,凭借强大的苹果硅处理器,它是否有可能实现原生的Dolphin构建。现在有了答案。

苹果的M1硬件是非常强大的,在运行Dolphin方面表现出色。这个消息已经酝酿了一段时间,可能有眼尖的用户已经注意到,本月早些时候,macOS版本现在被指定为 "英特尔"。这是因为delrothSkyler建立了一个新的构建机器人,使用名为MacStadium的服务来创建通用macOS二进制文件。这些构建程序可以立即使用,并同时支持macOS M1和英特尔macOS设备。

处理ARM上的macOS问题

可以简单地说苹果公司通过M1 ARM处理器给PC行业投下了一颗炸弹。ARM是一种精简指令集计算(RISC)架构,专门为便携式设备的效率而设计。使用紧凑的指令集,而不是不断膨胀的混乱的x86,ARM能够在执行优化的任务时使用更少的处理器,使其具有卓越的电源效率。然而,考虑到未经优化的工作负载,ARM处理器需要比X86 CPU多出许多周期来执行。综合来看,ARM是便携式设备中电池寿命的首选处理器,但是,与英特尔的x86处理器相比,它们的整体性能很差。它是一种用于手机等休闲事物的处理器,而不是真正用于 "实际工作"。但这已经是过去式了。

英特尔对工艺优势的铁腕控制早已滑落,ARM指令集已经仔细扩展,在不牺牲电源效率的同时更有效地处理更多的任务。然而,即使ARM达到了数据中心,甚至一些有趣的硬件让我们看到了可能的前景,ARM比x86弱的名声仍然根深蒂固。

但是,通过M1,苹果完全打破了这种愚蠢的观念。M1不仅可以执行与他们以前的英特尔处理器相同的任务,甚至在使用他们的Rosetta 2翻译层时也可以做得更快,所有这些,同时仍然提供比英特尔好得多的单线程性能。只能说他们已经引起了我们的注意。

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/689039425e0c409f94fad5eeefbc11a4~tplv-k3u1fbpfcp-zoom-1.image

对它进行了测试。使用Rosetta 2翻译层和Dolphin的x86-64 JIT,M1很容易全速运行大多数游戏,并轻松地超过了同类的英特尔Mac。由于JIT的抖动,体验并不完全流畅,但处理器证明自己有能力处理Dolphin。但事实上,它必须通过翻译层来完成,这是一个巨大的性能瓶颈。开发者们认为,为什么不直接使用Dolphin的AArch64 JIT来实现本地支持?因此,比赛开始了,一些人试图找出让海豚的AArch64 JIT在M1上运行的障碍。

不幸的是,让AArch64 JIT运行并不是一件容易的事。苹果要求W^X(Write Xor Execute)符合本地macOS M1应用程序。它的作用是使内存区域必须明确标记为写或执行,但不能同时标记为写。因为这更容易,而且在Dolphin支持的先前平台上也没有被禁止,模拟器以前只是把JIT使用的内存区域标记为Write和Execute。苹果的这一要求主要是为了防止程序中读取不受信任的数据的错误被利用来运行恶意软件的安全功能。在仿真器之外,你实际看到自我修改代码的主要地方是网络浏览器,这往往是攻击计算机的一个载体。

值得庆幸的是,这比iOS设备上的严格程度要低得多,因为iOS严格禁止将内存映射为可执行文件,这使得iOS无法得到我们的正式支持。Apple甚至提供了文档,帮助开发者将JIT移植到ARM上的macOS。Skyler使用了文档中描述的一种方法,该方法会在发射代码时将映射的内存从Writeable变为执行代码时的Executable。由于Dolphin不是为这个而设计的,在这个过程中出现了一些小插曲,但最终一切都在新的限制下得到了解决。

image.png

一旦这个问题解决了,重点就转移到了可维护性和建立基础设施上。除了让它正确运行,这是迄今为止官方支持M1的最困难的挑战。Dolphin的基础设施相当复杂,对变化很敏感。将macOS构建转移到一个通用的二进制文件(x86-64 AArch64合二为一),同时获得构建macOS通用二进制文件所需的硬件是一个挑战,并可能被证明代价较高。最后,MacStadium提供了免费的M1硬件,使行动变得非常便宜,所以能够专注于使Dolphin的buildbot基础设施处理新的构建。

测试M1硬件

现在它已经运行了,你可能想知道它是如何运行的。有几件事情需要牢记。Dolphin的AArch64 JIT并不像x86-64 JIT那样成熟。虽然在JosJuice的努力下,事情没有几年前那么糟糕,兼容性也应该大致相同,但它仍然是两个JIT中不太完整的。

其中一个区别是指令覆盖率。任何没有包含在JIT中的PowerPC指令都必须退回到解释器中,这要付出巨大的性能损失。在这一点上,大多数常见的指令都被两个JIT所覆盖。不过,在AArch64 JIT中缺少一个重要的功能:记忆检查。值得庆幸的是,这只影响了全MMU游戏,如星球大战盗贼中队II, III, 和蜘蛛侠2。AArch64 JIT中也缺少一些很好的东西,比如用于防止虚假JitCache刷新的JitCache空间重复使用。

即使在AArch64 JIT中缺少记忆检查,《盗梦空间2》的运行还是令人钦佩的

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f76d6b3f0422449b990975c7844001ad~tplv-k3u1fbpfcp-zoom-1.image

不过,AArch64确实有它的优势。也就是说,这些处理器有31个寄存器,而x86-64处理器只有16个。模拟的PowerPC处理器有32个寄存器,虽然在一个代码块中使用所有的寄存器是很罕见的,但有更多的寄存器总是好的。另一个区别是,AArch64和PowerPC有3条操作数指令,而x86-64只有两条。

PPC:     A = B + CAArch64: A = B + Cx86-64:  A = B, A = A + C

正如所看到的,它使仿真一些指令比在x86-64 JIT上要干净和容易得多。好了,跳过这些无聊的细节。那么当M1硬件与GameCube和Wii库中的一些猛兽相比,表现如何?

image.png

不可否认的是,macOS M1硬件绝对击败了两年半的英特尔MacBook Pro,它的价格是它的三倍多,同时保持在ARM的强大的桌面电脑的范围内。做了第二张图来表达它。

image.png

其效率几乎达到了惊人的地步。与一台绝对畸形的台式电脑相比,它使用的能源不到1/10,而提供的性能却是65%。而可怜的英特尔MacBook Pro根本无法与之相比。

将事情向前推进了一步

在对macOS M1及其苹果硅做了艰苦的性能测试后,很明显,它很强大。问题是,如果你给开发者一个新的玩具,他们最终会决定把事情越推越远。这是第一次看到Dolphin的AArch64 JIT在手机或平板电脑以外的东西上真正伸展它的腿,而不是用一个超激进的调速器,它也受限于图形驱动。在这种新发现的力量下,能想出的最糟糕的想法是什么?Netplay。

这是一个真正的测试,看看AArch64 JIT和x86-64 JIT是否真的相等。测试团队之前无法准确地测试这一点,因为安卓GUI缺乏netplay支持,但macOS运行桌面版本,并且没有任何妥协。这包括拥有完整的netplay支持。这个工作的机会几乎为零,但没有理由停下来思考是否应该这样做--技术已经使我们可以这样做了。

有时测试会产生意想不到的结果!

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/56eb8caad1544fe19c381212c9261678~tplv-k3u1fbpfcp-zoom-1.image

而且,它实际上是有效的! 只是由于测试有限,测试团队还不能确定到底有多好。到目前为止,他们在netplay上测试的每一个游戏都能同步,尽管Dolphin的不同步检查器给出的是假的肯定。测试者尝试了从Super Smash Bros. MeleeMario Party 5到观看塞尔达传说:风之旅人等各种情况。所有的会议都保持同步。

这可能不是所有游戏的真实情况。直到本月初,像Mario Kart: Double Dash!!F-Zero GXMario Kart Wii这样的游戏会因为物理学差异而立即失去同步性。感谢JosJuice的工作,AArch64 JIT和解释器中的那些舍入错误现在已经被修复,这意味着这些游戏至少应该有机会在网游中同步。

由于有限的库,对哪些游戏可以工作,哪些游戏有问题还没有一个很好的概念。作为压力测试,TechjarSkyler玩了Super Mario Sunshine合作模式。其中的物理计算对CPU的四舍五入错误极其敏感,它为两个JIT提供了一个严峻的考验。他们还启用了60FPS黑客,使事情变得更加有趣。

不仅游戏同步,Macbook Air M1还能够处理《超级马里奥阳光》的60 FPS黑客。

image.png

每个了解Dolphin JITs的人都认为跨JIT的网游是不可能的,至少在没有大量的专门修复的情况下。但是经过亲身体验,我们认为它只会越来越好,因为现在已经可以监控和测试JIT在网游中的确定性。虽然你可能会兴奋地直接进入,但要注意的是,现阶段只能测试一些游戏,并不知道在更广泛的游戏库中释放出来的兼容性会是什么样子。

注:我们知道在M1之前就有Windows和Linux AArch64设备。在这些设备上测试netplay没有任何吸引力,因为它们不能合理地运行Dolphin。我们真的没有想到这能成功,否则我们可能会更早地尝试。

结论中

M1的硬件非常棒,而且更高的层级也在路上,有望获得更好的性能。但现在所拥有的已经是高效、强大的,并为我们提供了一个主流的AArch64设备,它不是安卓系统,并充分利用了AArch64 JIT的潜力。唯一的缺点是macOS中存在的专有图形API,它使我们无法使用最新版本的OpenGL,并迫使我们使用MoltenVK,以利用Vulkan的优势。为了一睹一些真正酷的硬件,重新定义ARM处理器的功能,这是一个非常小的代价。不可否认的是,人们对下一代的AArch64硬件感到兴奋,想知道它能走多远。

原文链接:dolphin-emu.org/blog/2021/0…