异星工厂信号总线仲裁算法
背景
游戏里同种类的多个信号在同根信号线上输出会出现同种类信号相加
若通信系统中出现这种相加状态(后称为叠加状态)则无法分辨信号源与实际的信息
目标及特征
如何拆分叠加的信号保持信息干净?(信息指各个子节点独立的输出)
注意几个信号特征
信号出现叠加状态(游戏特性)
不同信号源可能会出现完全相同的信息(信息相同)
方法
针对以上两种特征就可以引入两个变量进行总线信息竞争
计数值,若信号线上计数值不为1则当前为叠加状态(识别叠加特性)
独立ID,若信息完全相同则信息需要根据优先级进行输出(区分信息)
算法及流程
二分法查找最大值,下面算法及流程
信息总和除以平均值
低于平均值删除,回到1(反复比较平均值,反复比较,反复比较,重要的事说三遍!!!)
剩余最大值
游戏内通过运算器的实现过程
说明:A小于平均值则A非最大值,信息可以为资源量,优先级等等
由于游戏中没有浮点运算,精度丢失会造成相邻数值无法区分,改用乘法得到

以下内容为游戏内详细的实现的运算流程,可以参考,也可以不看
可通过结尾验证蓝图观察流程,下面公式也只是简化描述流程!!!可以不看!!!
但是在自行设计运算时要注意游戏内运算器信号TICK会导致外部信息跟内部信息比较的延时,会出现反复竞争(踩过的坑)简单的测试方法:通过添加子节点或开关子节点进行测试

游戏内运行流程简述
由于总线的计数值也为叠加状态
本地输出的信息值乘以总线计数值小于总线信息值则关闭本地输出否则保持输出
本地输出的优先级乘以总线计数值小于总线优先级则关闭本地输出否则继续输出
流程描述简化公式(可不看)
举例A
举例B
实际演示效果截图(实际可以通过结尾的蓝图进行观察)



可以看到信号不再因为总线关系而叠加
验证蓝图