diff --git a/overviewer.py b/overviewer.py index 9860fa6..5206ef7 100755 --- a/overviewer.py +++ b/overviewer.py @@ -420,11 +420,12 @@ dir but you forgot to put quotes around the directory, since it contains spaces. tilesets.append(tset) - # non-multiprocessing dispatcher - dispatch = dispatcher.Dispatcher() + # multiprocessing dispatcher + dispatch = dispatcher.MultiprocessingDispatcher() def print_status(*args): logging.info("Status callback: %r", args) dispatch.render_all(tilesets, print_status) + dispatch.close() sys.exit("early abort") diff --git a/overviewer_core/dispatcher.py b/overviewer_core/dispatcher.py index 685d6db..8f9b7f8 100644 --- a/overviewer_core/dispatcher.py +++ b/overviewer_core/dispatcher.py @@ -48,13 +48,14 @@ class Dispatcher(object): """ # TODO use status callback - # setup tilesetlist - self.setup_tilesets(tilesetlist) - # preprocessing for tileset in tilesetlist: tileset.do_preprocessing() + # setup tilesetlist + self.setup_tilesets(tilesetlist) + + # iterate through all possible phases num_phases = [tileset.get_num_phases() for tileset in tilesetlist] for phase in xrange(max(num_phases)): @@ -350,7 +351,7 @@ class MultiprocessingDispatcher(Dispatcher): finished_jobs += self._handle_messages() return finished_jobs - def _handle_messages(self, timeout=1.0): + def _handle_messages(self, timeout=0.01): # work function: takes results out of the result queue and # keeps track of how many outstanding jobs remain finished_jobs = [] diff --git a/overviewer_core/textures.py b/overviewer_core/textures.py index b031516..d9b5739 100644 --- a/overviewer_core/textures.py +++ b/overviewer_core/textures.py @@ -46,10 +46,25 @@ class Textures(object): self.texture_size = 24 self.texture_dimensions = (self.texture_size, self.texture_size) - # these are filled in in generate() - self.terrain_images = None - self.blockmap = [] - self.biome_grass_texture = None + # this is set in in generate() + self.generated = False + + ## + ## pickle support + ## + + def __getstate__(self): + # we must get rid of the huge image lists, and other images + attributes = self.__dict__.copy() + for attr in ['terrain_images', 'blockmap', 'biome_grass_texture', 'watertexture', 'lavatexture']: + del attributes[attr] + return attributes + def __setstate__(self, attrs): + # regenerate textures, if needed + for attr, val in attrs.iteritems(): + setattr(self, attr, val) + if self.generated: + self.generate() ## ## The big one: generate() @@ -82,6 +97,8 @@ class Textures(object): block = tex[0] scaled_block = block.resize(self.texture_dimensions, Image.ANTIALIAS) blockmap[i] = self.generate_texture_tuple(scaled_block) + + self.generated = True ## ## Helpers for opening textures