better filtering in getRandomTask

This commit is contained in:
David Rose 2008-10-14 02:18:32 +00:00
parent 02d98e41c7
commit dd0efe66fe

View File

@ -608,37 +608,25 @@ class TaskManager:
return self._profileInfo.session return self._profileInfo.session
def _getRandomTask(self): def _getRandomTask(self):
tasks = self.mgr.getActiveTasks() # Figure out when the next frame is likely to expire, so we
numTasks = tasks.getNumTasks() # won't grab any tasks that are sleeping for a long time.
doLaters = self.mgr.getSleepingTasks() now = globalClock.getFrameTime()
numDoLaters = doLaters.getNumTasks() avgFrameRate = globalClock.getAverageFrameRate()
if random.random() < (numDoLaters / float(numTasks + numDoLaters)): if avgFrameRate < .00001:
# grab a doLater that will most likely trigger in the next frame avgFrameDur = 0.
tNow = globalClock.getFrameTime()
avgFrameRate = globalClock.getAverageFrameRate()
if avgFrameRate < .00001:
avgFrameDur = 0.
else:
avgFrameDur = (1. / globalClock.getAverageFrameRate())
tNext = tNow + avgFrameDur
# binary search to find doLaters that are likely to trigger on the next frame
curIndex = int(numDoLaters / 2)
rangeStart = 0
rangeEnd = numDoLaters
while True:
if tNext < doLaters[curIndex].wakeTime:
rangeEnd = curIndex
else:
rangeStart = curIndex
prevIndex = curIndex
curIndex = int((rangeStart + rangeEnd) / 2)
if curIndex == prevIndex:
break
index = curIndex
task = doLaters[random.randrange(index+1)]
else: else:
# grab a task avgFrameDur = (1. / globalClock.getAverageFrameRate())
task = tasks[random.randint(0, numTasks - 1)] next = now + avgFrameDur
# Now grab a task at random, until we find one that we like.
tasks = self.mgr.getTasks()
i = random.randrange(tasks.getNumTasks())
task = tasks.getTask(i)
while not isinstance(task, PythonTask) or \
task.getWakeTime() > next:
tasks.removeTask(i)
i = random.randrange(tasks.getNumTasks())
task = tasks.getTask(i)
return task return task
def __repr__(self): def __repr__(self):