Cache Torus.generate result for Origin (#2845)
* Cache Torus.generate result for Origin Fusion Coils are laggy, not by ticking block entities, just purely by torus.generate(BlockPos.origin, size) * Assign TorusListCache * use cached result
This commit is contained in:
parent
40f4785816
commit
7f415d3ec9
2 changed files with 12 additions and 4 deletions
|
@ -24,8 +24,10 @@
|
||||||
|
|
||||||
package reborncore.common.util;
|
package reborncore.common.util;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
import it.unimi.dsi.fastutil.ints.Int2IntMap;
|
import it.unimi.dsi.fastutil.ints.Int2IntMap;
|
||||||
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
|
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
|
||||||
|
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -37,7 +39,7 @@ import java.util.concurrent.TimeUnit;
|
||||||
public class Torus {
|
public class Torus {
|
||||||
private static final ExecutorService GEN_EXECUTOR = Executors.newSingleThreadExecutor();
|
private static final ExecutorService GEN_EXECUTOR = Executors.newSingleThreadExecutor();
|
||||||
private static Int2IntMap torusSizeCache;
|
private static Int2IntMap torusSizeCache;
|
||||||
|
private static Int2ObjectOpenHashMap<ImmutableList<BlockPos>> torusListCache;
|
||||||
public static List<BlockPos> generate(BlockPos origin, int radius) {
|
public static List<BlockPos> generate(BlockPos origin, int radius) {
|
||||||
List<BlockPos> posLists = new ArrayList<>();
|
List<BlockPos> posLists = new ArrayList<>();
|
||||||
for (int x = -radius; x < radius; x++) {
|
for (int x = -radius; x < radius; x++) {
|
||||||
|
@ -49,9 +51,12 @@ public class Torus {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return posLists;
|
return posLists;
|
||||||
}
|
}
|
||||||
|
public static List<BlockPos> getOriginPositions(int radius){
|
||||||
|
return torusListCache.get(radius);
|
||||||
|
}
|
||||||
public static void genSizeMap(int maxRadius) {
|
public static void genSizeMap(int maxRadius) {
|
||||||
if (torusSizeCache != null) {
|
if (torusSizeCache != null) {
|
||||||
// Let's not do this again
|
// Let's not do this again
|
||||||
|
@ -61,21 +66,24 @@ public class Torus {
|
||||||
final int sizeToCompute = maxRadius + 10;
|
final int sizeToCompute = maxRadius + 10;
|
||||||
|
|
||||||
torusSizeCache = new Int2IntOpenHashMap(sizeToCompute);
|
torusSizeCache = new Int2IntOpenHashMap(sizeToCompute);
|
||||||
|
torusListCache = new Int2ObjectOpenHashMap<>(sizeToCompute);
|
||||||
for (int i = 0; i < sizeToCompute; i++) {
|
for (int i = 0; i < sizeToCompute; i++) {
|
||||||
final int radius = i;
|
final int radius = i;
|
||||||
GEN_EXECUTOR.submit(() -> {
|
GEN_EXECUTOR.submit(() -> {
|
||||||
int size = 0;
|
int size = 0;
|
||||||
|
ArrayList<BlockPos> list = new ArrayList<>();
|
||||||
for (int x = -radius; x < radius; x++) {
|
for (int x = -radius; x < radius; x++) {
|
||||||
for (int y = -radius; y < radius; y++) {
|
for (int y = -radius; y < radius; y++) {
|
||||||
for (int z = -radius; z < radius; z++) {
|
for (int z = -radius; z < radius; z++) {
|
||||||
if (Math.pow(radius / 2 - Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)), 2) + Math.pow(z, 2) < Math.pow(radius * 0.05, 2)) {
|
if (Math.pow(radius / 2 - Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)), 2) + Math.pow(z, 2) < Math.pow(radius * 0.05, 2)) {
|
||||||
size++;
|
size++;
|
||||||
|
list.add(new BlockPos(x,z,y));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
torusSizeCache.put(radius, size);
|
torusSizeCache.put(radius, size);
|
||||||
|
torusListCache.put(radius, ImmutableList.copyOf(list));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -391,7 +391,7 @@ public class FusionControlComputerBlockEntity extends GenericMachineBlockEntity
|
||||||
@Override
|
@Override
|
||||||
public void writeMultiblock(MultiblockWriter writer) {
|
public void writeMultiblock(MultiblockWriter writer) {
|
||||||
BlockState coil = TRContent.Machine.FUSION_COIL.block.getDefaultState();
|
BlockState coil = TRContent.Machine.FUSION_COIL.block.getDefaultState();
|
||||||
Torus.generate(BlockPos.ORIGIN, size).forEach(pos -> writer.add(pos.getX(), pos.getY(), pos.getZ(), coil));
|
Torus.getOriginPositions(size).forEach(pos -> writer.add(pos.getX(), pos.getY(), pos.getZ(), coil));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Reference in a new issue