Skip to content

Commit ef62ac6

Browse files
author
Circulate233
committed
重构一部分EF逻辑以进行性能优化
1 parent 277fa8f commit ef62ac6

File tree

7 files changed

+288
-157
lines changed

7 files changed

+288
-157
lines changed

src/main/java/github/kasuminova/novaeng/common/tile/ecotech/efabricator/EFabricatorController.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
public class EFabricatorController extends EPartController<EFabricatorPart> {
5151

5252
public static final int MAX_COOLANT_CACHE = 100_000;
53-
public static final int WORK_DELAY = 20;
53+
public static final int WORK_DELAY = 40;
5454

5555
public static final List<BlockPos> HIDE_POS_LIST = Arrays.asList(
5656
// Center
@@ -261,8 +261,8 @@ protected void updateComponents() {
261261

262262
@Override
263263
protected void onAddPart(final EFabricatorPart part) {
264-
if (part instanceof EFabricatorMEChannel channel) {
265-
this.channel = channel;
264+
if (part instanceof EFabricatorMEChannel channelc) {
265+
this.channel = channelc;
266266
}
267267
}
268268

@@ -294,15 +294,15 @@ protected void updateParallelism() {
294294
.filter(Modifier::isDebuff)
295295
.forEach(modifier -> parallelism[0] = modifier.apply(parallelism[0]));
296296

297-
this.parallelism = (int) Math.round(parallelism[0]);
297+
this.parallelism = (int) Math.round(parallelism[0] * 2);
298298
}
299299

300300
public synchronized void convertOverflowParallelismToWorkDelay(final int overflow) {
301301
if (overflow <= 0 || speedupApplied) {
302302
return;
303303
}
304304
float ratio = (float) parallelism / overflow;
305-
int speedUp = Math.min(Math.round(ratio / 0.05f), maxWorkDelay - 1);
305+
int speedUp = Math.min(Math.round(ratio / 0.05f) * 2, maxWorkDelay - 1);
306306

307307
double coolantUsage = parallelism * 0.04;
308308
int maxCanConsume = (int) (coolantCache / coolantUsage);
@@ -315,7 +315,7 @@ public synchronized void convertOverflowParallelismToWorkDelay(final int overflo
315315

316316
public void updateWorkDelay() {
317317
if (activeCooling) {
318-
this.maxWorkDelay = WORK_DELAY - this.getWorkers().size();
318+
this.maxWorkDelay = WORK_DELAY - (this.getWorkers().size() * 2);
319319
} else {
320320
this.maxWorkDelay = WORK_DELAY;
321321
}
@@ -349,11 +349,14 @@ public boolean insertPattern(final ItemStack patternStack) {
349349

350350
public boolean offerWork(EFabricatorWorker.CraftWork work) {
351351
boolean success = false;
352-
for (EFabricatorWorker fabricatorWorker : getWorkers()) {
353-
if (!fabricatorWorker.isFull()) {
354-
fabricatorWorker.offerWork(work);
352+
for (EFabricatorWorker worker : getWorkers()) {
353+
if (!worker.isFull()) {
354+
var i = worker.getRemainingSpace();
355+
worker.offerWork(work.split(i));
355356
success = true;
356-
break;
357+
if (work.getSize() < 1) {
358+
break;
359+
}
357360
}
358361
}
359362
if (success && activeCooling && !speedupApplied) {

src/main/java/github/kasuminova/novaeng/common/tile/ecotech/efabricator/EFabricatorMEChannel.java

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import appeng.me.helpers.AENetworkProxy;
2020
import appeng.me.helpers.IGridProxyable;
2121
import appeng.me.helpers.MachineSource;
22-
import appeng.util.Platform;
22+
import com.glodblock.github.common.item.ItemFluidDrop;
2323
import com.glodblock.github.util.FluidCraftingPatternDetails;
2424
import github.kasuminova.mmce.common.util.PatternItemFilter;
2525
import github.kasuminova.novaeng.common.block.ecotech.efabricator.BlockEFabricatorMEChannel;
@@ -111,11 +111,20 @@ public boolean pushPattern(final ICraftingPatternDetails pattern, final Inventor
111111
}
112112

113113
ItemStack[] remaining = new ItemStack[9];
114+
int size = 1;
114115
for (int i = 0; i < Math.min(table.getSizeInventory(), 9); ++i) {
115-
remaining[i] = Platform.getContainerItem(table.getStackInSlot(i));
116+
var item = table.getStackInSlot(i);
117+
if (item.isEmpty()){
118+
remaining[i] = ItemStack.EMPTY;
119+
} else {
120+
remaining[i] = item;
121+
size = item.getCount();
122+
}
116123
}
117124

118-
return partController.offerWork(new EFabricatorWorker.CraftWork(remaining, output));
125+
output.setCount(output.getCount() * size);
126+
127+
return partController.offerWork(new EFabricatorWorker.CraftWork(remaining, output, size));
119128
}
120129

121130
protected boolean pushFluidPattern(FluidCraftingPatternDetails pattern) {
@@ -125,7 +134,19 @@ protected boolean pushFluidPattern(FluidCraftingPatternDetails pattern) {
125134
IAEItemStack[] outputs = pattern.getOutputs();
126135
ItemStack output = outputs[0] != null ? outputs[0].getCachedItemStack(outputs[0].getStackSize()) : ItemStack.EMPTY;
127136

128-
return partController.offerWork(new EFabricatorWorker.CraftWork(remaining, output));
137+
int size = 1;
138+
var item = pattern.getInputs();
139+
for (IAEItemStack stack : item) {
140+
if (stack != null){
141+
size = (int) stack.getStackSize();
142+
if (stack.getItem() instanceof ItemFluidDrop){
143+
size = size / 1000;
144+
}
145+
break;
146+
}
147+
}
148+
149+
return partController.offerWork(new EFabricatorWorker.CraftWork(remaining, output, size));
129150
}
130151

131152
public boolean insertPattern(final ItemStack patternStack) {
@@ -143,7 +164,7 @@ public boolean isBusy() {
143164
if (partController != null) {
144165
return partController.isQueueFull();
145166
}
146-
return false;
167+
return true;
147168
}
148169

149170
// Misc

src/main/java/github/kasuminova/novaeng/common/tile/ecotech/efabricator/EFabricatorWorker.java

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
public class EFabricatorWorker extends EFabricatorPart {
2020

2121
public static final int MAX_ENERGY_CACHE = 500_000;
22-
public static final int MAX_QUEUE_DEPTH = 32;
22+
public static final int MAX_QUEUE_DEPTH = 64;
2323

2424
public static final int ENERGY_USAGE = 100;
2525
public static final int COOLANT_USAGE = 5;
@@ -35,6 +35,10 @@ public class EFabricatorWorker extends EFabricatorPart {
3535
public EFabricatorWorker() {
3636
}
3737

38+
public int getRemainingSpace(){
39+
return this.getQueueDepth() - this.queue.size();
40+
}
41+
3842
public synchronized int doWork() {
3943
EFabricatorController controller = partController;
4044
int coolantCache = controller.getCoolantCache();
@@ -198,9 +202,10 @@ public static class CraftingQueue {
198202
private static final String REPEAT_TAG = "R";
199203

200204
private final Deque<EFabricatorWorker.CraftWork> queue = new ArrayDeque<>();
205+
private int size = 0;
201206

202207
public int size() {
203-
return queue.size();
208+
return size;
204209
}
205210

206211
public boolean isEmpty() {
@@ -209,10 +214,17 @@ public boolean isEmpty() {
209214

210215
public void add(final EFabricatorWorker.CraftWork craftWork) {
211216
queue.add(craftWork);
217+
size += craftWork.size;
212218
}
213219

214220
public EFabricatorWorker.CraftWork poll() {
215-
return queue.poll();
221+
var i = queue.poll();
222+
if (i != null) {
223+
size -= i.size;
224+
} else {
225+
size = 0;
226+
}
227+
return i;
216228
}
217229

218230
public EFabricatorWorker.CraftWork peek() {
@@ -295,13 +307,20 @@ public static class CraftWork {
295307
private static final String REMAIN_TAG_PREFIX = "R#";
296308
private static final String REMAIN_SIZE_TAG = REMAIN_TAG_PREFIX + "S";
297309
private static final String OUTPUT_TAG = "O";
310+
private static final String SIZE = "Z";
298311

299312
private final ItemStack[] remaining;
300313
private final ItemStack output;
314+
private int size;
301315

302-
public CraftWork(final ItemStack[] remaining, final ItemStack output) {
316+
public CraftWork(final ItemStack[] remaining, final ItemStack output,final int size) {
303317
this.remaining = remaining;
304318
this.output = output;
319+
this.size = size;
320+
}
321+
322+
public int getSize() {
323+
return size;
305324
}
306325

307326
public CraftWork(final NBTTagCompound nbt, final List<ItemStack> stackSet) {
@@ -311,6 +330,22 @@ public CraftWork(final NBTTagCompound nbt, final List<ItemStack> stackSet) {
311330
remaining[remainIdx] = setIdx == -1 ? ItemStack.EMPTY : stackSet.get(setIdx);
312331
}
313332
output = stackSet.get(nbt.getInteger(OUTPUT_TAG));
333+
size = Math.max(1,nbt.getInteger(SIZE));
334+
}
335+
336+
public CraftWork split(int amount){
337+
final var i = Math.min(amount,this.size);
338+
final var inputs = new ItemStack[this.remaining.length];
339+
for (int ii = 0; ii < remaining.length; ii++) {
340+
inputs[ii] = remaining[ii].splitStack(amount);
341+
}
342+
final var eachOutput = this.output.getCount() / size;
343+
final var output = this.output.copy();
344+
final var outCount = i * eachOutput;
345+
output.setCount(outCount);
346+
this.output.shrink(outCount);
347+
size -= i;
348+
return new CraftWork(inputs,output,i);
314349
}
315350

316351
public NBTTagCompound writeToNBT(final List<ItemStack> stackSet) {
@@ -346,12 +381,13 @@ public NBTTagCompound writeToNBT(final List<ItemStack> stackSet) {
346381

347382
stackSet.add(output);
348383
nbt.setShort(OUTPUT_TAG, (short) (stackSet.size() - 1));
384+
nbt.setInteger(SIZE,size);
349385
return nbt;
350386
}
351387

352388
public CraftWork copy() {
353389
ItemStack[] remaining = Arrays.stream(this.remaining).map(ItemStack::copy).toArray(ItemStack[]::new);
354-
return new CraftWork(remaining, output.copy());
390+
return new CraftWork(remaining, output.copy(),this.size);
355391
}
356392

357393
@Override
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package github.kasuminova.novaeng.common.util;
2+
3+
public enum MediumType{
4+
EF,
5+
MEPatternProvider,
6+
NULL
7+
}

0 commit comments

Comments
 (0)