mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 19:08:55 -04:00
better filtering in getRandomTask
This commit is contained in:
parent
02d98e41c7
commit
dd0efe66fe
@ -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):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user