Performances issues: SampleFramework or not?

Tutta

15-09-2008 22:26:25

This is my first post, so Hi everybody, I'm a poor little italian programmer!

I did Python-Ogre tutorials because I have to choose one rendering engine for a little work, but I've found a strange thing:

I made a simple program that show a string using Ogre OverlayManager (TextArea).

It works fine, but the problem is that if I made the program with the SampleFramework, filling the _createScene method, it runs between 600-650 FPS.
While if I run it don't using the SampleFramework (how showed in Basic Tutorial 6) it runs between 50-60 FPS.

I suppose that without SampleFramework I don't perform a lot of stuff, then... Why?? Why it decreases about 10 times??

My only answer is that SampleFramework is hard-coded in C++ wrapped part of the engine, while if I don't use it I perform python calls every frame that slow down my application... is it true?

Then... which is the best thing to do to make a Python-ogre application? Do I Always have to use the SampleFramework or I can make something to improve my results?

Thanks!!

andy

15-09-2008 23:58:13

Can you post your code so it can be examined -- there isn't anything in the SampleFramework that accounts for the performance improvement (it's all standard Python accessing standard Ogre library functions).

regards

Andy

Tutta

16-09-2008 21:53:32

Thank you!
This is the code of the SampleFramework-ed program:


import ogre.renderer.OGRE as ogre
import SampleFramework as sf


class TutorialApplication(sf.Application):

def _createScene(self):
overlayManager = ogre.OverlayManager.getSingleton()
overlay = overlayManager.create ( "overlay" )
panel = overlayManager.createOverlayElement ( "Panel", "container1" )
panel.setDimensions ( 1, 1 )
panel.setPosition ( 0, 0 )
overlay.add2D ( panel )
overlay.show ( )

textBox = overlayManager.createOverlayElement ( "TextArea", "txt1" )
textBox.setDimensions ( 500.0, 300.0 )
textBox.setMetricsMode ( ogre.GMM_PIXELS )
textBox.setPosition ( 100.0, 20.0 )
textBox.setParameter ( "font_name", "MyFont" )
textBox.setParameter ( "char_height", "40" )
textBox.setCaption ( "Ciao Mondo!" )

panel.addChild ( textBox )

def _createCamera (self):
self.camera = self.sceneManager.createCamera ('PlayerCam')
self.camera.position = (0, 150, -500)
self.camera.lookAt ((0, 0, 0))
self.camera.nearClipDistance = 5

def _createViewports (self):
viewport = self.renderWindow.addViewport (self.camera)
viewport.backGroundColor = (0, 0, 0)
self.camera.aspectRatio = float (viewport.actualWidth) / float (viewport.actualHeight)


if __name__ == '__main__':
ta = TutorialApplication ()
ta.go ()


... and this without the SampleFramework


import ogre.renderer.OGRE as ogre
import ogre.io.OIS as OIS

class AppFrameListener(ogre.FrameListener):

def __init__(self, keyboard):
ogre.FrameListener.__init__(self)
self.keyboard = keyboard

def frameStarted(self, evt):
self.keyboard.capture()
return not self.keyboard.isKeyDown(OIS.KC_ESCAPE)

class Application(object):

def __init__(self):
self.root = None
self.appFrameListener = None
self.sceneManager = None
self.camera = None
self.inputManager = None
self.keyboard = None

def __del__(self):
del self.keyboard
del self.inputManager
del self.camera
del self.sceneManager
del self.appFrameListener
del self.root

def go(self):
self.createRoot()
self.defineResources()
self.setupRenderSystem()
self.createRenderWindow()
self.initializeResourceGroups()
self.setupScene()
self.setupInputSystem()
#self.setupCEGUI()
self.createFrameListener()
self.startRenderLoop()
self.cleanUp()

def createRoot(self):
self.root = ogre.Root ( )

def defineResources(self):
cf = ogre.ConfigFile()
cf.load("resources2.cfg")
seci = cf.getSectionIterator()
while seci.hasMoreElements():
secName = seci.peekNextKey()
settings = seci.getNext()
for item in settings:
typeName = item.key
archName = item.value
ogre.ResourceGroupManager.getSingleton().addResourceLocation(archName, typeName, secName)

def setupRenderSystem(self):
renderSystem = self.root.getRenderSystemByName("Direct3D9 Rendering Subsystem")
self.root.setRenderSystem(renderSystem);
renderSystem.setConfigOption("Full Screen", "No")
renderSystem.setConfigOption("Video Mode", "800 x 600 @ 32-bit colour")

def createRenderWindow(self):
self.root.initialise(True, "Prova TitleManager")
"""
# Do not add this to the application
self.root.initialise(False)
hWnd = 0 # Get the hWnd of the application!
misc = ogre.NameValuePairList()
misc["externalWindowHandle"] = str(int(hWnd))
renderWindow = self.root.createRenderWindow("Main RenderWindow", 800, 600, False, misc)
"""

def initializeResourceGroups(self):
ogre.TextureManager.getSingleton().setDefaultNumMipmaps(5)
ogre.ResourceGroupManager.getSingleton().initialiseAllResourceGroups()

def setupScene(self):
self.sceneManager = self.root.createSceneManager(ogre.ST_GENERIC, "Default SceneManager")
self.camera = self.sceneManager.createCamera("Camera")
viewPort = self.root.getAutoCreatedWindow().addViewport(self.camera)

overlayManager = ogre.OverlayManager.getSingleton()
overlay = overlayManager.create ( "overlay" )
panel = overlayManager.createOverlayElement ( "Panel", "container1" )
panel.setDimensions ( 1, 1 )
panel.setPosition ( 0, 0 )
overlay.add2D ( panel )
overlay.show ( )

textBox = overlayManager.createOverlayElement ( "TextArea", "txt1" )
textBox.setDimensions ( 500.0, 300.0 )
textBox.setMetricsMode ( ogre.GMM_PIXELS )
textBox.setPosition ( 100.0, 20.0 )
textBox.setParameter ( "font_name", "MyFont" )
textBox.setParameter ( "char_height", "40" )
textBox.setCaption ( "Ciao Mondo!" )

panel.addChild ( textBox )


def setupInputSystem(self):
windowHandle = 0
renderWindow = self.root.getAutoCreatedWindow()
windowHandle = renderWindow.getCustomAttributeInt("WINDOW")
paramList = [("WINDOW", str(windowHandle))]
self.inputManager = OIS.createPythonInputSystem(paramList)
try:
self.keyboard = self.inputManager.createInputObjectKeyboard(OIS.OISKeyboard, False)
except Exception, e:
raise e

def setupCEGUI(self):
pass

def createFrameListener(self):
self.appFrameListener = AppFrameListener ( self.keyboard )
self.root.addFrameListener(self.appFrameListener)

def startRenderLoop(self):
self.root.startRendering()

def cleanUp(self):
self.inputManager.destroyInputObjectKeyboard(self.keyboard)
OIS.InputManager.destroyInputSystem(self.inputManager)
self.inputManager = None

if __name__ == '__main__':
try:
ta = Application()
ta.go()
except ogre.OgreException, e:
print e


Thank you very much... cheers

andy

17-09-2008 02:53:48

By default the video drivers in Ogre (at least DirectX) enable VSync which is why you are seeing a fixed frame rate..

Add the following to your code to fix it:
renderSystem.setConfigOption("VSync", "No")

regards
Andy

Tutta

17-09-2008 18:34:44

Now it go like a shuttle!! Problem fixed!
Thanks a lot!!