» 您尚未登录:请 登录 | 注册 | 标签 | 帮助 | 小黑屋 |


 61 12345
发新话题
打印

[模拟相关] 超任模拟器为什么需要3GHz的处理器来达到精确

超任模拟器为什么需要3GHz的处理器来达到精确
Why Perfect Hardware SNES Emulation Requires a 3GHz CPU
http://www.tested.com/tech/gaming/2712-why-perfect-hardware-snes-emulation-requires-a-3ghz-cpu/

准确性需要处理能力: 用3GHz构建完美超任[SNES]模拟器的任务

作者:Byuu
http://arstechnica.com/gaming/news/2011/08/accuracy-takes-power-one-mans-3ghz-quest-to-build-a-perfect-snes-emulator.ars



互联网上用模拟器玩老游戏的讨论非常普遍,经常爆发些某游戏用哪个模拟器玩最好的争论。今天,我们换一个角度来看这个问题,介绍一下超任模拟器bsnes的作者的看法。他想要讲讲他认为模拟器体验的最关键部分——准确性。

用现代的电脑[PC]来玩任天堂红白机或超任游戏并不需要占用太多处理能力,1990年代的模拟器只需要25MHz的处理器能力就可以了。但是如果需要准确模拟老式家用机那就是另当别论了,有着完全不同的挑战。准确性好的模拟器可能需要高达3GHz的处理能力来忠实重现老科技。本文会介绍为什么准确性对模拟如此重要,还有为什么准确性如此难以实现。

简单而言,准确性是模拟软件模仿原始硬件程度的衡量。最明显的衡量方式就是直观兼容性——某老游戏能否在新模拟器上运行?但就从这么一个局限的角度也会扩展出许多小问题。实际上,多数软件对时序错误的容忍程度很高,甚至时序上有百分之二十的误差也能看起来正常运行。

所以问题就成了,如果我们能实现基本的兼容性,而且提高准确性会大大牺牲性能,为什么还要关心提高准确性?两个原因:游戏表现和保存。

首先是游戏表现。拿飞毛腿小子[Speedy Gonzales]为例,这是一个超任平台游戏,没有存盘功能,游戏时间在2至3小时。初一看,每个模拟器跑这个游戏都正常,但当你进入6-1关的时候,你很快就能发现准确模拟器和快速模拟器的差别。通关必须开一个开关,这时有一个很罕见的硬件状况,如果没有被模拟,游戏就死机了。可以想象这多让人不爽,一下子就白打了三个小时,遇到个打不通的游戏。除非软件在各方面的运行方式都与曾今硬件一样,这游戏就会有问题。

或者看看沙漠风暴[Air Strike Patrol],你飞机下方有个影子。这影子是用扫描线间栅格效果[mid-scanline raster effect]实现的,模拟这功能需要占用超多资源,但是如果没有栅格效果,飞机的影子就没了,就像下面的截图。如果你不知道本来该有影子,很容易忽略这个问题。一旦你看到过了,你就会知道这多么有用,你的飞机可以扔炸弹,这个影子的作用类似于瞄准系统,告诉你炸弹将扔在哪里。如果没有这个看起来并不重要的效果,确定炸弹扔在哪里会略微困难些。

第二个问题是保存。看看任天堂的Game & Watch掌机,这些机器最早1980年就出现了,至今共生产了4千3百万部,其中大多数都因为年代久远或人为损坏而不能再用了。尽管相对而言好机器还能搞到,但是珍惜度只会越来越高,也不会再生产新的机器了。这问题对于任何硬件都是一样的,一旦没有了就永远没有了。到那个时候,模拟器是唯一体验那些老游戏的方法,所以模拟器应该能准确再现游戏。

但是这样的准确性代价很高,模拟器准确性提高一倍,速度基本就要慢一半,准确性再提高一倍,速度就只有四分之一了。而这同时,提高准确性带来的好处却很快越来越不明显,多数游戏看起来和玩起来达到“可玩”程度只需要中等的模拟准确性。(多数模拟器的平衡点订在百分之九十五的兼容性同时取得优化的性能。)

不那么准确但是速度快的模拟器没什么不对,这样代码可以在处理能力较差的硬件上运行,比如手机、掌机。这样的模拟器也适合在追求电池时间的手提电脑上用。但准确性还是值得一提的,准确性也是我自己编写中尝试追求的。下面讲讲为什么这对我很重要。

软件实现

回到90年代末期,Nesticle是最好用的红白机[NES]模拟器,系统大概只要求25MHz。这样的性能带来很明显的问题,游戏画面经过针对这个模拟器的特殊处理来显示。民间翻译和游戏修改[hack]依赖模拟的瑕疵,这造成这些翻译和修改在真机上或其他模拟器上无法玩。于是造成了一种模拟器垄断,这种垄断持续了相当一段时间才被打破。当时人们通常并不在乎游戏本来看来和玩起的样子,只关心游戏在这个虚拟人造的环境中看起来怎么样,玩起来怎么样。

现在,最占统治地位的模拟器是Nestopia和Nintendulator,全速运行的系统需求分别是800MHz和1.6GHz。需要处理速度的原因并非是优化不好,而是这些模拟器在硬件还原的忠实程度上大大提高了。

拿这些模拟器和老的N64模拟器UltraHLE比,UltraHLE的需求仅仅是350MHz奔腾II系统[Pentium II]。对打酱油的旁人而言,他们很难理解为什么马里奥64[Mario 64(N64)]会比原本的马里奥兄弟[Mario Bros(NES)]需要的处理能力更少。

因为编写bsnes模拟器,我的模拟器经验主要在超任方面。我很欣赏Nestopia背后的理想标准,我想在超级任天堂[Super Nintendo]上实现这级别的准确性。根据不同的游戏略有差别,这种级别的对准确性的追求将系统需求提高到2至3GHz范围。


时空特警[Timecop]在两个很不一样的模拟器上的表现

Nestopia后来居上的原因是对系统的需求并未超过当时的主流,但是我认为如果1997年推出Nestopia的话,肯定会是灾难性的失败。由于我自己编写的模拟器的系统需求超过市面上一半以上的电脑,对于高配置要求带来的影响和反对我有第一手的感受。对于用户而言,更容易批评作者优化做的不好,而不是承认自己的电脑性能不够。将家用机完整实现的过程很困难却也是现实情况。

为什么准确性很重要

为什么一个模拟器看起来运行所有游戏都正常还需要改进呢?简单来说,因为这改进了一些还不为我们知道的事情。在一些并不那么常见的软件中,这点尤其重要。

举个例子,比较ZSNES和bsnes运行塞尔达传说[Legend of Zelda]的片头,旋转的圣三角[triforce]动画。前者的主芯片[CPU]速度比超任真机快百分之四十,所以旋转完成过快。这些是小细节,但如果你的眼睛对准确性要求很高,这会让你疯了。

我见过几十个有隐藏瑕疵的游戏。有时候正确的、准确性更好的模拟器事实上呈现了“错误的”结果。超级原人[Super Bonk]的攻击模式演示实际上会失去了同步,在许多真机上会造成原人卡死在墙边。星际火狐整个游戏都有明显拖慢的问题。这些肯定不是设计的本意,但无论如何这才是真实的。我们不会因为小数不方便就把派四舍五入到3,对不?

我不否认将经典游戏当成可以改进的作品所带来的好处,比如N64模拟器带来了震撼的高分辨率贴图和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位向后兼容了。到那个时候模拟器本身也变成了一台坏主机,不再能维持老游戏的生命。

这些问题的症结在于超任游戏应该在什么平台上运行?当然是真正的超任机器上。创造可以完美或者尽量完美模仿原始硬件的模拟器,就创造了支持多系统的平台,这个平台的未来版本确保可以玩到游戏和各种改版。这种思想就是确保超任的硬件规格还活着,而不是老游戏。

好吧,但是真的要3GHz?你搞笑吧?

用300MHz处理能力来全速运行一个充分优化、速度优先的超任模拟器是可以做到的,但最终也会带来上百个隐含的错误。

最典型的解决方案就是用专属修改来解决问题。ZSNES和Snes9X内部都自带了五十个左右常见游戏的列表,一旦加载了这些游戏,模拟器会自动调整时序值并且修正一些代码段来确保游戏运行。这比起Nesticle时代,在外部直接修改游戏的做法要先进,但无论最终显示结果怎么样,这依然是在作弊。

那些只玩最流行的二十个左右游戏的普通娱乐玩家是无法发现需要300MHz和3GHz模拟器的差异的,所以他们自然会选300MHz的。尽管我真的尊重而且欣赏速度优先的模拟器,但是对于关注准确性的玩家而言,他们没有办法,只能暗自不爽,这种做法使得模拟进程停滞不前。如果没有更多的玩家用更准确的模拟器来玩游戏,就无法发现模拟器支持的游戏的错误。只要有更多人用游戏原本设计的方式来玩游戏,就会发现模拟器的问题,然后踏平,模拟器也会越来越好。发现了问题不要去修改针对每个游戏的特殊代码,而是修正模拟器的准确性。

下面的截图是一个很好的例子,这是一个小众游戏,其实是一个很好玩的平台游戏,但是知道的人不多。这个例子很好的说明了为什么不准确的模拟器很好地支持了多数流行游戏的同时,准确性还是那么重要。因为你永远不知道一个你喜欢的但是却稍微不常见的游戏什么时候会出这么一个错误。下面的截图里有个开关,在其他模拟器中,只要开了这开关,游戏立刻死机。后面的截图交代了原本应该出现的事情——这个开关会移动一个箱子到电场中间,只有这样才能过这关,然后才能打完游戏。在写此文时,bsnes是唯一一个可以彻底玩这个游戏的超任模拟器。


超任不仅有高分辨率显示模式,还有一个变种的“伪高分辨”模式,这个模式用来实现超任硬件图层间真正的阿尔法混合[alpha-blending]。忽略此模式会造成一些图层彻底覆盖其他图层,好比下面的图片。


电子游戏是我们历史的一部分,我们要尊重历史,游戏发布的时候有其“真正”的形态。试想一下,我们只有一副蒙娜丽莎的JPEG,一段登陆月球的Real视频流媒,或者一段乐器数字接口[MIDI]的云中漫步[Walking in the air]。我们是有能力保护我们过去的,我觉得这甚至就是我的职责。

那么多余的2.7GHz用在哪了?同步。

简单关注主处理器的时钟频率是最常见的对模拟器性能精确评估的错误概念,实际上这数值什么意义都没。N64的中央处理器是超任的35倍,但是UltraHLE和ZSNES需要的处理能力是一样的。

最主要的模拟器需求在于处理器间每秒同步的总次数。模拟器本质上是串行处理,尝试借助今日的多核处理器造成各种时序问题。拿装配线来举例,一个人卸箱子,另一个人扫描,另一个人代开箱子,另一个组装,等等。同步相当于停止工作,清空整个装配线,然后开始装配一个新产品,这对最终产出影响很大,这做法完全忽略了管线和乱序执行。同步越多,装配线就需要更快的动作来跟上。

比较一下ZSNES和bsnes同步率:

S-CPU: 600,000 vs 21,477,272
S-SMP: 256,000 vs 24,576,000
S-DSP: 32,000 vs 24,576,000
S-PPU: 15,720 vs 21,477,272
Total: 903,720 vs 92,106,544

先看中央处理器的情况,典型的工作频率假设是3.58MHz,这个频率相当于每秒处理的周期数,一条典型指令通常要消耗四至八个周期。ZSNES每条指令同步一次。更技术一点而言,每个周期又细分成总线保持延迟,这个需要原始振荡器级别的时序。超任中央处理器振荡器频率是21.47MHz,对于声调器而言也一样,声调器的振荡器频率是24.58MHz。

再来看视频的情况,百分之99的游戏在写屏时不会去尝试改写显示寄存器,这样全部扫描线可以一次性完成,这需要262条扫描线 x 每秒60帧的同步率。但是像沙漠风暴[Air Strike Patrol]这样的游戏,每条扫描线期间都会多次写入显示亮度寄存器,所以每个时钟周期都必须要同步才能达到完全准确性。

再来看音频的情况,基本上按照超任的32kHz声音频率,每周期同步一次,几乎所有的游戏都能正常运行。但是一运性蚯蚓战士2[Earthworm Jim 2]这样的游戏,如果不是每个周期都同步的话,音效就会被截断。甲子园2[Koushien 2]甚至可能会周期性的死机。

所以说,尽管bsnes比ZSNES运行慢十倍,数字上来看却要精确100倍。事实上,只要3GHz就能达到这个效果令人惊叹。因为我运用了协作多线程[cooperative multithreading]和按需同步[just-in-time synchronization],这些技术在其他模拟器中我从未见过,只有如此我才成功维持了bsnes现在的性能。状态机根本就达不到这个效率,更别提内核调度[kernel scheduling]了。

最直接的体现就是,ZSNES只有百分之一的同步率,多数游戏也能正常玩。绝对的完美同步是罕见的需求,这点我不否认,但也要看到,有些时候就是需要完美同步。就超任的中央处理器的慢速度而言,许多游戏本来就已经将系统逼到了极限。

如果时序不完美,最终就变成长期打地鼠游戏[whack-a-mole 可以理解成“按下葫芦起了瓢”]了。改好一个游戏,另外两个出问题,改好这两个,又有两个出问题,再改这两个本来那个再次出问题。看看之前十五年的改动记录就能明白这个了。

模拟附加处理器

卡带游戏系统实际上就是把一块印刷电路板[PCB]插入了系统,这很有趣,因为这样一来你就可以在卡带里增加额外的处理器,通常是数字信号处理器[digital signal processor]。 这样就能比竞争对手的游戏更有优势,最常见的超任协处理器[coprocessor]是处理多边形渲染和精灵[sprite]旋转的SuperFx(用于星际火狐[Starfox]和超级马里奥世界2[Super Mario World 2]),和3D运算的DSP-1(用于飞行俱乐部[Pilotwings]和马里奥赛车[Mario Kart])。

这些处理器常独立于主机处理器,可以用高级模拟[high-level emulation(HLE)]来实现。超任协处理器不是特例,在N64的视频微代码[microcode]模拟中也能见到,还有一些其他的案例。

这时候就不独立考虑每条指令了,而是统一看成一组指令。换言之,程序这样来考虑这些功能——“在这些点上渲染一个三角形”或者“将这个精灵旋转某角度”。这样模仿这些操作就能几乎没有额外开销。但是这样却也忽略了每条指令执行间的时序信息。最大问题在于,这肯定不完美——一些原本的罕见情况、扭曲和问题都没了,最后得到略有不同的情况。

低级模拟[low-level emulation(LLE)]的做法是把数字信号处理器也当作普通处理器来对待——每次只执行一条指令。游戏运行不如真机快了,但是所有罕见情况都对了,这更为重要。用高级模拟方式马里奥赛车[Mario Kart]运行速度和超级马里奥世界[Super Mario World]一样快,但是用低级模拟方式,就要慢百分之25到30。后来的洛克人X[Mega Man X]游戏用的Cx4芯片性能很强劲,用低级模拟方式要慢一半。就算是超任的时代,数字信号处理器也非常强劲,典型的每秒百万指令性能[MIPS]达到21。

低级模拟实现起来开销很大,是指金钱开销大。为了得到数字信号处理器的程序代码,需要用硝酸腐蚀集成电路,然后用电子显微镜扫描芯片表面,再然后要么标注颜色后手动解读程序,要么物理上修改电路然后解出程序和数据只读存储器[ROM]。这活需要极专业的知识和设备,所以根据芯片的复杂程度不同,这事搞专业了能花费上数百万美元。感谢一个号称“斩首者博士[Dr. Decapitator]”的个人,帮我们解出近一打芯片的数据而只收取了材料费。

解出以后,就发现这些数字信号处理器常常是些专门组件,在基本没有文档的情况下要从二进制颗粒中反向工程出指令集。这很费事,这也表明了想要准确模拟这些游戏需要怎样程度的献身精神。

够准确了么?

老实说,就算解决了上面这些问题,我们也只搔到了准确模拟的皮毛。看看DICE,即数字集成电路模拟器[digital integrated circuit emulator],这是一个晶体管级别的模拟器,绝对完美再现了全世界第一个电子游戏——双人乒乓[Pong],以每秒5到10帧的速度运行这游戏需要3GHz的处理器。你没看错——目前还没有电脑处理器能以电路级全速运行双人乒乓[Pong]。并不是因为数字集成电路模拟器很慢,这个程序已经十分优化了,只是需要超大量的额外开销来仿真每个末端晶体管的传播延迟[propagation delay]。

但是总有一天能全速的。这个经典游戏为子孙们完全重现,我感到很高兴。

以数字集成电路模拟器的方式来处理更现代的系统问题就大了。但是有些聪明人搞出了Visual6502,他们用类似我们解数字信号处理器的方式扫描了6502中央处理器的表面,这处理器在NES和Commodore 64以及其他一些机器中都有。然后将晶体管向量化,忽略传播延迟,实现了芯片的高级仿真。用Javascript的演示很著名,然后也移植到了C语言,还进行了优化。尽管走了捷径,目前电脑还没有快到能在模拟器中这样来实现。

我的确是希望模拟器能支持每个末端晶体管传播延迟,实际上这不可能。这么说吧,我们这辈子是看不到能以这个级别把N64模拟到能玩的帧率。

即便是超任能否达到这个级别也令人怀疑。我很清楚现代电脑的运算能力在一定程度上决定了准确模拟的程度。

我采取的折中方案是把系统设计成类似真机硬件,并且将每个处理器独立开,只共享真实芯片会相互共享的状态值,最终目标是所有操作结果都与真机硬件完美一致。我的做法至少让模拟器与真机硬件看上去没啥区别,但不像数字集成电路模拟器那样,这没有将原始硬件设计以完美的数字方式呈现。


目标不是改进硬件,目标是尽量接近硬件

对于N64或更强的机器,我知道我这个做法都不可行了。我没有下简单的结论,但是我清楚没有人应该开发出全世界最强大的系统也无法达到每秒一帧速度的模拟器。

结束语

令我担心的是目前多是情况下开发人员甚至害怕用到现有系统的一半性能,而那些最早期的,最不准确的模拟器的系统要求浇铸了所有未来模拟器的评判标准。
我不明白,我们为什么不榨干现有处理器的性能,甚至期待未来更快的硬件。老式的模拟器还没有消失,用老式的慢速的硬件的用户依然可以选用老式模拟器。

对于那些有高性能系统,请给更准确的模拟器一个机会!开发人员绝对需要用户对他们的模拟器忠诚度更高些,开发人员也需要知音来鼓励他们继续开发下去。

[ 本帖最后由 chenke 于 2014-11-12 23:12 编辑 ]
附件: 您所在的用户组无法下载或查看附件


本帖最近评分记录
  • sirforest 激骚 +5 泪流满面 2014-11-11 10:11
  • 马甲爵 激骚 +5 泪流满面 2014-11-10 18:11
  • bbsbot 激骚 +3 太骚了 2014-11-9 11:25
  • alexey 激骚 +2 精品文章 2014-11-9 08:50
  • 马里奥派对 激骚 +1 恭喜发财 2014-11-9 00:15

TOP

写得很好的文章,虽然翻译有些问题,但不影响总体理解。

经常有人问某某烧录卡解决某某汉化ROM的画屏问题了么,读了这篇文章应该会知道造成模拟器可玩而实机画屏的这类问题的根源到底在哪个环节上了。

[ 本帖最后由 SONIC3D 于 2014-11-8 22:39 编辑 ]



TOP

posted by wap, platform: Chrome
可惜没有评价一下mame的snes模块


TOP

posted by wap, platform: iPhone
玩的是模拟器而不是游戏…

TOP

我觉得最抓狂的是,理论上不同批次的主机的物理特性也不一样……
光晶振批次就是个玄学

TOP

好文啊。

TOP

作為玩家只要關心能不能正常玩和硬件要求就行了
所以MAME在我眼裡就是不如FBA好用

[ 本帖最后由 USE2 于 2014-11-9 10:21 编辑 ]

TOP

这本来就是模拟器的真谛所在,我们不反对使用低配模拟器,但是对精确模拟的进步绝对不能停止,因为毕竟模拟器存在的作用在于传承历史。

TOP

好文,学习了。

TOP

posted by wap, platform: Android
只知道Wii官方100%模拟sfc要不了3g频率。

TOP

posted by wap, platform: MAC OS X
神啊

TOP

引用:
原帖由 488472 于 2014-11-9 11:39 发表
posted by wap, platform: Android
只知道Wii官方100%模拟sfc要不了3g频率。
WII VC的模拟只针对发布的那些游戏啊

TOP

谁直接贴优酷网址了,打开就自动跳转!

TOP

chrome打开就自动跳转到优酷页面是什么情况.

TOP

楼主是原中文翻译作者吗?还是转贴?请看http://bbs.emu-zone.org/viewthread.php?tid=788170

TOP

 61 12345
发新话题
     
官方公众号及微博