超任模拟器为什么需要3GHz的处理器来达到精确
原文地址:
http://arstechnica.com/gaming/ne ... t-snes-emulator.ars
准确性需要处理能力: 用3G赫兹构建完美超任[SNES]模拟器的任务
作者:Byuu 发布与2011年8月9日 原文发表于Arstechnica.com URL地址:
http://arstechnica.com/gaming/ne ... t-snes-emulator.ars
互联网上用模拟器玩老游戏的讨论非常普遍,经常爆发些某游戏用哪个模拟器玩最好的争论。今天,我们换一个角度来看这个问题,介绍一下超任模拟器bsnes的作者的看法。他想要讲讲他认为模拟器体验的最关键部分——准确性。
用现代的电脑[PC]来玩任天堂[Nintendo (也就是红白机、平机,译者注)]或超任游戏并不需要占用太多处理能力,1990年代的模拟器只需要25M赫兹的处理器能力就可以了。但是如果需要准确模拟老式家用机那就是另当别论了,有着完全不同的挑战。准确性好的模拟器可能需要高达3G赫兹的处理能力来忠实重现老科技。本文会介绍为什么准确性对模拟如此重要,还有为什么准确性如此难以实现。
简单而言,准确性是模拟软件模仿原始硬件程度的衡量。最明显的衡量方式就是直观兼容性——某老游戏能否在新模拟器上运行?但就从这么一个局限的角度也会扩展出许多小问题。实际上,多数软件对时序错误的容忍程度很高,甚至时序上有百分之二十的误差也能看起来正常运行。
所以问题就成了,如果我们能实现基本的兼容性,而且提高准确性会大大牺牲性能,为什么还要关心提高准确性?两个原因:游戏表现和保存。
首先是游戏表现。拿飞毛腿小子[Speedy Gonzales]为例,这是一个超任平台游戏,没有存盘功能,游戏时间在2至3小时。初一看,每个模拟器跑这个游戏都正常,但当你进入6-1关的时候,你很快就能发现准确模拟器和快速模拟器的差别。通关必须开一个开关,这时有一个很罕见的硬件状况,如果没有被模拟,游戏就死机了。可以想象这多让人不爽,一下子就白打了三个小时,遇到个打不通的游戏。除非软件在各方面的运行方式都与曾今硬件一样,这游戏就会有问题。
或者看看沙漠风暴[Air Strike Patrol],你飞机下方有个影子。这影子是用扫描线间栅格效果[mid-scanline raster effect]实现的,模拟这功能需要占用超多资源,但是如果没有栅格效果,飞机的影子就没了,就像下面的截图。如果你不知道本来该有影子,很容易忽略这个问题。一旦你看到过了,你就会知道这多么有用,你的飞机可以扔炸弹,这个影子的作用类似于瞄准系统,告诉你炸弹将扔在哪里。如果没有这个看起来并不重要的效果,确定炸弹扔在哪里会略微困难些。
第二个问题是保存。看看任天堂的Game & Watch掌机,这些机器最早1980年就出现了,至今共生产了4千3百万部,其中大多数都因为年代久远或人为损坏而不能再用了。尽管相对而言好机器还能搞到,但是珍惜度只会越来越高,也不会再生产新的机器了。这问题对于任何硬件都是一样的,一旦没有了就永远没有了。到那个时候,模拟器是唯一体验那些老游戏的方法,所以模拟器应该能准确再现游戏。
但是这样的准确性代价很高,模拟器准确性提高一倍,速度基本就要慢一半,准确性在提高一倍,速度就只有四分之一了。而这同时,提高准确性带来的好处却很快越来越不明显,多数游戏看起来和玩起来达到“可玩”程度只需要中等的模拟准确性。(多数模拟器的平衡点订在百分之九十五的兼容性同时取得优化的性能。)
不那么准确但是速度快的模拟器没什么不对,这样代码可以在处理能力较差的硬件上运行,比如手机、掌机。这样的模拟器也适合在追求电池时间的手提电脑上用。但准确性还是值得一提的,准确性也是我自己编写中尝试追求的。下面讲讲为什么这对我很重要。
软件实现
回到90年代末期,Nesticle是最好用的平机[NES]模拟器,系统大概只要求25M赫兹。这样的性能带来很明显的问题,游戏画面经过针对这个模拟器的特殊处理来显示。民间翻译和游戏修改[hack]依赖模拟的瑕疵,这造成这些翻译和修改在真机上或其他模拟器上无法玩。于是造成了一种模拟器垄断,这种垄断持续了相当一段时间才被打破。当时人们通常并不在乎游戏本来看来和玩起的样子,只关心游戏在这个虚拟人造的环境中看起来怎么样,玩起来怎么样。
现在,最占统治地位的模拟器是Nestopia和Nintendulator,全速运行的系统需求分别是800M赫兹和1.6G赫兹。需要处理速度的原因并非是优化不好,而是这些模拟器在硬件还原的忠实程度上大大提高了。
拿这些模拟器和老的神游[N64]模拟器UltraHLE比,UltraHLE的需求仅仅是350M赫兹奔腾II系统[Pentium II]。对打酱油的旁人而言,他们很难理解为什么马里奥64[Mario 64(神游N64上的主打游戏之一,译者注)]会比原本的马里奥兄弟[Mario Bros(任天堂平机NES的主打游戏之一,译者注)]需要的处理能力更少。
因为编写bsnes模拟器,我的模拟器经验主要在超任方面。我很欣赏Nestopia背后的理想标准,我想在超级任天堂[Super Nintendo]上实现这级别的准确性。根据不同的游戏略有差别,这种级别的对准确性的追求将系统需求提高到2至3G赫兹范围。
http://www.youtube.com/watch?v=j ... ure=player_embedded
时空特警[Timecop]在两个很不一样的模拟器上的表现
Nestopia后来居上的原因是对系统的需求并未超过当时的主流,但是我认为如果1997年推出Nestopia的话,肯定会是灾难性的失败。由于我自己编写的模拟器的系统需求超过市面上一半以上的电脑,对于高配置要求带来的影响和反对我有第一手的感受。对于用户而言,更容易批评作者优化做的不好,而不是承认自己的电脑性能不够。将家用机完整实现的过程很困难却也是现实情况。
为什么准确性很重要
为什么一个模拟器看起来运行所有游戏都正常还需要改进呢?简单来说,因为这改进了一些还不为我们知道的事情。在一些并不那么常见的软件中,这点尤其重要。
举个例子,比较ZSNES和bsnes运行塞尔达传说[Legend of Zelda]的片头,旋转的圣三角[triforce]动画。前者的主芯片[CPU]速度比超任真机快百分之四十,所以旋转完成过快。这些是小细节,但如果你的眼睛对准确性要求很高,这会让你疯了。
我见过几十个有隐藏瑕疵的游戏。有时候正确的、准确性更好的模拟器事实上呈现了“错误的”结果。超级原人[Super Bonk]的攻击模式演示实际上会失去了同步,在许多真机上会造成原人卡死在墙边。星际火狐整个游戏都有明显拖慢的问题。这些肯定不是设计的本意,但无论如何这才是真实的。我们不会因为小数不方便就把派四舍五入到3,对不?
我不否认将经典游戏当成可以改进的作品所带来的好处,比如神游模拟器带来了震撼的高分辨率贴图和1080P拉伸,比如超任模拟器常有的7号显示模式[mode 7(超任的3D显示模式)]2倍抗锯齿[2x anti-aliasing]支持以及音频采样中的三次样条插值[cubic spline interpolation]。这些使得模拟游戏看起来听起来更棒。虽然这没有什么不对,但与编写硬件准确模拟器的目标相背。事实上这些改进技巧甚至让准确模拟的可能性变得更困难,这些是典型的例子。
准确性带来的另一个主要好处是民间翻译、ROM修改和家庭开发的作品。他们中只有很少一部分人有条件用真机运行代码,所以通常都用模拟器来开发。但是不幸的是,速度为导向的模拟器常常会忽略硬件限制。对于商业开发的游戏而言这不是个问题,因为都要求用真机测试,毛病马上就发现了改掉了。但如果只用一个模拟器测试,这些问题都会被保留下来。
我举一些例子。民间翻译的勇者斗恶龙1和2[Dragon Quest 1&2],圣灵珠传说2[Dual Orb 2],美少女战士:新故事[Sailor Moon: Another Story]和伊苏4[Ys 4]都有文字无法显示的问题,因为写显存的时候正好是视频处理器渲染屏幕的锁定期,只有一半的作品后来修正了这些错误。
1997年起我们就知道这项硬件限制,只需要一行代码就可以修正,但是至今多数流行模拟器还不支持这特性。结果就是,专门针对某个模拟器开发的翻译作品一直存在问题,或者只能用这模拟器。谁会用一个准确性高,但是不支持大量民间翻译的模拟器?
事情还没完。原本硬件上调用数学单元[math unit]进行乘法或除法运算的时有延迟,所有的发布的商业作品都考虑到了这个延迟。但是民间修改没有考虑这个,导致一个塞尔达翻译作品的音乐截断,还有造成超级马里奥世界[Super Mario World]链条大嘴怪[chain-chomp]补丁乱来。
还有一个模拟器可能忽略了声音处理器将回声采样写入共享内存段,对于多数情况这不是个问题,但是一些修改疯狂使用不符合现实的回声缓冲大小时问题就来了,这最后造成整个内存中的音频程序被覆盖,从而产生各类滑稽的死机。这个问题造成很多民间开发的超级马里奥世界关卡不能玩。
一个模拟器通吃所有游戏
糟糕的时刻总有一天会到来,到时候最终用户需要ZSNES v1.42来玩四个翻译游戏、Snes9X v1.51来玩另外六个游戏的改版、bsnes v080来玩一些小众的日本游戏。这样问题就来了。
要知道模拟器也有保质期的,尤其是ZSNES这种用纯x86汇编写的东西,手机是不能运行的。如果一个改版游戏只有ZSNES能玩,那么这改版就注定了会成为非 主 流。一旦视窗操作系统[Windows]不再提供32位向后兼容支持,这些游戏就再也没法玩了,就像现在的视窗系统已经不提供16位向后兼容了。到那个时候模拟器本身也变成了一台坏主机,不再能维持老游戏的生命。
这些问题的症结在于超任游戏应该在什么平台上运行?当然是真正的超任机器上。创造可以完美或者尽量完美模仿原始硬件的模拟器,就创造了支持多系统的平台,这个平台的未来版本确保可以玩到游戏和各种改版。这种思想就是确保超任的硬件规格还活着,而不是老游戏。
好吧,但是真的要3G赫兹?你搞笑吧?
用300M赫兹处理能力来全速运行一个充分优化、速度优先的超任模拟器是可以做到的,但最终也会带来上百个隐含的错误。
最典型的解决方案就是用专属修改来解决问题。ZSNES和Snes9X内部都自带了五十个左右常见游戏的列表,一旦加载了这些游戏,模拟器会自动调整时序值并且修正一些代码段来确保游戏运行。这比起Nesticle时代,在外部直接修改游戏的做法要先进,但无论最终显示结果怎么样,这依然是在作弊。
那些只玩最流行的二十个左右游戏的普通娱乐玩家是无法发现需要300M赫兹和3G赫兹模拟器的差异的,所以他们自然会选300M赫兹的。尽管我真的尊重而且欣赏速度优先的模拟器,但是对于关注准确性的玩家而言,他们没有办法,只能暗自不爽,这种做法使得模拟进程停滞不前。如果没有更多的玩家用更准确的模拟器来玩游戏,就无法发现模拟器支持的游戏的错误。只要有更多人用游戏原本设计的方式来玩游戏,就会发现模拟器的问题,然后踏平,模拟器也会越来越好。发现了问题不要去修改针对每个游戏的特殊代码,而是修正模拟器的准确性。
下面的截图是一个很好的例子,这是一个小众游戏,其实是一个很好玩的平台游戏,但是知道的人不多。这个例子很好的说明了为什么不准确的模拟器很好地支持了多数流行游戏的同时,准确性还是那么重要。因为你永远不知道一个你喜欢的但是却稍微不常见的游戏什么时候会出这么一个错误。下面的截图里有个开关,在其他模拟器中,只要开了这开关,游戏立刻死机。后面的截图交代了原本应该出现的事情——这个开关会移动一个箱子到电场中间,只有这样才能过这关,然后才能打完游戏。在写此文时,bsnes是唯一一个可以彻底玩这个游戏的超任模拟器。
超任不仅有高分辨率显示模式,还有一个变种的“伪高分辨”模式,这个模式用来实现超任硬件图层间真正的阿尔法混合[alpha-blending]。忽略此模式会造成一些图层彻底覆盖其他图层,好比下面的图片。
[
本帖最后由 SSforME 于 2021-7-9 14:17 编辑 ]