Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: NuriYuri le Mai 10, 2018, 03:03:38 pm

Titre: [VSYNC] Framerate instable
Posté par: NuriYuri le Mai 10, 2018, 03:03:38 pm
Bonjour, j'utilise SFML pour un de mes projets (liteRGSS) et sous Windows j'ai constaté divers problèmes de framerate dont je ne suis pas le seul à souffrir.

Le VSYNC ne fonctionne pas correctement et seul SFML est affecté par ce soucis (j'ai essayé des applications sous SDL2 et elles n'ont pas de problème). J'ai aussi voulu voir si c'était pas ma programmation qui était foireuse et il s'avère que non, un projet compilé sous VS (au lieu de MinGW) affichant rien souffre du même problème.

Code utilisé :
int main()
{
sf::RenderWindow window(sf::VideoMode(640, 480), "My window", sf::Style::Close | sf::Style::Titlebar);
sf::Clock clk = sf::Clock();
window.setVerticalSyncEnabled(true);

while (window.isOpen())
{
// check all the window's events that were triggered since the last iteration of the loop
sf::Event event;
while (window.pollEvent(event))
{
// "close requested" event: we close the window
if (event.type == sf::Event::Closed)
window.close();
}

// clear the window with black color
clk.restart();
window.clear(sf::Color::Black);
printf("\r%lld", clk.getElapsedTime().asMicroseconds());
clk.restart();
// draw everything here...
// window.draw(...);

// end the current frame
window.display();
printf("\t%lld", clk.getElapsedTime().asMicroseconds());
}

    return 0;
}

Description des screenshot réalisés :

Ce problème est très gênant car le VSYNC est le seul moyen d'avoir un affichage fluide (mon moteur sert à afficher des jeux RPG Like du coup le défilement de la carte doit être le plus fluide possible), en utilisant setFrameLimit() au lieu du VSYNC ça affiche à entre 58 et 61 FPS ce qui est inacceptable au vu du critère de fluidité qui n'est pas respecté (il ne doit pas y avoir d'accouts quand on se déplace).

Note complémentaire : Je suis sur Windows 10 et à jour.
Titre: Re: [VSYNC] Framerate instable
Posté par: christophedlr le Juin 01, 2018, 11:31:30 am
As-tu essayer de ne pas fixer un framerate ? Car le principe du vsync (Vertical Synchronization), c'est de limiter le framerate à celui de l'écran.

En terme de fluidité donc il vaut mieux éviter le vsync, et la limite de FPS car la limite de FPS produit moins de consommation CPU/GPU certes, mais le framerate est plutôt instable pour ce que j'ai constaté sur les jeux depuis quelques temps.

Si le problème se règle par diverses actions en dehors de l'application, cela me fait penser à windows qui pédale dans la semoule.

Est-ce que sur un projet basique (peut d'éléments affichés), tu as le même soucis ?
Titre: Re: [VSYNC] Framerate instable
Posté par: NuriYuri le Juin 01, 2018, 02:30:20 pm
J'ai essayé de ne pas fixer le VSYNC, ça ne pose pas de problèmes de framerate mais avoir une application qui tourne à 1200 FPS c'est ni sympa pour le CPU, ni sympa pour la carte graphique surtout quand c'est sur un PC portable ultra compacte.

Ce que j'ai fait du coup c'est de proposer une alternative permettant d'utiliser setFrameLimit au lieu du VSYNC, après effectivement en terme de fluidité visuelle c'est pas exceptionnel.

Comme sur mes recherches j'ai appris que des personnes désactivaient le VSYNC de leur carte graphique parce que ça provoquerait de l'input LAG (et que je fais un RPG et non un FPS donc inputlag = osef total) j'ai écrit une fonction d'équilibrage qui permet de compenser les instabilités de FPS pour que le jeu ait bien 60 tick par seconde (vu qu'à la base il était codé avec RPG Maker et que toute les animations sont basés sur des tick et non des temps :v).

En gros, si le jeu est lancé sur Chipset Graphique (qui va forcément avoir un problème avec SFML et sortir des frames de 30ms) le jeu exécute plus de tick et si jamais le VSYNC est désactivé par par l'utilisateur, le jeu exécute beaucoup moins de tick. (Si l'option --no-vsync est activée, le jeu essaie de stabiliser les ticks comme le framerate varie entre 58 et 62).

Enfin bref. Mon problème est plus ou moins résolu (ça n'empêche pas que les bugs présentés sont toujours existants, ils ne sont juste plus énormément visible du point de vue de l'utilisateur final).

Note :
J'ai testé avec le jeu qui utilisait les shader etc...
J'ai aussi testé avec une application qui affiche 10000 Sprites, le résultat est le même qu'une application vide.

Je te remercie de ta réponse :)