异星工厂吧 关注:66,533贴子:441,069

回复:品质产线与迷你超市的终极通解——浅谈配方切换电路与产能保护

取消只看楼主收藏回复

在配方切换电路中,限制抓入物品总量也很重要,因为爪子会根据组装机速度给高速组装机缓存大量物品。这在切配方的架构中非常不利,因为抓出缓存物品需要大量的时间,长此以往我们的组装机利用效率会大大降低
抓入限制电路就很简单了,分一根线出来读取组装机内容物,再设置一系列抓入限制值,乘以-1,把两股信号同时传递给黑名单爪,这样当组装机内物品数量大于抓入限制,这个信号对于爪子来说就会变成大于0的黑名单信号,从而停止爪子的抓入


IP属地:美国21楼2025-10-25 14:12
回复
    那怎样才能禁用某些配方呢?很简单,在配方运算器后面串一个常量箱,塞满-1G信号就行。
    负的配方信号无法设置组装机的配方,这一点和爪子的筛选器设置是类似的


    IP属地:美国24楼2025-10-25 14:20
    收起回复
      2026-11-02 07:30:21
      广告
      不感兴趣
      开通SVIP免广告
      先歇一会,过会来更新产能保护电路,这个是重头戏


      IP属地:美国25楼2025-10-25 14:20
      回复
        继续更
        上面的所有电路切换配方的根据都是原料量和产物量。一旦我们开始引入产能加成,随意切换配方就有可能导致产能条的丢失。如果想要用这类电路处理插件合成,铸造厂升品等配方,产能保护电路就是绕不开的话题。
        产能保护电路要求我们合成某一配方的次数乘以产能加成为整数。为了实现这一目的,我们需要读取组装机配方完成时刻。

        配方完成时刻输出的信号是一个脉冲信号,并且大小与这一tick生成的物品数量有关。具体到50%产能的经典例子上,这个信号会交替输出1和2。
        实际应用中,我们采用下面的电路来实现产能保护,关键在于两个多出来的判断运算器以及一个排序模式的选择运算器。

        配方锁存和前面说的一样,没什么特别的。

        自然,为了计数配方完成信号,我们会想到用另外一个锁存器来记录信号的总值。由于信号累加起来之后循环为3,我们可以直接让锁存器的最大值为3,到了3之后自动溢出重置。如果产能加成不同导致物品产出周期不同,3可以改成其他值。

        常见的产能保护电路一般到这里就开始准备用合成次数锁存器的信号直接禁止配方信号输入组装机了,这样可以保证合成2次之后强制切配方,变现规避了合成一次切配方带来的损失。但这样做的问题在于频繁切换配方会降低机器的总运作效率。有没有一种方法,可以让机器不受打断一直连续合成,并且保证切配方一定是在偶数次合成切配方呢?


        IP属地:美国30楼2025-10-25 17:25
        回复
          答案是用另一个锁存器暂存旧配方,并在配方运算器输出结果变动时暂时覆盖掉新配方,等待偶数次合成开始后再停止锁存。
          这样的设计不需要引入任何狗屁倒灶的时钟或者物品计数,也不需要奇奇怪怪的触发条件,简洁而高效

          听起来很复杂?别急,让我慢慢解释
          配方运算器的信号变动只由物品存量决定。由于我们不使用时钟和延时,配方运算器的信号变化都是即时的。
          接下来我们再补充一个知识点:绿条开始走之后,组装机的配方无法被信号切换。绿条开始走之后,即使组装机的配方被信号改变,它也会等到绿条走完之后再切换到新的配方。
          下面就是演示。可以看到,不论输入信号如何改变,机器总是会等到绿条走完后再响应。


          IP属地:美国35楼2025-10-25 18:14
          回复
            这个特性其实是Wube设计出来防止玩家滥用大于100%的产能加成,防止玩家在机器的绿条还没走完,原料没有实际消耗的时候就拿到产物。
            手动切换配方自然没有这个限制,但是众所周知,异星工厂是个自动化游戏,玩家要是都沦落到手动打螺丝刷物品了那也没必要玩这个游戏了。
            下面是“打螺丝”bug的演示。一般刷的物品是传说量子处理器,因为可以分解出各种传说产物。


            IP属地:美国37楼2025-10-25 18:16
            收起回复
              配方运算器的信号变动只由物品存量决定。由于我们不使用时钟和延时,配方运算器的信号变化都是即时的。
              假如配方运算器的输出在第奇数次合成开始时(也即合成计数器=0的时候)因某种原因改变,在此次奇数合成的绿条走完之后,配方就会切换成新配方,导致我们损失掉一半的产能条。
              反之,如果配方运算器的信号输出只在偶数次合成开始后(也即合成计数器等于1的时候)改变,那么我们就永远会在跑完产能条后刚好切配方。
              下面的动图清晰演示了这一特点。在合成次数为0的时候,我们正在跑第奇数次合成,此时我们应当禁止配方在这次合成后更改,而当合成次数到1的时候,我们正在跑第偶数次合成,应当允许配方在这次合成后改变。
              、
              因此,我们的配方锁存应当在合成次数为0的时候用旧配方信号锁定信号输出,在合成次数为1的时候反而可以不锁定。锁定信号输出的方法也很简单,用非常大的旧配方信号覆盖掉新信号或者旧信号就行,反正选择运算器只会输出最大值。这里我们选择让配方锁存输出1G的旧配方信号,用来在奇数次合成进行时禁止配方切换。

              这样我们仅仅只是阻止了不合时宜的配方切换,而不是每次合成到偶数次的时候都要刻意打断配方信号,重新计数,因此实现了连续合成


              IP属地:美国38楼2025-10-25 18:33
              收起回复
                那么接下来就是举一反三了。核心思路:假设绿条走完n次后产能条刚好走完,那么我们只能允许在第n-1次合成之后切换配方,此时第n次的绿条开始走了,切换配方的效果会在第n次绿条走完之后生效,从而保护产能条。
                具体来说,140%产能的例子中,配方完成信号的周期为1,1,2,1,2,那么我们把时间点卡在最后一次合成之前,在信号总数小于1+1+2+1=5的时候,禁止配方切换。当信号总数达到5,我们就进行了n-1次合成,可以允许切换配方了


                IP属地:美国39楼2025-10-25 18:41
                回复
                  2026-11-02 07:24:21
                  广告
                  不感兴趣
                  开通SVIP免广告
                  这样的产能保护电路还有一种有趣的变种应用——可适应不同产能科技的产能保护
                  产能科技的加成每一级是10%。那么我们只要保证合成周期是10次就没问题了!问题在于随着产能加成的改变,配方完成信号的规律与周期也会随之改变。那么我们该如何监测绿条完成次数?

                  答案是用下降沿检测器监测原料消耗!
                  下降沿检测器的原理我就不多讲了,简单说就是利用运算器的1tick延时来在某个信号值变小时产生1tick的脉冲信号。这个脉冲信号刚好可以用于计数,不过需要一些额外的信号处理,所以电路体积较为庞大

                  上下两张图给出了下降沿检测器的两个组件——一个反转信号的算术运算器,还有一个判断运算器。


                  IP属地:美国40楼2025-10-25 18:49
                  收起回复
                    产能保护电路的思路基本上就讲到这里。我的这个设计可以保证机器尽可能少切换配方,提高机器利用率,逻辑与结构相当简单,不涉及输入物品计数和时钟,并且对任何配方都同样通用,这在配方切换中是非常大的优势
                    弊端嘛......其实也有,如果输入物品数量不足,可能会导致绿条无法第一时间开始跑,从而允许机器在完成了奇数次合成后卡在原地,然后切换配方。这个产能保护思路依赖于绿条开跑后机器无法切换配方的特性,因此需要保证机器供料稳定。
                    不过嘛,你都用锁存器切配方了,把原料下限拉高一点防止机器断粮也是举手之劳了
                    对于极高速配方,这个电路处理的效果也一般,因为绿条进度太快,产能保护电路都还没反应过来呢下一个绿条就走完了。因此我在高速合成齿轮的组装机那里额外加了个保险装置,确保没有配方装载的时候配方锁存器与合成次数锁存器会被强制清空。


                    IP属地:美国41楼2025-10-25 18:56
                    回复
                      讲了这么多,吧友们可能有个疑问:你嘴上说的好听,可以在一个运算器里写无数种条件,那真让你写几十个配方的条件,你不得写死啊?
                      的确,这触及到了这类电路的另一个问题——写条件实在是太麻烦了。镇楼图第三张的那个组装机切换电路,配方运算器中保守估计也有450个以上的条件,这要是一个个写不得写死人啊,有没有什么更简单的方法呢?


                      IP属地:美国42楼2025-10-25 19:07
                      回复
                        有的兄弟有的!
                        第一个能想到的自然是参数化蓝图


                        将参数0设置成产物,参数1到5都设计成原料,再通过不同数字区分每个条件右侧的值,这样你只需要填入需要的配方,以及配方各种原料的上下限值就可以自动生成配方锁存器了,更具体的东西我就不讲了,愿意探索这玩意的玩家肯定也能搞明白,这个蓝图还可以设置产物缓存的上下限。


                        IP属地:美国43楼2025-10-25 19:11
                        回复
                          但是参数化蓝图也只能解决单个配方的问题。你就算想塞进去多个配方,你也没这么多参数可用啊?那我们要怎么写出来有几百个条件的锁存器呢?
                          答案是通过json编辑合并条件
                          众所周知,异星工厂的蓝图字符串只是通过base64加密过的json文件。我们可以用第三方网站把蓝图字符串解码成json,但是如果我告诉你,原版异星工厂就有内置的json输出功能呢


                          IP属地:美国44楼2025-10-25 19:14
                          收起回复
                            要想开启这个功能,我们需要进入隐藏设置菜单
                            首先ctrl alt单击设置按钮

                            你会发现设置里多了一项其余,这里面就是各种各样的开发者选项和隐藏设置了
                            直奔主题,右上角搜索框搜索json,找到这一项,打勾即可
                            之后我们就可以在ctrl alt左键点击蓝图导出按钮

                            然后就可以直接复制蓝图的json了
                            有了蓝图json之后,合并条件,增删条件,乃至批量操作品质,交换红绿线配置都变成了一个ctrl+F和一些剪切粘贴的事。
                            之前的那个63条件锁存器转化成json格式后居然有一万行以上!这要是手写真不知道得写到什么时候去了


                            IP属地:美国45楼2025-10-25 19:19
                            收起回复
                              2026-11-02 07:18:21
                              广告
                              不感兴趣
                              开通SVIP免广告
                              品质升级产线和迷你超市相关的内容我还是留到下一次吧,光讲明白这一堆电路就很费劲了,总之这几天之内我会发布一套可模块化无脑拓展,可升级的总线架构草星转转乐,这个工厂是品质产线,结晶产线,碳纤维产线,火箭产线,沃土产线,迷你超市的N合一,可以稳定产出大量传说白爪生物室和传说碳纤维,先在这里放个小预告

                              本帖完结撒花,镇楼图的这些切配方产线我会在近期一一放出,敬请期待


                              IP属地:美国47楼2025-10-25 19:25
                              回复