Skip to content

Commit 63a003b

Browse files
committed
Switch to arrays to improve object-allocation
1 parent c6019c7 commit 63a003b

File tree

7 files changed

+44
-34
lines changed

7 files changed

+44
-34
lines changed

BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/BlockStateModelFactory.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,15 @@
3535
import de.bluecolored.bluemap.core.world.BlockState;
3636

3737
import java.util.ArrayList;
38-
import java.util.Collection;
38+
import java.util.List;
3939

4040
public class BlockStateModelFactory {
4141

4242
private final ResourcePack resourcePack;
4343
private final ResourceModelBuilder resourceModelBuilder;
4444
private final LiquidModelBuilder liquidModelBuilder;
4545

46-
private final Collection<Variant> variants = new ArrayList<>();
46+
private final List<Variant> variants = new ArrayList<>();
4747

4848
public BlockStateModelFactory(ResourcePack resourcePack, TextureGallery textureGallery, RenderSettings renderSettings) {
4949
this.resourcePack = resourcePack;
@@ -88,7 +88,11 @@ private void renderModel(BlockNeighborhood<?> block, BlockState blockState, Bloc
8888
float blockColorOpacity = 0;
8989
variants.clear();
9090
stateResource.forEach(blockState, block.getX(), block.getY(), block.getZ(), variants::add);
91-
for (Variant variant : variants) {
91+
92+
//noinspection ForLoopReplaceableByForEach
93+
for (int i = 0; i < variants.size(); i++) {
94+
Variant variant = variants.get(i);
95+
9296
BlockModel modelResource = variant.getModel().getResource(resourcePack::getBlockModel);
9397
if (modelResource == null) continue;
9498

BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/ResourceModelBuilder.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@
4949
import de.bluecolored.bluemap.core.world.ExtendedBlock;
5050
import de.bluecolored.bluemap.core.world.LightData;
5151

52-
import java.util.List;
53-
5452
/**
5553
* This model builder creates a BlockStateModel using the information from parsed resource-pack json files.
5654
*/
@@ -100,7 +98,7 @@ public void build(BlockNeighborhood<?> block, Variant variant, BlockModelView bl
10098
// render model
10199
int modelStart = blockModel.getStart();
102100

103-
List<Element> elements = modelResource.getElements();
101+
Element[] elements = modelResource.getElements();
104102
if (elements != null) {
105103
for (Element element : elements) {
106104
buildModelElementResource(element, blockModel.initialize());

BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/resourcepack/ResourcePack.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -199,9 +199,11 @@ private void loadResourcePath(Path root, PathLoader resourceLoader) throws IOExc
199199
if (Files.isRegularFile(fabricModJson)) {
200200
try (BufferedReader reader = Files.newBufferedReader(fabricModJson)) {
201201
JsonObject rootElement = ResourcesGson.INSTANCE.fromJson(reader, JsonObject.class);
202-
for (JsonElement element : rootElement.getAsJsonArray("jars")) {
203-
Path file = root.resolve(element.getAsJsonObject().get("file").getAsString());
204-
if (Files.exists(file)) loadResourcePath(file, resourceLoader);
202+
if (rootElement.has("jars")) {
203+
for (JsonElement element : rootElement.getAsJsonArray("jars")) {
204+
Path file = root.resolve(element.getAsJsonObject().get("file").getAsString());
205+
if (Files.exists(file)) loadResourcePath(file, resourceLoader);
206+
}
205207
}
206208
} catch (Exception ex) {
207209
Logger.global.logDebug("Failed to read fabric.mod.json: " + ex);

BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/resourcepack/blockmodel/BlockModel.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class BlockModel {
1515

1616
private ResourcePath<BlockModel> parent;
1717
private Map<String, TextureVariable> textures = new HashMap<>();
18-
private List<Element> elements;
18+
private Element[] elements;
1919
private boolean ambientocclusion = true;
2020

2121
private transient boolean liquid = false;
@@ -34,7 +34,7 @@ public Map<String, TextureVariable> getTextures() {
3434
}
3535

3636
@Nullable
37-
public List<Element> getElements() {
37+
public Element[] getElements() {
3838
return elements;
3939
}
4040

@@ -84,8 +84,10 @@ public synchronized void applyParent(ResourcePack resourcePack) {
8484

8585
parent.textures.forEach(this::applyTextureVariable);
8686
if (this.elements == null && parent.elements != null) {
87-
this.elements = new ArrayList<>();
88-
parent.elements.forEach(element -> this.elements.add(element.copy()));
87+
this.elements = new Element[parent.elements.length];
88+
for (int i = 0; i < this.elements.length; i++){
89+
this.elements[i] = parent.elements[i].copy();
90+
}
8991
}
9092
}
9193
}

BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/resourcepack/blockstate/Multipart.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@
1919
@JsonAdapter(Multipart.Adapter.class)
2020
public class Multipart {
2121

22-
private List<VariantSet> parts = new ArrayList<>();
22+
private VariantSet[] parts = new VariantSet[0];
2323

2424
private Multipart(){}
2525

26-
public List<VariantSet> getParts() {
26+
public VariantSet[] getParts() {
2727
return parts;
2828
}
2929

@@ -43,7 +43,7 @@ public Adapter() {
4343

4444
@Override
4545
public Multipart read(JsonReader in, Gson gson) throws IOException {
46-
Multipart result = new Multipart();
46+
List<VariantSet> parts = new ArrayList<>();
4747

4848
in.beginArray();
4949
while (in.hasNext()) {
@@ -63,10 +63,12 @@ public Multipart read(JsonReader in, Gson gson) throws IOException {
6363

6464
if (variantSet == null) continue;
6565
if (condition != null) variantSet.setCondition(condition);
66-
result.parts.add(variantSet);
66+
parts.add(variantSet);
6767
}
6868
in.endArray();
6969

70+
Multipart result = new Multipart();
71+
result.parts = parts.toArray(VariantSet[]::new);
7072
return result;
7173
}
7274

BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/resourcepack/blockstate/VariantSet.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,13 @@
22

33
import com.google.gson.Gson;
44
import com.google.gson.annotations.JsonAdapter;
5-
import com.google.gson.reflect.TypeToken;
65
import com.google.gson.stream.JsonReader;
76
import com.google.gson.stream.JsonToken;
87
import de.bluecolored.bluemap.api.debug.DebugDump;
98
import de.bluecolored.bluemap.core.resources.AbstractTypeAdapterFactory;
109

1110
import java.io.IOException;
12-
import java.util.Collections;
13-
import java.util.List;
11+
import java.util.Arrays;
1412
import java.util.function.Consumer;
1513

1614
@SuppressWarnings("FieldMayBeFinal")
@@ -19,15 +17,15 @@
1917
public class VariantSet {
2018

2119
private BlockStateCondition condition;
22-
private List<Variant> variants;
20+
private Variant[] variants;
2321

2422
private transient double totalWeight;
2523

26-
public VariantSet(List<Variant> variants) {
24+
public VariantSet(Variant... variants) {
2725
this(BlockStateCondition.all(), variants);
2826
}
2927

30-
public VariantSet(BlockStateCondition condition, List<Variant> variants) {
28+
public VariantSet(BlockStateCondition condition, Variant... variants) {
3129
this.condition = condition;
3230
this.variants = variants;
3331

@@ -42,12 +40,12 @@ public void setCondition(BlockStateCondition condition) {
4240
this.condition = condition;
4341
}
4442

45-
public List<Variant> getVariants() {
43+
public Variant[] getVariants() {
4644
return variants;
4745
}
4846

4947
private double summarizeWeights() {
50-
return variants.stream()
48+
return Arrays.stream(variants)
5149
.mapToDouble(Variant::getWeight)
5250
.sum();
5351
}
@@ -64,7 +62,7 @@ public void forEach(int x, int y, int z, Consumer<Variant> consumer) {
6462
}
6563

6664
private static float hashToFloat(int x, int y, int z) {
67-
final long hash = x * 73438747 ^ y * 9357269 ^ z * 4335792;
65+
final long hash = x * 73438747L ^ y * 9357269L ^ z * 4335792L;
6866
return (hash * (hash + 456149) & 0x00ffffff) / (float) 0x01000000;
6967
}
7068

@@ -76,11 +74,11 @@ public Adapter() {
7674

7775
@Override
7876
public VariantSet read(JsonReader in, Gson gson) throws IOException {
79-
List<Variant> variants;
77+
Variant[] variants;
8078
if (in.peek() == JsonToken.BEGIN_ARRAY) {
81-
variants = gson.fromJson(in, new TypeToken<List<Variant>>(){}.getType());
79+
variants = gson.fromJson(in, Variant[].class);
8280
} else {
83-
variants = Collections.singletonList(gson.fromJson(in, Variant.class));
81+
variants = new Variant[]{ gson.fromJson(in, Variant.class) };
8482
}
8583

8684
return new VariantSet(variants);

BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/resourcepack/blockstate/Variants.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@
2020
@JsonAdapter(Variants.Adapter.class)
2121
public class Variants {
2222

23-
private List<VariantSet> variants = new ArrayList<>();
23+
private VariantSet[] variants = new VariantSet[0];
2424
private VariantSet defaultVariant;
2525

2626
private Variants(){}
2727

28-
public List<VariantSet> getVariants() {
28+
public VariantSet[] getVariants() {
2929
return variants;
3030
}
3131

@@ -56,7 +56,8 @@ public Adapter() {
5656

5757
@Override
5858
public Variants read(JsonReader in, Gson gson) throws IOException {
59-
Variants result = new Variants();
59+
VariantSet defaultVariant = null;
60+
List<VariantSet> variants = new ArrayList<>();
6061

6162
in.beginObject();
6263
while (in.hasNext()) {
@@ -71,13 +72,16 @@ public Variants read(JsonReader in, Gson gson) throws IOException {
7172
variantSet.setCondition(condition);
7273

7374
if (variantSet.getCondition() == BlockStateCondition.all()) {
74-
result.defaultVariant = variantSet;
75+
defaultVariant = variantSet;
7576
} else if (variantSet.getCondition() != BlockStateCondition.none()) {
76-
result.variants.add(variantSet);
77+
variants.add(variantSet);
7778
}
7879
}
7980
in.endObject();
8081

82+
Variants result = new Variants();
83+
result.defaultVariant = defaultVariant;
84+
result.variants = variants.toArray(VariantSet[]::new);
8185
return result;
8286
}
8387

0 commit comments

Comments
 (0)