From 134de4472d3f2fa913944770595de9221dd27fdf Mon Sep 17 00:00:00 2001 From: Thomas B Thompson Date: Tue, 4 Jan 2011 00:04:05 -0500 Subject: worked on profiling, made a bunch of changes, huge speedup! --- pixelcore/Screen.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'pixelcore/Screen.py') diff --git a/pixelcore/Screen.py b/pixelcore/Screen.py index da03ad2..b002896 100644 --- a/pixelcore/Screen.py +++ b/pixelcore/Screen.py @@ -6,6 +6,8 @@ import util.Search as Search import util.ComponentRegistry as compReg import util.Strings as Strings import itertools +import sys +from logger import main_log #Class representing a collection of Pixels grouped into PixelStrips. Needs a #PixelMapper, currently set via setMapper by may be migrated into the argDict. class Screen: @@ -15,28 +17,35 @@ class Screen: self.xSortedPixels = [] self.xPixelLocs = [] sizeValid = False + def addStrip(self, lS): self.pixelStrips.append(lS) self.sizeValid = False #keep track of whether or not our screen size has #been invalidated by adding more pixels self.computeXSortedPixels() + #Returns (pixelIndex, pixel). Does a binary search. def pixelsInRange(self, minX, maxX): minIndex = Search.find_ge(self.xPixelLocs, minX) maxIndex = Search.find_le(self.xPixelLocs, maxX)+1 return self.xSortedPixels[minIndex:maxIndex] + def computeXSortedPixels(self): for pixel in self: self.xSortedPixels.append((pixel.location[0], pixel)) self.xSortedPixels.sort() self.xPixelLocs = [p[0] for p in self.xSortedPixels] + def render(self, surface): [lS.render(surface) for lS in self.pixelStrips] + def allOn(self): [lS.allOn(-1) for lS in self.pixelStrips] + def __iter__(self): #the iterator of all our pixel strips chained togther return itertools.chain(*[strip.__iter__() for strip in \ self.pixelStrips]) #the * operator breaks the list into args + #increment time -- This processes all queued responses. Responses generated #during this period are added to the queue that will be processed on the next #time step. @@ -46,14 +55,15 @@ class Screen: for response in tempQueue: self.processResponse(response) [p.invalidateState() for p in self] + #public def respond(self, responseInfo): self.responseQueue.append(responseInfo) + def getSize(self): if self.sizeValid: return self.size - (minX, minY, maxX, maxY) = (10**10,10**10,-10**10,-10*10) #TODO: don't - #be lazy + (minX, minY, maxX, maxY) = (sys.maxint,sys.maxint,-sys.maxint,-sys.maxint) for light in self: (x,y) = light.location @@ -65,6 +75,7 @@ class Screen: self.size = (0,0, maxX, maxY) self.sizeValid = True return (0, 0, maxX+100, maxY+100) #TODO: cleaner + #private def processResponse(self, responseInfo): #we need to make a new dict for #each to prevent interference @@ -78,6 +89,8 @@ class Screen: #if type(mapper) != type(PixelMapper): # raise Exception('No default mapper specified.') pixelWeightList = mapper.mapEvent(responseInfo['Location'], self) + main_log.debug(str(len(pixelWeightList))) + main_log.debug(pixelWeightList) PixelEvent.addPixelEventIfMissing(responseInfo) for (pixel, weight) in pixelWeightList: pixel.processInput(responseInfo['PixelEvent'].scale(weight), 0) #TODO: z-index -- cgit v1.2.3