Add caching of resourcepack data, to prevent excessive disk I/O

This commit is contained in:
tterrag1098
2017-05-30 01:01:08 -04:00
parent 558f3c0091
commit 82639855db
2 changed files with 107 additions and 73 deletions

View File

@@ -1,70 +1,86 @@
package com.tterrag.blur.util;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
import java.util.Set;
import net.minecraft.client.resources.IResourcePack;
import net.minecraft.client.resources.data.IMetadataSection;
import net.minecraft.client.resources.data.MetadataSerializer;
import net.minecraft.util.ResourceLocation;
import com.google.common.collect.ImmutableSet;
import com.tterrag.blur.Blur;
public class ShaderResourcePack implements IResourcePack {
protected boolean validPath(ResourceLocation location) {
return location.getResourceDomain().equals("minecraft") && location.getResourcePath().startsWith("shaders/");
}
@Override
public InputStream getInputStream(ResourceLocation location) throws IOException {
if (validPath(location)) {
InputStream in = Blur.class.getResourceAsStream("/" + location.getResourcePath());
StringBuilder data = new StringBuilder();
Scanner scan = new Scanner(in);
try {
while (scan.hasNextLine()) {
data.append(scan.nextLine().replaceAll("@radius@", Integer.toString(Blur.instance.radius))).append('\n');
}
} finally {
scan.close();
}
return new ByteArrayInputStream(data.toString().getBytes());
}
return null;
}
@Override
public boolean resourceExists(ResourceLocation location) {
return validPath(location) && Blur.class.getResource("/" + location.getResourcePath()) != null;
}
@Override
public Set<String> getResourceDomains() {
return ImmutableSet.of("minecraft");
}
@Override
public <T extends IMetadataSection> T getPackMetadata(
MetadataSerializer metadataSerializer, String metadataSectionName)
throws IOException {
return null;
}
@Override
public BufferedImage getPackImage() throws IOException {
return null;
}
@Override
public String getPackName() {
return "Blur dummy resource pack";
}
}
package com.tterrag.blur.util;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import com.google.common.collect.ImmutableSet;
import com.tterrag.blur.Blur;
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.client.resources.IResourceManagerReloadListener;
import net.minecraft.client.resources.IResourcePack;
import net.minecraft.client.resources.data.IMetadataSection;
import net.minecraft.client.resources.data.MetadataSerializer;
import net.minecraft.client.resources.data.PackMetadataSection;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.text.TextComponentString;
public class ShaderResourcePack implements IResourcePack, IResourceManagerReloadListener {
protected boolean validPath(ResourceLocation location) {
return location.getResourceDomain().equals("minecraft") && location.getResourcePath().startsWith("shaders/");
}
private final Map<ResourceLocation, String> loadedData = new HashMap<>();
@Override
public InputStream getInputStream(ResourceLocation location) throws IOException {
if (validPath(location)) {
String s = loadedData.computeIfAbsent(location, loc -> {
InputStream in = Blur.class.getResourceAsStream("/" + location.getResourcePath());
StringBuilder data = new StringBuilder();
Scanner scan = new Scanner(in);
try {
while (scan.hasNextLine()) {
data.append(scan.nextLine().replaceAll("@radius@", Integer.toString(Blur.instance.radius))).append('\n');
}
} finally {
scan.close();
}
return data.toString();
});
return new ByteArrayInputStream(s.getBytes());
}
throw new FileNotFoundException(location.toString());
}
@Override
public boolean resourceExists(ResourceLocation location) {
return validPath(location) && Blur.class.getResource("/" + location.getResourcePath()) != null;
}
@Override
public Set<String> getResourceDomains() {
return ImmutableSet.of("minecraft");
}
@SuppressWarnings("unchecked")
@Override
public <T extends IMetadataSection> T getPackMetadata(MetadataSerializer metadataSerializer, String metadataSectionName) throws IOException {
return (T) new PackMetadataSection(new TextComponentString("Blur's default shaders"), 3);
}
@Override
public BufferedImage getPackImage() throws IOException {
throw new FileNotFoundException("pack.png");
}
@Override
public String getPackName() {
return "Blur dummy resource pack";
}
@Override
public void onResourceManagerReload(IResourceManager resourceManager) {
loadedData.clear();
}
}