QT & OgreNewt crashes / performance issues

technique

29-11-2010 15:01:27

Hi, i am new at OgreNewt and actually in Ogre at all.

Ive set up Ogre in a QT QGLWidget (like in the ogre wiki) and it works (but not very well).

(Win7 x64 and Visual Studio 2010 Prof)

Header:

#ifndef __OGREWIDGET_H__
#define __OGREWIDGET_H__

#include <OGRE/Ogre.h>
#include <QGLWidget>
#include <QX11Info>
#include "CScene.h"
#include <QMessageBox>
#include <iostream>

class OgreWidget : public QGLWidget
{
//Q_OBJECT;

public:
OgreWidget( QWidget *parent=0 ):
QGLWidget( parent ),
mOgreWindow(NULL)
{
init();
}

virtual ~OgreWidget()
{
mOgreRoot->shutdown();
delete mOgreRoot;
destroy();
}

void updateOgreWidget();

CScene* scene;

protected:
virtual void initializeGL();
virtual void resizeGL( int, int );
virtual void paintGL();
void timerEvent(QTimerEvent *);

void init();

Ogre::String mPluginsCfg;
Ogre::String mResourcesCfg;
Ogre::Root *mOgreRoot;
Ogre::RenderWindow *mOgreWindow;
Ogre::Camera *mCamera;
Ogre::Viewport *mViewport;
Ogre::SceneManager *mSceneMgr;
};

#endif

Source:

#include "COgreWidget.h"


/**
* @brief init the object
* @author kito berg-taylor
*/
void OgreWidget::init()
{

#ifdef _DEBUG
mPluginsCfg = "plugins_d.cfg";
#else
mPluginsCfg = "plugins.cfg";
#endif
std::cout << "init" << std::endl;
mResourcesCfg = "resources.cfg";

mOgreRoot = new Ogre::Root(mPluginsCfg);

Ogre::ConfigFile cf;
cf.load(mResourcesCfg);

Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();

Ogre::String secName, typeName, archName;
while (seci.hasMoreElements())
{
secName = seci.peekNextKey();
Ogre::ConfigFile::SettingsMultiMap *settings = seci.getNext();
Ogre::ConfigFile::SettingsMultiMap::iterator i;
for (i = settings->begin(); i != settings->end(); ++i)
{
typeName = i->first;
archName = i->second;
Ogre::ResourceGroupManager::getSingleton().addResourceLocation(
archName, typeName, secName);
}
}
mOgreRoot->showConfigDialog();
}

/**
* @brief setup the rendering context
* @author Kito Berg-Taylor
*/
void OgreWidget::initializeGL()
{
Ogre::String winHandle;

winHandle =Ogre::StringConverter::toString((unsigned long)(this->parentWidget()->winId()));

Ogre::NameValuePairList params;
params["parentWindowHandle"] = winHandle;
mOgreRoot->initialise(false);
mOgreWindow = mOgreRoot->createRenderWindow( "QOgreWidget_RenderWindow",
this->width(),
this->height(),
false,
&params );

mOgreWindow->setActive(true);
WId ogreWinId = 0x0;
mOgreWindow->getCustomAttribute( "WINDOW", &ogreWinId );

assert( ogreWinId );

this->create( ogreWinId );
setAttribute( Qt::WA_PaintOnScreen, true );
setAttribute( Qt::WA_NoBackground );

//== Ogre Initialization ==//

Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();

mSceneMgr = mOgreRoot->createSceneManager(Ogre::ST_EXTERIOR_CLOSE, "SceneManager");

mCamera = mSceneMgr->createCamera( "Camera1" );
mCamera->setPosition( Ogre::Vector3( 0 , 20, 100 ) );
mCamera->lookAt( Ogre::Vector3 ( 0,0,0 ) );
mCamera->setNearClipDistance( 1.0 );

Ogre::Viewport *mViewport = mOgreWindow->addViewport( mCamera );
mViewport->setBackgroundColour( Ogre::ColourValue( 0,0,0 ) );

scene = new CScene("SceneManager", "Camera1", mOgreWindow);
this->startTimer( 30 );
}

/**
* @brief render a frame
* @author Kito Berg-Taylor
*/
void OgreWidget::paintGL()
{
assert( mOgreWindow );
mOgreRoot->renderOneFrame();
swapBuffers();
}


/**
* @brief resize the GL window
* @author Kito Berg-Taylor
*/
void OgreWidget::resizeGL( int width, int height )
{
assert( mOgreWindow );
mOgreWindow->windowMovedOrResized();
}

void OgreWidget::updateOgreWidget()
{
paintGL();
}

void OgreWidget::timerEvent( QTimerEvent *e )
{
paintGL();
}

1. Ive created a very basic scene and on my machine (AMD Phenom II X4 955, NVIDIA GTX460 aso ..) and in debug mode it runs not very smooth (feels like 10 fps or less). I dont know, if i toggle the QT::QGLWidget::paintGL() on the right way (i use the timer of the QGLWidget)?

2. In order of the bad performance (above) i tried to build in release configuration but the app crashes. When i remove the following physic init the app runs without errors (aswell without objects, cause they all depends on physic and i have to comment out them too).


void CScene::createPhysic( void )
{
mWorld = new OgreNewt::World(); // this line breaks the app
OgreNewt::BasicFrameListener* mOgreNewtListener;
mOgreNewtListener = new OgreNewt::BasicFrameListener( mWindow, mWorld, 60 );
mRoot->addFrameListener( mOgreNewtListener );
}


Any idea how to fix the problems?

technique

07-12-2010 09:25:40

Without qt, the app crashes at the same position (in release). So its a problem of ogrenewt or newton?

Good news:
I figured out that my Ogre::ManualObjects were resbonsible for my performance issues. I changed the way i have created the objects and that speed-up the app.