各位自动化同好们,大家好,我终于决定花点时间整理一下这份参考文档了。
之前介绍过《我的第一座MAM》,既然是第一座,就只是能用的程度,性能上还是有很大提升空间的,一直想着优化。鸽了这么久,现在终于有时间介绍给大家了。
这座MAM目前迭代到了第四版(MAMv4),每五分钟以内可以过一关,无产量损失。不出意外的话应该是最后一版,再有时间的话我可能会去琢磨 TMAM(悬空MAM),或者转战《异形工厂2》。
目前的游戏版本,HUB需求不会出现悬空图形,只要完成了MAM的建设,确认并稳定交付速率,那过到多少关就只是时间问题了,几千上万关也就都失去了意义。
本文档分章节介绍各个模块,并附模块总览图,包括实体层和电路层,总览图通常会比较大,所以尽量放在章节的最后,可以先拉到章节最后看看总览图,有个大概印象再回头看细节。
方案简介
游戏的升级选项共有四个,本方案是在所有选项都同步升级的情况下设计实施的。如果你的电脑性能足够,可以偏向升级传送效率,这样传送和分发设施有了足够的吞吐量,就可以容纳更多的工厂产能,通过建造更多的工厂来提升过关速度。
优化的过程其实就是不断精简设施规模的过程,《异形工厂》是基于Electron框架开发的,这个框架本身就存在规模性能问题,游戏中的设施一多,就会出现卡顿情况。所以精简规模就可以多造几座MAM,多几座MAM就可以提升过关速度。
说是MAM,但一个存档中不只有MAM,还包含生产升级图形和蓝图的工厂,本方案兼顾升级图形、蓝图以及关卡图形的生产和交付。
在关卡图形生产期间全速率生产并交付升级图形和蓝图,当生产出足够的关卡图形时,则暂停升级图形和蓝图,转为全速率交付关卡图形。这个切换是全自动完成的,不需要任何的人工干预。
三种升级图形的产量是按升级需求量规划的,也就是 2:1:1 的比例。至于蓝图则利用了一点超速率的技巧,做了两条传送带的量。
超速率其实最多可以做到额外多四条带的交付速率,也就是说,HUB有16个交付口,超速率最多可以做到20条传送带满速率交付,当然本方案并没有追求这个极致,只要多出两带交付蓝图就够了。
先看一张总体的缩略图吧,上半部分是升级图形和蓝图的生产工厂,下半部分是四座MAM。在中心HUB的正下方是四座MAM共用的交付模块,用于缓存图形一次性交付以满足交付速率的需求。
总体缩略图
概念约束
都玩到MAM了,大家对游戏的概念肯定都了然于胸了,但我还是想对一些概念或术语做一个约定,方便大家阅读本文,因为我不知道其他玩家是如何称呼这些东西的。我写过不少游戏攻略,除非是日常交流,在正式的攻略文档中不太喜欢用行话或者说黑话,那通常对新人不友好,即使用也会尽量解释一下,所以我的攻略有时也会有点啰嗦,希望各位包涵吧。
图形:指正式交付到HUB的最终产品,例如蓝图、升级图形、关卡图形。
形状:指生产图形的过程产品,半成品,通常是图形的某一层,有时也指多层半成品。
象限:一个完整形状可以分为四个区域,从右上角区域开始按顺时针顺序分别为第一象限(右上)、第二象限(右下)、第三象限(左下)、第四象限(左上)。
象限形状:指一层形状中某一个或多个象限的不完整形状,多数情况是指一个象限的形状,即完整形状的四分之一。
一带:指在当前升级情况下一条传送带满速率的传输速度或吞吐量。
中心HUB
MAM的生产和交付是需要时间的,本方案四座MAM,关卡切换后需要约2分钟的时间开始产出目标图形,然后需要约2分钟完成缓存积累并激活交付模块,最后需要约40秒完成交付。除了最后交付的40秒,之前的约4分钟时间,对于关卡图形来说,HUB是闲置的。
交付切换
我们当然不能真让HUB闲着,这段时间正好利用起来交付升级图形。也就是说,多数时间是在交付升级图形,每隔4分钟中断一次,中断时间40秒;而关卡图形则是每隔4分钟交付一次,交付时间40秒。
两种图形的切换是借助一个由过滤器、传送带读取器,再加上一个非门组成的小装置完成的。参考下图,左侧的图是最简布局,分实体层和电路层;右侧的图是实际应用布局中需要走线的示例。
交付切换
过滤器的机制是——
当输入信号为 1 或者输入内容和输入信号匹配时,则从↑输出端输出内容;
当输入信号为 0 或者输入内容和输入信号不匹配时,则从×废弃端输出内容;
当无任何输入信号时,则阻塞。
关卡图形走①路线经读取器,升级图形走②路线经过滤器后并入①线。
当①线有关卡图形到来时,读取器的计数侧输出1,使用非门取反后得0并给到过滤器,则过滤器流向×废弃端,停止交付升级图形,①线的吞吐量将全部用来交付关卡图形。反之,则过滤器流向↑输出端,交付升级图形。
超速率交付
关于超速率交付参考下图的左侧部分,使用平衡器、合并器、分离器将HUB的所有交付口都围起来,相互之间不留传送带,这样可以多出4个输入口用于交付。
其原理是利用了游戏的一个特性,即当两条传送带经合并器或平衡器合并后不经传送带而直接输入HUB或垃圾桶时,其速率之和会大于单条传送带。
超速率交付
如上图右侧部分所示,等级为50,效率11.10倍,即传送带速率为22.2/s的情况下——
①号装置是正常的单带满速率 22.2/s;
②号将两条传送带合并到一条传送带,然后交付,速率仍然是 11.1 × 2 = 22.2/s;
③号则合并两条传送带后,直接交付,速率变为 13.3 × 2 = 26.6/s。
本来升级图形的生产交付比为2:1:1,正好打满16个交付口,预留的两带蓝图产线是用一个开关暂停的,只在需要时手动开启,开启后需要暂停两带的升级图形转而交付蓝图。有了超速率后就可以满足16带升级图形和2带蓝图的同时交付。当然蓝图在后期基本用不完,看需求吧。
不过,超速率并不是任何时候都有这么明显的效果,这跟升级等级有很大关系,具体可以参阅Steam社区一篇名为《超速率输送及升级等级建议》的指南,为避免被BAN,就不贴链接了,需要的去社区搜索吧。
中心HUB总览图
中心实体层总览
中心电路层总览
交付模块
交付速率的需求从第27关的4/S开始,每4关加1,直到第811关的200/s就不再增加。生产和传送的效率升级到10倍后提升幅度就很小了,10倍效率的传送带满速率为20,需要至少10座MAM才能满足200/s的需求,由于游戏本身的规模性能问题这不太现实(或许有更精简的MAM我没有想到)。
好在游戏提供了存储器,可以存储最多5000个物品,每个存储器有2个输入和2个输出,我们可以利用8个存储器对图形进行缓存,当积累到一定数量后,16个输出口一次性同时交付,可以在短时间内打满HUB的16个交付口,满足交付的速率需求。
为了方便说明,我把交付模块分为三个区域:交付区、拦截区、输入区,你可以先下拉看看交付模块总览图,我在上面做了标记。
交付区
交付区是交付模块的核心区域,由①、②两部分实体层以及A、B两部分电路层组成。
①部分包含8个存储器以及16个出口过滤器,结合A电路,实现关卡图形的缓存,姑且称为缓存机。
②部分包含1个存储器和1个过滤器,负责控制缓存量并激活①部分的过滤器,姑且称为计量机。
至于B电路,则是一个保障措施,没有它的话交付模块虽然也能运行,但效率会打很多折扣。
先将缓存机和计量机简化一下做个机制说明,如下面动图所示——
交付模拟
MAM生产的图形从左上角经4个分离器,大部分进入上面的缓存机,少量进入下面的计量机。
存储器电路层有2个输出:当存满时数字侧输出1,否则输出0;图形侧则输出当前存储的图形信号,只有存住图形时才有信号,图形途径时是没有信号的。
利用这个机制,再配合过滤器,就可以实现缓存机和计量机之间的互锁和互激活。
可以看出来,缓存机在激活输出之前能缓存多少图形,取决于两方面——
其一是计量机中存储器与过滤器之间传送带的长度,这条传送带越长,计量机输出图形信号的间隔时间就越长。区域空间有限时可以走S型路线加长。
其二则是左上角分离器的数量,分离器越多,分发给计量机的图形就越少,相应的计量机输出图形信号的间隔时间也会越长。
上图示例中的缓存机只有一个存储器,若有多个存储器的话,就将它们的电路图形侧信号使用非门取反后再使用与门连接起来,这样只有当所有存储器都清空后,才会重置计量机。理论上讲,连接多个存储器的图形信号可能会出现信号冲突,比如当多个存储器存储的图形不一致时,但实际上有B电路的保障,再配合拦截区的“脏图形”过滤是可以避免这种情况的。
关于B电路,还是以上面示例为基础介绍,如下图所示——
缓存机的过滤器不再是由计量机直接激活,而是由B电路的输出来控制,下图红色箭头指示的方向就是B电路的信号输出,底部红色圆圈标记的恒定信号是模拟中心HUB的信号。
交付保障电路
具体的电路逻辑就不废话了,可以自己看,只说一下业务逻辑。B电路会有三种信号输出:计量机的图形信号、或无信号、以及0信号。
当缓存机中还没有存储图形,或者存储的图形与HUB信号一致,那么B电路的输出取决于计量机,此时若计量机已经积累足够的图形则输出图形信号激活缓存机的过滤器进行交付,否则无信号输出,锁住缓存机。这种情况发生于MAM正在生产当前关卡的图形。
当缓存机中存储的图形与HUB信号不一致,则B电路会忽略计量机的信号,直接向缓存机的过滤器输出0信号,此时缓存机激活,但并不是交付,而是走过滤器的×废弃端清空缓存。这种情况通常发生于刚过完一关,但缓存机还残留了上一关卡的图形。
因为在交付图形时,HUB统计速率是需要时间的,这时HUB信号还没有切换,MAM又生产了更多图形,这些图形应该在HUB完成速率统计切换信号后清理掉。当然,我们可以在交付期间切断MAM的信号输入使之停止生产,但一方面确实没这个必要,更重要的是即便MAM停产,在传送带上也会有残留。
存储器同时只能存储一种物品,不同的物品会堵在输入口进不去。B电路可以保障缓存机在关卡切换时及时清理上一关的图形,释放缓存以接收新关卡的图形。
拦截区
③拦截区没太多可说的,就是使用16个过滤器,对应交付区8个存储器共16个输入口,这16个过滤器只接收中心HUB的信号,也就是只放行当前关卡所需图形,其他图形统统废弃。
拦截区可以避免交付区缓存“脏图形”,保障交付区电路的正常运转。
输入区
④输入区接入MAM生产的图形,本方案接入了四座MAM,每座MAM的产出都使用多个分离器控制进入交付区计量机的图形数量。
总览图中输入区下部中间的那个形似沙漏的布局,是为了平衡左右两侧MAM的产量输入。
四座MAM分左右各两座,虽然它们稳定状态的产能是一样的,但预热所需时间不一样,而且实际过关所需要的缓存量也不需要等到它们都进入稳定态,因此左右两侧的产量是有差别的。利用平衡器摆放这样一个负载均衡装置可以平衡交付区8个存储器的输入量。
交付模块总览图
交付模块总览
万能制造机
进入本方案的主体部分,MAM,全称 Make Anything Machine,说是万能,但其实并不万能,毕竟还无法制造悬空图形,不过对于游戏本身的过关需求来讲,确实可以称得上万能了。
一个关卡图形最多需要堆叠四层,每一层由1~4个象限形状构成,游戏中共有四种象限形状:圆形(Circle)、矩形(Rectangle)、星形(Star)、扇形(Windmill)。也就是说每一层的每一个象限都有五种可能,除了四种象限形状外还可能是空。
此外,游戏中有8种颜色:红色(Red)、绿色(Green)、蓝色(Blue)、黄色(Yellow)、紫色(Purple)、青色(Cyan)、白色(White)、无色(Uncolored),其中红绿蓝为基本色,可以直接采集到;黄紫青白需要使用混色器制作,而无色则是形状的原始颜色。所以一个图形的每一层的每一个象限有8种颜色可能性。
MAM需要兼顾上述的所有可能性,把问题拆分来看,只需要做出单层图形的工厂,然后复制3次,将4座单层工厂的输出按顺序堆叠起来就是目标产出。所以下方的总览图只是其中一层的工厂,我在上面做了标记,可以先看看。
图形分析电路
MAM要生产关卡图形,首先得知道当前关卡需要的是什么样的图形,中心HUB会输出当前需求的图形信号,游戏提供了一系列电路层的模拟器件,可以用来分析这个图形信号。在真正开始介绍本方案的MAM之前先看看具体如何分析图形吧。
图形是可以多层堆叠的,最多四层,那么就需要至少3个模拟拆分器对图形信号进行拆分,然后使用图形分析器逐层分析。
模拟拆分器的机制是提取最上层的图形信号从右侧输出,其余的图形信号从左侧输出,所以需要多个拆分器逐层提取。
图形分析器的机制是分析图形最底层的第一象限(右上),并从右侧输出其形状信号,左侧输出其颜色信号,其中形状信号是该象限形状所组成的完整图层形状,而非仅仅象限形状。所以需要对形状进行旋转,分别分析每个象限的信号。
MAM图形分析电路
如上图所示,从下到上使用四个模拟拆分器对图形进行拆分,然后每一层分别使用四个模拟分析器分析四个象限的形状。最下面的拆分器右侧输出的是图形最顶层的形状。
上例中使用了四个模拟拆分器,但其实三个就够,最顶上的第四个是不需要的,因为第三个的左侧输出的就已经是最后一层形状了,不需要再拆分。
生产区
生产区包含混色机和上色机两部分。如下图所示,这是负责一个象限形状的生产区实体层和电路层,请暂时忽略电路层黑线覆盖的部分。
所需原料是基础的形状和颜色,也就是圆形、矩形、星形、扇形四种完整的基础形状,以及红、绿、蓝三种基础颜色。
MAM生产区
混色机包含两个混色器和若干过滤器,一个混色器负责生产黄、紫、青三色,两个混色器配合生产白色。混色机依据图形分析器的颜色信号,经过一系列条件判断和过滤,输出目标颜色。也就是说混色机的输入为红绿蓝三原色,输出则是包含三原色在内的7种颜色,由于单层形状的单一象限只可能是一种颜色,所以混色机同一时间也只需输出一种颜色,合并到一条传送带即可。
上色机使用一个双面上色器对形状进行上色,双面上色器的颜色入口处放了一个过滤器,这个过滤器也会接收图形分析器的颜色信号,可以将上一关卡时残留在传送带上的颜色快速废弃,避免影响当前关卡的响应速度。
双面上色器的形状入口处也放了一个过滤器,这个过滤器接收的信号是一个表示当前颜色需求是否为无色的开关量,若颜色需求是无色,则形状绕过混色器直接输出。
最后,上完色的形状进行四切,并旋转到对应的象限,然后输出到后面的堆叠机进行堆叠。
关于生产效率做一点说明——
如前所述,本方案是在所有升级选项同步升级的情况下设计实施的。
以此为前提,一个双面上色器的效率,或者说对形状的需求及产出是一带的1/4,对颜色的需求则是一带的1/8,因为一个颜色可以同时上色两个形状。
而一个混色器的效率是一带的1/6,完全可以满足一个双面上色器的需求。
同时,一个完整形状可以切割成四个象限形状,切割效率也是一带的1/4。
那么,只要单位时间内生产一个完整形状,然后一切为四后,刚好打满一带。
所以,只需要一个双面上色器,配合一个可以生产白色的双混色器串联组 就可以满足单层单象限的产能需求。
堆叠区
每一层都需要三套堆叠装置:首先四个象限形状两两堆叠为2个半形状,然后2个半形状堆叠为1个完成形状。每套堆叠装置简化图如下——
MAM堆叠区模拟
一套堆叠装置需要两个原料入口和三个产品出口。虽然HUB需求不会出现悬空图形,但缺角的情况还是会出现的,而堆叠机只有当两个输入都有的时候才会输出,因此如果遇到缺角的情况,应该绕过堆叠机直接输出。
如上图所示,两个原料入口处放置两组过滤器和读取器,当右侧没有形状输入时,则左侧形状直接走①线输出,反之右侧形状直接走②线输出,只有当左右输入都有形状输入时才会经堆叠机走③线输出。
原料输入的尽头放置垃圾桶,将来不及进堆叠机的形状销毁,防止堆积后造成阻塞。
上图只是一个用了4个堆叠机并联组成的简化装置,一个堆叠机的效率是一带的1/8,因此需要至少8个堆叠机并联才能满足一带的速率。考虑到会有来不及进入堆叠机而被销毁的形状,可以让堆叠机的数量更多一些,尽量提升堆叠效率,降低原料损耗,从而提升生产效率。如本方案的每套堆叠装置都使用了14个堆叠机,虽然仍会有极少量的原料被销毁,但其实已经可以说是没有产能损失了。
进料区
进料区负责向MAM出入形状和颜色原料。
MAMv4所需的原料都是基础的形状和颜色,但是完整的基础形状产地较少,且分布比较分散,需要各种飞传送带,所以我干脆直接使用隧道来代替传送带运输。
官方社区有一个叫做 ShapeGenerator 的模组,这个模组是一个只占一格面积的设施,可以生成任何指定的物品,用这个模组一方面可以代替原料产地,另一方面可以进一步减小设施规模。毕竟我们的核心玩法是MAM的建设和优化,原料方面可以简略一下。
不过本方案暂时没有引入任何模组,还是飞了不少进料用的隧道和传送带。因为这个原因,最初是打算接入四形混合形状作为原料的,所以制作了下图这样的装置——
原料加工装置
这个装置是将四形混合形状四切后重组。但是这种四形混合形状的产地同样不多,通常与MAM之间存在一定的距离,该飞的线一点也不少。而且MAM的每一层都需要四个这样的装置,其本身也会增加存档的设施规模,所以干脆直接采集基础形状。当然由于原料产地的距离原因,以及不存在完整的扇形基础形状,有些原料还是需要在产地加工一下再飞过来。
在之前的版本中,还采用过这样一种方案:先对四形混合形状进行上色,然后四切后直接输出。
其他方案
如上图所示,这种方案直接输出象限形状,堆叠之前不需切割,但需要电路层多做一点事情,由于图形分析器输出的是完整的形状信号,那么要想用这个信号控制过滤器的输出,需要先对其进行模拟切割和模拟旋转。
之前的版本也尝试过其他方案,最终都被淘汰,就不一一介绍了。
还是回到本方案的进料区,如下图所示——
MAM进料区
基础形状和颜色的进料路线没什么可说的,就看你怎么飞线了。
前面对生产效率做过说明,本方案使用的是双面上色器,那么一种基础颜色的一带产量可以支持8个象限工厂。一种基础形状的一带产量可以支持4个象限工厂,而基础形状刚好有4种,也就是说,每种基础形状各1/4的产量合并为一条传送带刚好一带,将这四形状组成的一带产量输送给象限生产区,在进入双面上色器之前用一个进料过滤器筛选出该象限当前需要的基础形状就可以了,这个过滤器接收的就是图形分析器的形状侧信号。
值得注意的是,如上图红框标注的电路,进料过滤器并不是直接接收图形分析器的信号,而是经过这个电路调制的信号。
由于关卡图形的任意层都可能存在缺角的情况,那么某个象限的图形分析器就可能无任何信号输出,这时进料过滤器无任何信号输入的话会处于锁定状态,又由于本方案基础形状的进料存在共用的传送带路段,那么一个象限进料阻塞就会导致其他象限进料拥堵,降低效率。
这个电路的作用就是将图形分析器的无信号调制为0,让形状走过滤器×废弃端销毁。当然,如果各个象限的进料是完全独立的,那就不需要这个电路。
单层总览图
MAM单层实体层总览
MAM单层电路层总览
其他工厂
其他的升级图形和蓝图工厂就不多说了,简单贴几张图吧。
其他工厂
升级图形
升级图形
升级图形
蓝图
----------
Enjoy your Shapez!