diff --git a/direct/src/showbase/PythonUtil.py b/direct/src/showbase/PythonUtil.py index ff43d887b0..0cc4c83bd9 100644 --- a/direct/src/showbase/PythonUtil.py +++ b/direct/src/showbase/PythonUtil.py @@ -761,9 +761,15 @@ def profiled(category, terse=False): def loadParticles(): ... + want-profile-particles 1 """ assert type(category) is types.StringType, "must provide a category name for @profiled" - if not __dev__: + + try: + null = not __dev__ + except: + null = not __debug__ + if null: # if we're not in __dev__, just return the function itself. This # results in zero runtime overhead, since decorators are evaluated # at module-load. diff --git a/direct/src/showbase/ShowBase.py b/direct/src/showbase/ShowBase.py index 6c59aad70b..9e17a63f3b 100644 --- a/direct/src/showbase/ShowBase.py +++ b/direct/src/showbase/ShowBase.py @@ -2027,6 +2027,9 @@ class ShowBase(DirectObject.DirectObject): else: __builtins__["direct"] = self.direct = None + def profileNextFrame(self): + self.taskMgr.profileNextFrame() + def run(self): self.taskMgr.run() diff --git a/direct/src/task/Task.py b/direct/src/task/Task.py index 2440f21604..b0afafc5e0 100644 --- a/direct/src/task/Task.py +++ b/direct/src/task/Task.py @@ -333,6 +333,8 @@ class TaskManager: # List of tasks scheduled to execute in the future self.__doLaterList = [] + self._profileNextFrame = False + # We copy this value in from __builtins__ when it gets set. # But since the TaskManager might have to run before it gets # set--before it can even be available--we also have to have @@ -767,6 +769,13 @@ class TaskManager: self.__addNewTask(task) self.pendingTaskDict.clear() + def profileNextFrame(self): + self._profileNextFrame = True + + @profiled('frame') + def _profiledFrame(self, *args, **kArgs): + return self.step(*args, **kArgs) + def step(self): # assert TaskManager.notify.debug('step: begin') self.currentTime, self.currentFrame = self.__getTimeFrame() @@ -837,7 +846,11 @@ class TaskManager: self.running = 1 while self.running: try: - self.step() + if self._profileNextFrame: + self._profiledFrame() + self._profileNextFrame = False + else: + self.step() except KeyboardInterrupt: self.stop() except IOError, (errno, strerror):