Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [VSYNC] Framerate instable  (Lu 2935 fois)

0 Membres et 1 Invité sur ce sujet

NuriYuri

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
[VSYNC] Framerate instable
« 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 :
  • sc1.png : Application lancée avec le chipset graphique (défaut) et souffrant du problème de FPS, la fonction display() prend 30ms à s'exécuter au lieu de 16.
  • sc2.png : Application lancée avec la carte graphique (Nvidia Geforce 750M), la fonction clear() dure 16ms alors que ce n'est pas du tout à elle de réaliser l'équilibrage de FPS (conséquence s'il y a des graphismes affichés le framerate descend vu que display() va prendre plus de temps).
  • sc3.png : Application non fermée (donc toujours avec la carte graphique) mais après avoir ouvert le gestionnaire des tâches. Plus de problème de framerate, par contre, je suis le seul parmi mes utilisateurs à pouvoir régler le soucis en ouvrant le gestionnaire des tâches, d'autres c'est en mettant le jeu en fullscreen, d'autres c'est avec le mixeur de volume et d'autres n'ont pas de solutions.
  • sc4.png : Application lancée avec le chipset graphique et youtube d'ouvert dans le navigateur : framerate renvoyé autour de 60FPS mais pas très stable. Fermer youtube a pour conséquence de renvoyer au résultat de sc1.png (c'est pas toujours le cas).

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.

christophedlr

  • Full Member
  • ***
  • Messages: 153
    • Voir le profil
    • E-mail
Re: [VSYNC] Framerate instable
« Réponse #1 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 ?

NuriYuri

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
Re: [VSYNC] Framerate instable
« Réponse #2 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 :)