Make ModelLocationCache more low-memory friendly
This commit is contained in:
parent
775bc5f027
commit
1796d80d40
|
|
@ -1,5 +1,8 @@
|
||||||
package org.embeddedt.modernfix.dynamicresources;
|
package org.embeddedt.modernfix.dynamicresources;
|
||||||
|
|
||||||
|
import com.google.common.cache.CacheBuilder;
|
||||||
|
import com.google.common.cache.CacheLoader;
|
||||||
|
import com.google.common.cache.LoadingCache;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.mojang.datafixers.util.Pair;
|
import com.mojang.datafixers.util.Pair;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
||||||
|
|
@ -14,28 +17,23 @@ import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.ExecutionException;
|
||||||
|
|
||||||
public class ModelLocationCache {
|
public class ModelLocationCache {
|
||||||
private static Map<BlockState, ModelResourceLocation> locationCache = Collections.emptyMap();
|
private static final LoadingCache<BlockState, ModelResourceLocation> locationCache = CacheBuilder.newBuilder()
|
||||||
public static void rebuildLocationCache() {
|
.maximumSize(10000)
|
||||||
ArrayList<CompletableFuture<Pair<BlockState, ModelResourceLocation>>> futures = new ArrayList<>();
|
.build(new CacheLoader<BlockState, ModelResourceLocation>() {
|
||||||
for(Block block : Registry.BLOCK) {
|
@Override
|
||||||
block.getStateDefinition().getPossibleStates().forEach((state) -> {
|
public ModelResourceLocation load(BlockState key) throws Exception {
|
||||||
futures.add(CompletableFuture.supplyAsync(() -> {
|
return BlockModelShaper.stateToModelLocation(key);
|
||||||
return Pair.of(state, BlockModelShaper.stateToModelLocation(state));
|
}
|
||||||
}, Util.backgroundExecutor()));
|
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
ImmutableMap.Builder<BlockState, ModelResourceLocation> builder = ImmutableMap.builder();
|
|
||||||
for(CompletableFuture<Pair<BlockState, ModelResourceLocation>> future : futures) {
|
|
||||||
Pair<BlockState, ModelResourceLocation> pair = future.join();
|
|
||||||
builder.put(pair.getFirst(), pair.getSecond());
|
|
||||||
}
|
|
||||||
locationCache = builder.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ModelResourceLocation get(BlockState state) {
|
public static ModelResourceLocation get(BlockState state) {
|
||||||
return locationCache.get(state);
|
try {
|
||||||
|
return locationCache.get(state);
|
||||||
|
} catch(ExecutionException e) {
|
||||||
|
throw new RuntimeException(e.getCause());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -128,8 +128,6 @@ public abstract class ModelBakeryMixin {
|
||||||
|
|
||||||
private UnbakedModel missingModel;
|
private UnbakedModel missingModel;
|
||||||
|
|
||||||
private static boolean firstReload = true;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author embeddedt
|
* @author embeddedt
|
||||||
* @reason don't load any models initially, just set up initial data structures
|
* @reason don't load any models initially, just set up initial data structures
|
||||||
|
|
@ -137,10 +135,6 @@ public abstract class ModelBakeryMixin {
|
||||||
@Overwrite
|
@Overwrite
|
||||||
protected void processLoading(ProfilerFiller arg, int maxMipLevels) {
|
protected void processLoading(ProfilerFiller arg, int maxMipLevels) {
|
||||||
ModelLoaderRegistry.onModelLoadingStart();
|
ModelLoaderRegistry.onModelLoadingStart();
|
||||||
if(firstReload) {
|
|
||||||
ModelLocationCache.rebuildLocationCache();
|
|
||||||
firstReload = false;
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
this.missingModel = this.loadBlockModel(MISSING_MODEL_LOCATION);
|
this.missingModel = this.loadBlockModel(MISSING_MODEL_LOCATION);
|
||||||
} catch (IOException var10) {
|
} catch (IOException var10) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user