portgames.
移植基础

模拟器和直接转译,区别是什么?

同一款老游戏可以通过模拟器,也可以通过重编译项目来到新设备上。它们怎样处理原来的程序,决定了两条路线的区别。

作者 · 发布于 · 来源核对

区别在于怎样处理原程序

一款老游戏的程序,是按原来机器的处理器和硬件规则编写的。换到新电脑或手机上,这些指令和硬件行为往往不能直接照搬。

模拟器在游戏运行时,提供原机器所需的行为;静态重编译则提前转换原程序,再把转换结果编译成适合新平台的程序。

本文把“直接转译”限定为移植项目中常见的静态重编译。不同项目可能对这个词有不同用法。

模拟器:在运行时处理原机器的规则

游戏运行时,会不断进行计算、绘制画面、播放声音和读取操作。模拟器负责让这些工作在新设备上按原机器的规则完成。例如,游戏要求访问原来的图形硬件时,模拟器需要用新设备能执行的方式实现相应行为。

模拟器可以解释执行原程序,也可以把一段指令转换成新处理器能执行的代码。这些处理发生在运行过程中,画面、声音等部分还需要相互配合。

模拟器的工作示意:原程序的指令由新设备内部的处理机构接收,带动画的传送带连接处理机构与游戏画面

因此,一个模拟器通常面向某个平台的多款游戏。Dolphin 就面向 GameCube 和 Wii;不过,不同游戏使用硬件的方式不同,兼容情况和设备要求也会有差别。

依据:Dolphin 官方 FAQ · Dolphin 即时编译实现

静态重编译:提前转换,再编译成新程序

静态重编译把一部分工作移到了游戏运行之前。工具先分析原程序,把其中的指令转换成另一种代码,再通过编译器生成新平台可以运行的程序。

以 N64Recomp 为例,它将 N64 程序转换成 C 代码,之后再编译。玩家拿到的可能已经是完成这些步骤的发行版,不必自己操作转换工具。

静态重编译的工作示意:原程序先经过设备外部的加工机器,形成新的程序,再送入目标设备运行

提前转换指令,也只解决了部分问题。画面、声音和操作仍需要配套的运行环境,具体游戏也需要适配。因此,重编译项目可能只支持某一款游戏的特定版本;把另一款游戏交给它,并不会自动得到一个完整移植。

转换程序也不会自动提供地图、音乐和贴图。例如,Zelda64Recomp 明确说明,它的预编译程序不包含游戏素材。

依据:N64Recomp 原理说明 · Zelda64Recomp 项目说明

为什么不能简单理解为“模拟慢,转译快”

模拟器也会使用转译。常见的“即时编译”,就是在程序运行时转换指令;Dolphin 包含这样的实现。因此,模拟器和转译技术可以出现在同一个方案里。

静态重编译提前完成部分转换,有机会减少运行时的相关工作,但最终性能还受到画面处理、适配质量和设备能力的影响。两种路线都可能遇到画面错误或崩溃,名称本身无法保证体验。

更准确的区别是:模拟器围绕原平台的行为组织运行过程,静态重编译提前改造原程序的代码。两者处理问题的时间和方式不同,具体项目也可能组合使用相关技术。

依据:Dolphin 即时编译实现 · N64Recomp 原理说明

资料依据

找游戏