1
Fenêtrage / [Résolu][Evénements] La fenêtre ne répond pas [SFML 2.3.2]
« le: Juin 24, 2016, 11:55:46 am »
Bonjour tout le monde,
J'ai un programme en SFML que je compile à la fois sous Windows (10) et Linux (Arch,Debian et Ubuntu)
Qui possède une boucle événementielle comme ceci :
Malgré le fait de pomper les events, comme expliqué dans de nombreux posts. Et la version de SFML à jour. Mes 4 OS se plaignent d'un soft qui ne répond pas au bout de 10s environ de fonctionnement totalement normal du programme.
EDIT :
En écrivant le post j'ai eu une illumination : mon pushState() engendre une bonne 1/4s de parsing xml et autre loading ce qui retarde le traitement des événements. En rajoutant une pompe pour du beurre en haut l'OS ne se plaint plus.
Peut-être serait-il utile de rajouter un paragraphe en rouge là dessus dans les tutoriels sur les events? Ou alors dans la doc de pollEvent?
Ou peut-être que Window::create devrait répondre une première fois à l'OS pour éviter ce genre de cas?
Merci en tout cas à toute l'équipe de développement de SFML qui fait vivre cette alternative OOP à SDL.
Greg
J'ai un programme en SFML que je compile à la fois sous Windows (10) et Linux (Arch,Debian et Ubuntu)
Qui possède une boucle événementielle comme ceci :
mWindow.setActive();
mGameStates.pushState(SharedState(new EngineState()));
while(mWindow.isOpen())
{
sf::Event event;
while(mWindow.pollEvent(event))
{
mGameStates.pushEvent(event);
if(event.type == sf::Event::Resized) //Window resized
{
mGraphicsManager.resize(mWindow.getSize());
}
if(event.type == sf::Event::Closed)
close();
}
mWindow.clear();
updateAndRender();
mWindow.display();
}
return 0;
mGameStates.pushState(SharedState(new EngineState()));
while(mWindow.isOpen())
{
sf::Event event;
while(mWindow.pollEvent(event))
{
mGameStates.pushEvent(event);
if(event.type == sf::Event::Resized) //Window resized
{
mGraphicsManager.resize(mWindow.getSize());
}
if(event.type == sf::Event::Closed)
close();
}
mWindow.clear();
updateAndRender();
mWindow.display();
}
return 0;
Malgré le fait de pomper les events, comme expliqué dans de nombreux posts. Et la version de SFML à jour. Mes 4 OS se plaignent d'un soft qui ne répond pas au bout de 10s environ de fonctionnement totalement normal du programme.
EDIT :
En écrivant le post j'ai eu une illumination : mon pushState() engendre une bonne 1/4s de parsing xml et autre loading ce qui retarde le traitement des événements. En rajoutant une pompe pour du beurre en haut l'OS ne se plaint plus.
mWindow.setActive();
//Pump first events to avoid OS not responding
for(sf::Event e; mWindow.pollEvent(e);){}
mGameStates.pushState(SharedState(new EngineState()));
while(mWindow.isOpen())
{
sf::Event event;
...
//Pump first events to avoid OS not responding
for(sf::Event e; mWindow.pollEvent(e);){}
mGameStates.pushState(SharedState(new EngineState()));
while(mWindow.isOpen())
{
sf::Event event;
...
Peut-être serait-il utile de rajouter un paragraphe en rouge là dessus dans les tutoriels sur les events? Ou alors dans la doc de pollEvent?
Ou peut-être que Window::create devrait répondre une première fois à l'OS pour éviter ce genre de cas?
Merci en tout cas à toute l'équipe de développement de SFML qui fait vivre cette alternative OOP à SDL.
Greg