diff --git a/configuration.txt b/configuration.txt index 311a33ca..579bd851 100755 --- a/configuration.txt +++ b/configuration.txt @@ -16,8 +16,8 @@ webserver-bindaddress: 0.0.0.0 webserver-port: 8123 disabledcommands: - - fullrender - - fullrenderasync +# - fullrender +# - fullrenderasync # The maptypes Dynmap will use to render. maps: diff --git a/src/main/java/org/dynmap/MapManager.java b/src/main/java/org/dynmap/MapManager.java index b7a13254..edab80cb 100644 --- a/src/main/java/org/dynmap/MapManager.java +++ b/src/main/java/org/dynmap/MapManager.java @@ -79,63 +79,63 @@ public class MapManager extends Thread { } void renderFullWorld(Location l) { - synchronized (lock) { - debugger.debug("Full render starting..."); - for (MapType map : maps) { - HashSet found = new HashSet(); - HashSet rendered = new HashSet(); - LinkedList renderQueue = new LinkedList(); - LinkedList loadedChunks = new LinkedList(); - - for (MapTile tile : map.getTiles(l)) { - if (!found.contains(tile)) { - found.add(tile); - renderQueue.add(tile); - } + debugger.debug("Full render starting..."); + for (MapType map : maps) { + int requiredChunkCount = 200; + HashSet found = new HashSet(); + HashSet rendered = new HashSet(); + LinkedList renderQueue = new LinkedList(); + LinkedList loadedChunks = new LinkedList(); + + for (MapTile tile : map.getTiles(l)) { + if (!found.contains(tile)) { + found.add(tile); + renderQueue.add(tile); } - while (!renderQueue.isEmpty()) { - MapTile tile = renderQueue.pollFirst(); - - DynmapChunk[] requiredChunks = tile.getMap().getRequiredChunks(tile); - - // Unload old chunks. - while (loadedChunks.size() >= Math.max(0, 200 - requiredChunks.length)) { - DynmapChunk c = loadedChunks.pollFirst(); - world.unloadChunk(c.x, c.y, false, true); - } - - // Load the required chunks. - for (DynmapChunk chunk : requiredChunks) { - boolean wasLoaded = world.isChunkLoaded(chunk.x, chunk.y); - world.loadChunk(chunk.x, chunk.y, false); - if (!wasLoaded) - loadedChunks.add(chunk); - } - - debugger.debug("renderQueue: " + renderQueue.size() + "/" + found.size()); - if (map.render(tile)) { - found.remove(tile); - rendered.add(tile); - updateQueue.pushUpdate(new Client.Tile(tile.getName())); - for (MapTile adjTile : map.getAdjecentTiles(tile)) { - if (!(found.contains(adjTile) || rendered.contains(adjTile))) { - found.add(adjTile); - renderQueue.add(adjTile); - } - } - } - found.remove(tile); - System.gc(); - } - - // Unload remaining chunks to clean-up. - while (!loadedChunks.isEmpty()) { + } + while (!renderQueue.isEmpty()) { + MapTile tile = renderQueue.pollFirst(); + + DynmapChunk[] requiredChunks = tile.getMap().getRequiredChunks(tile); + + if (requiredChunks.length > requiredChunkCount) + requiredChunkCount = requiredChunks.length; + // Unload old chunks. + while (loadedChunks.size() >= requiredChunkCount - requiredChunks.length) { DynmapChunk c = loadedChunks.pollFirst(); world.unloadChunk(c.x, c.y, false, true); } + + // Load the required chunks. + for (DynmapChunk chunk : requiredChunks) { + boolean wasLoaded = world.isChunkLoaded(chunk.x, chunk.y); + world.loadChunk(chunk.x, chunk.y, false); + if (!wasLoaded) + loadedChunks.add(chunk); + } + + if (map.render(tile)) { + found.remove(tile); + rendered.add(tile); + updateQueue.pushUpdate(new Client.Tile(tile.getName())); + for (MapTile adjTile : map.getAdjecentTiles(tile)) { + if (!found.contains(adjTile) && !rendered.contains(adjTile)) { + found.add(adjTile); + renderQueue.add(adjTile); + } + } + } + found.remove(tile); + System.gc(); + } + + // Unload remaining chunks to clean-up. + while (!loadedChunks.isEmpty()) { + DynmapChunk c = loadedChunks.pollFirst(); + world.unloadChunk(c.x, c.y, false, true); } - debugger.debug("Full render finished."); } + debugger.debug("Full render finished."); } private MapType[] loadMapTypes(ConfigurationNode configuration) { diff --git a/src/main/java/org/dynmap/kzedmap/DefaultTileRenderer.java b/src/main/java/org/dynmap/kzedmap/DefaultTileRenderer.java index 953f82fb..06bdc0d5 100644 --- a/src/main/java/org/dynmap/kzedmap/DefaultTileRenderer.java +++ b/src/main/java/org/dynmap/kzedmap/DefaultTileRenderer.java @@ -93,8 +93,8 @@ public class DefaultTileRenderer implements MapTileRenderer { /* save the generated tile */ saveTile(tile, im, path); - - ((KzedMap) tile.getMap()).invalidateTile(new KzedZoomedMapTile((KzedMap) tile.getMap(), im, tile)); + im.flush(); + ((KzedMap) tile.getMap()).invalidateTile(new KzedZoomedMapTile((KzedMap) tile.getMap(), tile)); return !isempty; } diff --git a/src/main/java/org/dynmap/kzedmap/KzedZoomedMapTile.java b/src/main/java/org/dynmap/kzedmap/KzedZoomedMapTile.java index af2e353e..58238962 100644 --- a/src/main/java/org/dynmap/kzedmap/KzedZoomedMapTile.java +++ b/src/main/java/org/dynmap/kzedmap/KzedZoomedMapTile.java @@ -10,12 +10,10 @@ public class KzedZoomedMapTile extends MapTile { return "z" + originalTile.renderer.getName() + "_" + getTileX() + "_" + getTileY(); } - public BufferedImage unzoomedImage; public KzedMapTile originalTile; - public KzedZoomedMapTile(KzedMap map, BufferedImage unzoomedImage, KzedMapTile original) { + public KzedZoomedMapTile(KzedMap map, KzedMapTile original) { super(map); - this.unzoomedImage = unzoomedImage; this.originalTile = original; } diff --git a/src/main/java/org/dynmap/kzedmap/ZoomedTileRenderer.java b/src/main/java/org/dynmap/kzedmap/ZoomedTileRenderer.java index b9e4ce1f..c8e746e7 100644 --- a/src/main/java/org/dynmap/kzedmap/ZoomedTileRenderer.java +++ b/src/main/java/org/dynmap/kzedmap/ZoomedTileRenderer.java @@ -19,26 +19,38 @@ public class ZoomedTileRenderer { } public void render(KzedZoomedMapTile zt, String outputPath) { - KzedMapTile t = zt.originalTile; - String zoomPath = new File(new File(outputPath), zt.getName() + ".png").getPath(); - render(t.px, t.py, zt.getTileX(), zt.getTileY(), zt.unzoomedImage, zoomPath); - } - - public void render(int px, int py, int zpx, int zpy, BufferedImage image, String zoomPath) { - BufferedImage zIm = null; - debugger.debug("Trying to load zoom-out tile: " + zoomPath); + KzedMapTile originalTile = zt.originalTile; + int px = originalTile.px; + int py = originalTile.py; + int zpx = zt.getTileX(); + int zpy = zt.getTileY(); + + BufferedImage image = null; try { - File file = new File(zoomPath); - zIm = ImageIO.read(file); + image = ImageIO.read(new File(new File(outputPath), originalTile.getName() + ".png")); } catch (IOException e) { + return; + } + + if (image == null) { + debugger.debug("Could not load original tile, won't render zoom-out tile."); + return; + } + + BufferedImage zIm = null; + File zoomFile = new File(new File(outputPath), zt.getName() + ".png"); + try { + zIm = ImageIO.read(zoomFile); + } catch (IOException e) { + return; } if (zIm == null) { /* create new one */ zIm = new BufferedImage(KzedMap.tileWidth, KzedMap.tileHeight, BufferedImage.TYPE_INT_RGB); - debugger.debug("New zoom-out tile created " + zoomPath); + debugger.debug("New zoom-out tile created " + zt.getName()); } else { - debugger.debug("Loaded zoom-out tile from " + zoomPath); + debugger.debug("Loaded zoom-out tile from " + zt.getName()); } /* update zoom-out tile */ @@ -66,13 +78,12 @@ public class ZoomedTileRenderer { /* save zoom-out tile */ try { - File file = new File(zoomPath); - ImageIO.write(zIm, "png", file); - debugger.debug("Saved zoom-out tile at " + zoomPath); + ImageIO.write(zIm, "png", zoomFile); + debugger.debug("Saved zoom-out tile at " + zoomFile.getName()); } catch (IOException e) { - debugger.error("Failed to save zoom-out tile: " + zoomPath, e); + debugger.error("Failed to save zoom-out tile: " + zoomFile.getName(), e); } catch (java.lang.NullPointerException e) { - debugger.error("Failed to save zoom-out tile (NullPointerException): " + zoomPath, e); + debugger.error("Failed to save zoom-out tile (NullPointerException): " + zoomFile.getName(), e); } zIm.flush(); }