数字电路[信号网络]控制生产浅析
异星工厂吧
全部回复
仅看楼主
level 3
作为一个代码狗, 我想过我可能会在嵌入式, 服务器调优等各种领域运用位运算, 但是我万万没想到我第一次使用位运算居然是在打游戏[吐舌].
本文介绍的内容: 如何通过位运算, 来实现信号网络中信号的复用.
(注, 如果对位运算不感兴趣, 直接跳转到构建步骤即可)
说人话就是,只使用一个Z信号,来控制factorio中的矿物的生产. 再简单点就是用Z信号来实现对存储中心的各种矿物容量的判断, 来实现达到阈值时停止采矿, 低于阈值时开始采矿.
题外话, 开始和停止采矿是对电闸的应用,本文就不做介绍了.
背景:factorio中的信号一共就不到50个.而各种产品的数目缺远远多于这个值. 如果每一个产品分配一个信号来控制产量的话, 我们也就只能控制不到50个.
我在数学上实在没有什么天赋, 整个工厂根本不平衡, 而且我还安装了机器人世界mod,用机器人来运输,避免了流水线的计算. 但是工厂还是不平衡. 于是我决定使用信号网络来控制整个工厂的生产.
---------------下面开始正题----------------
首先介绍一点点位运算的数学基础吧. 本文就是对位运算的应用.
factorio位运算中的操作一共有以下几种:
移位运算[左移, 右移]. 逻辑运算[AND, OR, XOR].(NOT运算没有被支持, 但是能够通过xor 1来模拟出来, 问题不大)
另外本文完全基于二进制的运算, 我相信大家理解二进制应该是不难的. 反正我们也不用做进制的转换.
下面是一些位运算的例子.
有一个数 0001,
左移运算就是将数的所有位, 全部往左移动n个位. 左边超出原来的长度的就会被丢弃(但是在factorio里面长度限制很大), 右边的会补0
0001 << 1 = 0010
右移运算同理,但是右移会碰到右边的边界, 数据会被丢弃(这也不重要, 丢弃的数据我们不需要).
AND运算,就是位与运算, 每一个对应的位进行与运算. 全1为1, 其他为0
0010 & 0011 = 0010
OR运算,就是位或运算, 每一个对应的位进行或运算, 有1为1, 全0为0
0010 | 0001 = 0011
------------------数学基础完毕, 我也不知道你能否理解, 但是这也不是很重要---------------------
在开始在游戏里放运算器之前, 我还需要介绍一个游戏里面的机制.
一个网络中的同种信号的多个输入回累加起来.
比如说我现在有一个矿石网络, 有三个输入Z信号的, 每一个输入的Z信号的值都是1, 那么我再从这个拿到Z信号的值的时候就变成了3.
这个机制能够方便的帮助我们进行累加操作. 比如说将铁矿仓储中心(100个储物箱组成)用缆线连接起来,就会自动的获取铁矿的数目.
-------------------开始建设----------------------
我们现在使用一个简单的5个材料的单信号网络演示.
图有点没截好, 信号网络的核心电线杆子没有整进来.
这个网络三部分组成,
上面的五个箱子+上面5个判断运算器,+ 上面的5个算术运算器构成了输入部分. 按照箱子, 判断,算术为一组连接起来.
图片外面的一个电线杆子是网络核心部分, 将算术运算器的输出端连接起来, 然后接到电线上.
下面的两排算术运算器+路灯作为输出部分. 这里我用路灯代替电闸系统.
这几排运算器从上到下在下文中的称呼分别为,
判断运算器,
左移运算器,
右移运算器,
AND运算器
下面开始系统的构造.
第一步: 摆放储物箱.
第二步, 摆放判断运算器
第三步, 连接储物箱和判断运算器, 一定要竖着连接, 并且注意要连接判断运算器的输入部分,
第四步, 修改判断条件.
这五个箱子我分别放置了一组的铁, 铜, 齿轮, 钢材, 电路板
判断条件为对应材料的数量大于等于一组.
可以看到我的输出信号全部是Z[1]
第五步, 摆放输入系统的算术运算器.
第六步, 设置算术运算器.
上半个重点来了[酷]
按照从左到右的顺序, 依次对Z信号进行 << 1,2,3,4,5的设置. 主要, 千万不要设置重复了. 输出信号设置为Z.将移位后的Z信号输出即可
第七步, 将左移运算器的输出接到电线杆上. (实际应用中, 你应该是接入一个复杂的信号网络中)
第八步, 摆放一排算术运算器
第九步, 设置算术运算器,
按照从左到右的顺序依次设置为右移>> 1,2,3,4,5和上面的左移方向相反, 数字相等即可.
第十步, 再摆放一排算术运算器
全部设置为AND 1
第十一步, 摆放一排路灯.
第十二步, 将右移运算器, AND运算器和路灯按照竖直方向连接起来, 注意一定是上一元件的输出到下一元件的输入, 不要接错了.
另外还需要将电线杆上的Z信号拿下来, 将右移运算器的输入连接起来,接到电线杆上.
第十三步, 将路灯的点亮条件设置为Z等于1
至此一个简单的单一信号复用的控制网络就建好了, 你可以修改以下判断运算器的条件, 或者控制储物箱中的数量. 你会发现对应的路灯也会随之变化.
开始构建自己的超大型控制网络吧(开始游戏编程之旅[滑稽]).
2019年04月02日 05点04分 1
level 8
萌新瑟瑟发抖
2019年04月02日 08点04分 2
level 14
挺详细的教学,让我明白了位移和and运算的作用。多谢楼主。
但是每种产物都能发出自己的信号不一定要转成单一信号吧。
2019年04月02日 09点04分 3
提供一个思路, 主要是信号复用的教学, 万一啥时候有需求的时候, 就能用上了
2019年04月03日 02点04分
@小酱油丶打灰机 有了,昨天晚上我就用了你的教的运算和另一个大佬讨论。做了复用设计。在把每个信号延迟1秒的帖子里讨论呢,有兴趣一起聊么
2019年04月03日 02点04分
@断羽DE天使 我写程序写够了, 不想弄信号网络了, 我上一个喇叭手动管理了
2019年04月08日 07点04分
@小酱油丶打灰机 那个。。。我已经弄好了
2019年04月08日 07点04分
level 12
异星只有50个信号怎么说,异星每个产品不是都有一个信号,还有字母和数字
2019年04月02日 22点04分 4
最开始是想做一个延迟变化, 在阈值范围内保持上一个状态, 保持整个系统中有一定的存量,但是又不至于由于存量处于阈值附近,频繁触发电闸的状态变化,这样用产品本身的信号是不行的.
2019年04月08日 07点04分
@小酱油丶打灰机 不同的独立信号网络可以重名不会混乱,你一个信号网络中能把那么多全用完不太现实吧
2019年05月30日 04点05分
@小酱油丶打灰机 那你需要一个锁存器
2023年08月08日 14点08分
level 12
感谢大神
2019年04月03日 11点04分 5
level 3
这年头,没点知识水平连游戏都么得玩了[怒]
2019年04月06日 07点04分 6
level 7
萌新射射发抖!***玩了两百小时了还在粗狂的大量使用传送带和饱和生产!以后教育孩子给他玩这游戏。。就知道多读书了,本科的老爹肝不动了。。得特么研究生才行。。
2019年04月06日 21点04分 7
level 3
借楼提一嘴,关于信号的分时复用,一个简单的模型就是建一个中心只发送时间同步信号,比如一个递增的x信号,其他的比如火车站可以当X=3的时候输出要传送的信号,这样可以避免多个信号源同名信号直接叠加的问题,同理如果考虑子网隔离可以弄个基本的路由系统,这样底层的链路层和网络层都有了就可以考虑复杂一点的控制了。
2019年04月11日 10点04分 8
这游戏信号每经过一个运算器都会产生1tick的延迟,会对分时复用产生很大的麻烦。
2019年05月08日 16点05分
分时右高级了一些, 我这个难道不是频分复用吗?
2019年04月13日 03点04分
@小酱油丶打灰机 更接近码分复用吧,这个游戏信号直接叠加比较烦,要是有什么技巧可以利用上这个特性就好了。
2019年04月15日 07点04分
也是, 用时钟总线布线确实方便一些, 不过 这样一来不得写文档了吗[笑眼]
2019年04月15日 13点04分
level 13
为什么不*10 *100呢?异星的信号好像是十进制的
2019年04月13日 04点04分 9
二进制的复用密度高一些, 能利用上每一个bit位, 用10进制利用率只有10%, 但是根本原理是一样的. 我直接想到位运算可能是代码打多了吧
2019年04月13日 05点04分
@小酱油丶打灰机 位移对于不熟悉二进制的人来说不太容易计算[吐舌]
2019年04月13日 10点04分
4字节有符号整数了解一下。
2019年05月19日 18点05分
十进制太low了,大神都是讨论2进制的,
2023年08月08日 14点08分
level 3
从缺氧 到 异星,还有今天看的 幸福工厂, 现在的游戏 都这么硬核吗? 好烧脑!
2019年04月20日 15点04分 10
缺氧也算硬核?差远了,缺氧是买BUG送游戏
2023年08月08日 14点08分
level 4
感谢大佬
2019年04月22日 06点04分 11
level 1
大神,能不能帮帮我,我不知道把哪个地方改错了。把我火车自动行驶的自动和手动哪个选项 给改没了。求求了。帮帮我吧
2019年04月22日 07点04分 12
level 3
这是游戏贴吧?!!!!
2019年05月04日 16点05分 13
level 7
楼主我有个疑惑:可不可以把右移运算器给去掉,然后and运算器改成从左到右and运算1,2,4,8,16呢?如果是十进制的话就and运算1,10,100,1000,10000。
2019年05月29日 23点05分 14
不能
2019年06月05日 16点06分
如果去掉右移,你and完就毛都没了[吐舌]
2023年08月09日 15点08分
level 2
弱弱的问一下,这个有什么用[委屈]
2019年06月28日 17点06分 15
1 2 尾页