On Fri, 15 Feb 2008 10:31:14 -0500, Bernie Roehl <broehl@gmail.com> wrote:
On Thu, Feb 14, 2008 at 1:30 PM, Bernie Roehl <broehl@gmail.com> wrote:
I'm also wondering what would be the advantages of using a coiterator...?
As an experiment, I tried switching to using a coiterator. I got a 30% increase in framerate!
Hmmm. :)
My code now looks like this:
class RendererIterator: # used if usingCoiterator is True def __iter__(self): return self def next(self): ogre.WindowEventUtilities.messagePump() root.renderOneFrame()
from twisted.internet.task import coiterate
renderSystem._initRenderTargets() root.clearEventTimes() coiterate(RendererIterator()) reactor.run()
Seems to work okay, but haven't tested it extensively.
Any Twisted-gurus have any comments/suggestions/cautions?
There shouldn't really be any performance difference between using coiterate and using LoopingCall. The significant behavioral difference is that coiterate will call your code (RendererIterator.next in this case) as fast as it can (with some constraints). LoopingCall will call your code no faster than you specify. So my guess is that the 30% increase in FPS is because your system is capable of doing that much additional work above what you asked to do when you used LoopingCall. If you make a corresponding decrease in the interval you use with LoopingCall, do you not see any increase in FPS? If not, then you may be getting a bit of extra performance from coiterate from its behavior of sometimes calling your code multiple times without letting the reactor run. It will do this if it notices your code runs very quickly and so decides that it can afford to call it again before giving control back to the reactor to let network events be processed. This may give you a somewhat unevent frame rate, as compared to LoopingCall, but that might be suitable for your application. Jean-Paul