From 5dbeaa689afca3ce6a9de79095bd2bf797cf10ae Mon Sep 17 00:00:00 2001 From: Darren Ranalli Date: Tue, 4 Nov 2008 21:02:16 +0000 Subject: [PATCH] frame-profiler-debug -> frequent-frame-profiles, limit number of profile loggings in one frame --- direct/src/task/FrameProfiler.py | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/direct/src/task/FrameProfiler.py b/direct/src/task/FrameProfiler.py index 3283068f76..12636a64d5 100755 --- a/direct/src/task/FrameProfiler.py +++ b/direct/src/task/FrameProfiler.py @@ -1,11 +1,13 @@ from direct.directnotify.DirectNotifyGlobal import directNotify from direct.fsm.StatePush import FunctionCall from direct.showbase.PythonUtil import formatTimeExact, normalDistrib +from direct.task import Task class FrameProfiler: notify = directNotify.newCategory('FrameProfiler') - # for precision, all times related to the profile/log schedule are stored as integers + # because of precision requirements, all times related to the profile/log + # schedule are stored as integers Minute = 60 Hour = 60 * Minute Day = 24 * Hour @@ -14,7 +16,7 @@ class FrameProfiler: Hour = FrameProfiler.Hour # how long to wait between frame profiles self._period = 2 * FrameProfiler.Minute - if config.GetBool('frame-profiler-debug', 0): + if config.GetBool('frequent-frame-profiles', 0): self._period = 1 * FrameProfiler.Minute # used to prevent profile from being taken exactly every 'period' seconds self._jitterMagnitude = self._period * .75 @@ -26,7 +28,7 @@ class FrameProfiler: 12 * FrameProfiler.Hour, 1 * FrameProfiler.Day, ] # day schedule proceeds as 1, 2, 4, 8 days, etc. - if config.GetBool('frame-profiler-debug', 0): + if config.GetBool('frequent-frame-profiles', 0): self._logSchedule = [ 1 * FrameProfiler.Minute, 4 * FrameProfiler.Minute, 12 * FrameProfiler.Minute, @@ -113,6 +115,18 @@ class FrameProfiler: Functor(self._doAnalysis, sessionId), 'FrameProfilerAnalysis-%s' % sessionId) def _doAnalysis(self, sessionId, task): + if hasattr(task, '_generator'): + gen = task._generator + else: + gen = self._doAnalysisGen(sessionId) + task._generator = gen + result = gen.next() + if result == Task.done: + del task._generator + return result + + def _doAnalysisGen(self, sessionId): + # generator to limit max number of profile loggings per frame p2ap = self._period2aggregateProfile self._id2task.pop(sessionId) @@ -131,14 +145,21 @@ class FrameProfiler: session.release() session = None + counter = 0 + # log profiles when it's time, and aggregate them upwards into the # next-longer profile for pi in xrange(len(self._logSchedule)): period = self._logSchedule[pi] if (self._timeElapsed % period) == 0: if period in p2ap: + # delay until the next frame if we've already processed N profiles this frame + if counter >= 3: + counter = 0 + yield Task.cont self.notify.info('aggregate profile of sampled frames over last %s\n%s' % (formatTimeExact(period), p2ap[period].getResults())) + counter += 1 # aggregate this profile into the next larger profile nextIndex = pi + 1 if nextIndex >= len(self._logSchedule): @@ -161,5 +182,4 @@ class FrameProfiler: # periods are multiples of this one break - return task.done - + yield Task.done