4545import org .apache .commons .cli .Options ;
4646import org .apache .commons .cli .ParseException ;
4747import org .apache .commons .io .FileUtils ;
48+ import org .apache .commons .lang3 .time .DurationFormatUtils ;
4849
50+ import com .flowpowered .math .GenericMath ;
4951import com .flowpowered .math .vector .Vector2i ;
5052import com .google .common .base .Preconditions ;
5153
54+ import de .bluecolored .bluemap .common .MapType ;
55+ import de .bluecolored .bluemap .common .RenderManager ;
56+ import de .bluecolored .bluemap .common .RenderTask ;
5257import de .bluecolored .bluemap .core .config .ConfigManager ;
5358import de .bluecolored .bluemap .core .config .MainConfig ;
5459import de .bluecolored .bluemap .core .config .MainConfig .MapConfig ;
@@ -116,7 +121,8 @@ public void renderMaps() throws IOException {
116121 LowresModelManager lowresModelManager = new LowresModelManager (
117122 config .getWebDataPath ().resolve (mapConfig .getId ()).resolve ("lowres" ),
118123 new Vector2i (mapConfig .getLowresPointsPerLowresTile (), mapConfig .getLowresPointsPerLowresTile ()),
119- new Vector2i (mapConfig .getLowresPointsPerHiresTile (), mapConfig .getLowresPointsPerHiresTile ())
124+ new Vector2i (mapConfig .getLowresPointsPerHiresTile (), mapConfig .getLowresPointsPerHiresTile ()),
125+ mapConfig .useGzipCompression ()
120126 );
121127
122128 TileRenderer tileRenderer = new TileRenderer (hiresModelManager , lowresModelManager );
@@ -146,6 +152,9 @@ public void renderMaps() throws IOException {
146152 File textureExportFile = config .getWebDataPath ().resolve ("textures.json" ).toFile ();
147153 resourcePack .saveTextureFile (textureExportFile );
148154
155+ RenderManager renderManager = new RenderManager (config .getRenderThreadCount ());
156+ renderManager .start ();
157+
149158 for (MapType map : maps .values ()) {
150159 Logger .global .logInfo ("Rendering map '" + map .getId () + "' ..." );
151160 Logger .global .logInfo ("Collecting tiles to render..." );
@@ -166,15 +175,52 @@ public void renderMaps() throws IOException {
166175 }
167176
168177 if (tiles .isEmpty ()) {
169- Logger .global .logInfo ("Render finished!" );
170- return ;
178+ continue ;
171179 }
172180
173181 Logger .global .logInfo ("Starting Render..." );
174182 long starttime = System .currentTimeMillis ();
175183
176- RenderTask task = new RenderTask (map , tiles , config .getRenderThreadCount ());
177- task .render ();
184+ RenderTask task = new RenderTask ("Map-Render: " + map .getName (), map );
185+ task .addTiles (tiles );
186+ task .optimizeQueue ();
187+
188+ renderManager .addRenderTask (task );
189+
190+ long lastLogUpdate = System .currentTimeMillis ();
191+ long lastSave = lastLogUpdate ;
192+
193+ while (!task .isFinished ()) {
194+ try {
195+ Thread .sleep (200 );
196+ } catch (InterruptedException e ) {}
197+
198+ long now = System .currentTimeMillis ();
199+
200+ if (lastLogUpdate < now - 10000 ) { // print update all 10 seconds
201+ lastLogUpdate = now ;
202+ long time = task .getActiveTime ();
203+
204+ String durationString = DurationFormatUtils .formatDurationWords (time , true , true );
205+ int tileCount = task .getRemainingTileCount () + task .getRenderedTileCount ();
206+ double pct = (double )task .getRenderedTileCount () / (double ) tileCount ;
207+
208+ long ert = (long )((time / pct ) * (1d - pct ));
209+ String ertDurationString = DurationFormatUtils .formatDurationWords (ert , true , true );
210+
211+ double tps = task .getRenderedTileCount () / (time / 1000.0 );
212+
213+ Logger .global .logInfo ("Rendered " + task .getRenderedTileCount () + " of " + tileCount + " tiles in " + durationString + " | " + GenericMath .round (tps , 3 ) + " tiles/s" );
214+ Logger .global .logInfo (GenericMath .round (pct * 100 , 3 ) + "% | Estimated remaining time: " + ertDurationString );
215+ }
216+
217+ if (lastSave < now - 5 * 60000 ) { // save every 5 minutes
218+ lastSave = now ;
219+ map .getTileRenderer ().save ();
220+ }
221+ }
222+
223+ map .getTileRenderer ().save ();
178224
179225 try {
180226 webSettings .set (starttime , map .getId (), "last-render" );
@@ -184,6 +230,8 @@ public void renderMaps() throws IOException {
184230 }
185231 }
186232
233+ renderManager .stop ();
234+
187235 Logger .global .logInfo ("Waiting for all threads to quit..." );
188236 if (!ForkJoinPool .commonPool ().awaitQuiescence (30 , TimeUnit .SECONDS )) {
189237 Logger .global .logWarning ("Some save-threads are taking very long to exit (>30s), they will be ignored." );
0 commit comments