“机械动力机器数值分析”的版本间的差异

来自TeamMoeg官方WIKI
跳到导航 跳到搜索
[未复核版本][未复核版本]
第1行: 第1行:
冬季救援整合包里面的应力相对来说获取困难。为了极致地利用应力以及做好机器匹配,我查阅了相关代码并对其进行了分析。由于本人代码水平也不是很好,也没有编写java的经验,难免有解读错误的地方,望大佬继续补充。
冬季救援整合包里面的应力相对来说获取困难。为了极致地利用应力以及做好机器匹配,我查阅了相关代码并对其进行了分析。由于本人代码水平也不是很好,也没有编写java的经验,难免有解读错误的地方,望大佬继续补充。
== 开始 ==
=== 基础 ===
1秒是20gametick(20t)


=== 粉碎轮 ===
=== 粉碎轮 ===
第57行: 第62行:
==== 分析 ====
==== 分析 ====
public static final int CYCLE = 240;
public static final int CYCLE = 240;
prevRunningTicks = runningTicks;


runningTicks += (int) Mth.lerp(Mth.clamp(Math.abs(speed) / 512f, 0, 1), 1, 60);
runningTicks += (int) Mth.lerp(Mth.clamp(Math.abs(speed) / 512f, 0, 1), 1, 60);


runningTicks > CYCLE
if (prevRunningTicks < CYCLE / 2 && runningTicks >= CYCLE / 2)
 
runningTicks = CYCLE / 2;
 
if(runningTicks > CYCLE)
 
完成()


这里的speed就直接是转速了
这里的speed就直接是转速了
第66行: 第79行:
lerp函数作用是将0-1小数等比放大到一定范围内
lerp函数作用是将0-1小数等比放大到一定范围内


但是这都不重要,重要的是这玩意是基本线性的,容易列出单个物品处理时间近似为t=240/(60*speed/512)/20=102.4/speed (S)
由于cycle很小,mc又按t计算,因此处理速度是阶跃的


每秒可产物品数量speed/102.4
观察易得其为两个120的阶跃进度,因此处理速度需要为120的因数才最好,用excel可轻松求出阶跃转速


==== 人话 ====
==== 人话 ====
辊压机转速除102.4就是每秒可产的物品数量
下表转速为最佳转速,自行选取即可
{| class="wikitable"
|转速
|增速
|需时(tick)
|筛选
|产量(每秒)
|-
|1
|1
|120
|120
|0.166666667
|-
|9
|2
|60
| -60
|0.333333333
|-
|18
|3
|40
| -20
|0.5
|-
|27
|4
|30
| -10
|0.666666667
|-
|35
|5
|24
| -6
|0.833333333
|-
|44
|6
|20
| -4
|1
|-
|53
|7
|18
| -2
|1.111111111
|-
|61
|8
|15
| -3
|1.333333333
|-
|70
|9
|14
| -1
|1.428571429
|-
|79
|10
|12
| -2
|1.666666667
|-
|87
|11
|11
| -1
|1.818181818
|-
|96
|12
|10
| -1
|2
|-
|113
|14
|9
| -1
|2.222222222
|-
|122
|15
|8
| -1
|2.5
|-
|148
|18
|7
| -1
|2.857142857
|-
|165
|20
|6
| -1
|3.333333333
|-
|200
|24
|5
| -1
|4
|-
|252
|30
|4
| -1
|5
|}

2023年1月28日 (六) 22:28的版本

冬季救援整合包里面的应力相对来说获取困难。为了极致地利用应力以及做好机器匹配,我查阅了相关代码并对其进行了分析。由于本人代码水平也不是很好,也没有编写java的经验,难免有解读错误的地方,望大佬继续补充。

开始

基础

1秒是20gametick(20t)

粉碎轮

分析

粉碎轮速度相关的代码为

inventory.remainingTime = recipe.isPresent() ? recipe.get().getProcessingDuration() : 100;

crushingspeed = compound.getFloat("Speed");

float speed = crushingspeed * 4;

float processingSpeed =Mth.clamp((speed) / (!inventory.appliedRecipe ? Mth.log2(inventory.getStackInSlot(0).getCount()) : 1), .25f, 20);

inventory.remainingTime -= processingSpeed;

其中crushingspeed就是我们给的转速/12.5,这个速度取速度慢的轮,所以我们统一按两轮等速讨论

每次处理所需要的总进度如果配方有写就按配方,没有就是100(一般都是100)

首先看条件,假如已经吸入了物品(即不是掉落物形态),除数为log2(物品数量),否则按1

但实际上这个没啥用,因为我们都采用溜槽等方式直接跳过了吸入过程,去除了吸入所需时间,因此我们直接按着已吸入计算即可

clamp的作用是限定范围,高于最大值就等于最大值,小于最小值就等于最小值,这里的上下限是0.25和20

为了方便讨论,我们提出一个问题,假设我要总共处理a个物品,可用应力为定值b,单个机器单次处理y个,转速x,求处理总用时t

已知单个机器(两个粉碎轮)rpm为16,由此可以得可用机器数量k=b/16x

我们先假设clamp函数不起作用,不难列出如下公式

PS:其实是y>e才单调减,但我懒

其中a,b,T=100为问题一开始就确立的定值,可操作变量为x,y

易得处理总时在一定的总应力下与转速无关,单个机器单次处理量越大处理总需时越小

在这个结论的基础上我们再讨论clamp函数的影响

易知单个机器处理初始速度为

Gs01.png

另v分别等于0.25与20,我们可以得出,上方公式的适用范围

01FF.png

高于红线则转速无效,低于蓝线则有增益

人话

在确定总应力下,处理耗时只与单次处理量有关

直接用智能溜槽喂64是最佳选择

粉碎轮转速调成1即可

单位时间产量与转速成正比,1速64堆叠下粉碎轮每秒可处理3.2个物品

辊压机

分析

public static final int CYCLE = 240;

prevRunningTicks = runningTicks;

runningTicks += (int) Mth.lerp(Mth.clamp(Math.abs(speed) / 512f, 0, 1), 1, 60);

if (prevRunningTicks < CYCLE / 2 && runningTicks >= CYCLE / 2)

runningTicks = CYCLE / 2;

if(runningTicks > CYCLE)

完成()

这里的speed就直接是转速了

lerp函数作用是将0-1小数等比放大到一定范围内

由于cycle很小,mc又按t计算,因此处理速度是阶跃的

观察易得其为两个120的阶跃进度,因此处理速度需要为120的因数才最好,用excel可轻松求出阶跃转速

人话

下表转速为最佳转速,自行选取即可

转速 增速 需时(tick) 筛选 产量(每秒)
1 1 120 120 0.166666667
9 2 60 -60 0.333333333
18 3 40 -20 0.5
27 4 30 -10 0.666666667
35 5 24 -6 0.833333333
44 6 20 -4 1
53 7 18 -2 1.111111111
61 8 15 -3 1.333333333
70 9 14 -1 1.428571429
79 10 12 -2 1.666666667
87 11 11 -1 1.818181818
96 12 10 -1 2
113 14 9 -1 2.222222222
122 15 8 -1 2.5
148 18 7 -1 2.857142857
165 20 6 -1 3.333333333
200 24 5 -1 4
252 30 4 -1 5