Bonjour,
Je dévellope un petit jeu utilisant irrlicht. J'utilisais la version 1.4 et tout fonctionnait très bien. J'ai voulu testé la version 1.4.1 mais j'obtient une erreur de segmentation. J'utilise pourtant le même code.
L'erreur a lieu lors de l'appel de
driver->beginScene(true, true, irr::video::SColor(0,00,00,00));
Après quelque tests j'ai remarque que cette fonction fonctionnait si la boucle d'affichage se trouvait dans le même thread que l'initialisation. Dans mon cas, la boucle d'affichage se trouve dans un second thread.
Voici mon initialisation :
GraphicsEngine::GraphicsEngine(Game *g):Engine(g) {
#ifdef DEBUG
std::cout<<"GraphicsEngine : new"<<std::endl;
#endif
sg = new SceneGraph(this);
parent->GetWorld()->SetGraphicsWorld(sg);
receiver = new EventReceiver();
//idevice = irr::createDevice(irr::video::EDT_OPENGL, irr::core::dimension2d<irr::s32>(800, 600), 32, false, false, false);
idevice = irr::createDevice(irr::video::EDT_OPENGL, irr::core::dimension2d<irr::s32>(800, 600), 32, false, false, false,receiver);
driver = idevice->getVideoDriver();
sg->smgr = idevice->getSceneManager();
…
…
…
}
Voici le code de la frame appelé par un thread d'affichage :
void GraphicsEngine::frame(){
// on vérifie si l'utilisateur n'a pas fermé la fenêtre
if (!driver || !idevice->run()){
parent->Stop();
}
driver->beginScene(true, true, irr::video::SColor(0,00,00,00));
boost::mutex::scoped_lock l(parent->GetWorld()->lockWorld);
parent->GetWorld()->Syncronize();
l.unlock();
// on dessine le graphe de scène
sg->Render();
int fps = driver->getFPS();
irr::core::stringw str = L"ALT-ernative ";
str += " FPS:";
str += fps;
idevice->setWindowCaption(str.c_str());
// on appelle l'affichage de l'interface
driver->endScene();
}
Voici la déclaration de la classe :
class GraphicsEngine : public Engine {
public:
GraphicsEngine(Game*); // objet contenant et mode passif
~GraphicsEngine();
//bool OnEvent(irr::SEvent);
irr::video::IVideoDriver *GetDriver();
EventReceiver *GetEventReceiver();
//Gui_system *get_gui();
protected:
// GuiSystem *gui;
irr::video::IVideoDriver *driver;
void frame();
irr::IrrlichtDevice *idevice;
void processEvent(EngineEvent *);
EventReceiver *receiver;
SceneGraph *sg;
//bool consoleVisible;
// ...
};
#else
Est-ce un bug de la version 1.4.1 ?
Merci