Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: Deu sex le Février 04, 2014, 10:42:30 am

Titre: Question à propos de la vertical synchronisation
Posté par: Deu sex le Février 04, 2014, 10:42:30 am
Bonjour  :)

Je suis actuellement en train de développer une toute petite application ou je contrôle à la souris un disque représenté par une sf::CircleShape, et plein de sf::CircleShape suivent se disque :) (c'est pour préparer le terrain au steering).

Quand j'ai cette combinaison :

RWindow.setVerticalSyncEnabled(false);
RWindow.setFramerateLimit(60);
 

Mon disque se déplace bien en temps réel par rapport à la souris. Mais si j'ai juste :

RWindow.setVerticalSyncEnabled(true);  // a 60 Hz
//RWindow.setFramerateLimit(60);
 

Je remarque qu'il y a une latence importante entre la position de ma souris et mon disque.
Pour mettre a jour la position de mon disque par rapport à la souris je fais :

float PosAgentX = (float)sf::Mouse::getPosition(RWindow).x;
float PosAgentY = (float)sf::Mouse::getPosition(RWindow).y;

MyAgent.SetPosition(PosAgentX, PosAgentY);
 

MyAgent étant une classe contenant le sf:CircleShape du disque.
Puis je fais un affichage tout ce qu'il y a de plus classique :

RWindow.clear(sf::Color::Black);

RWindow.draw(MyAgent.Circle);

RWindow.display();
 
Titre: Re : Question à propos de la vertical synchronisation
Posté par: Laurent le Février 04, 2014, 10:55:22 am
Qu'est-ce que tu appelles une latence "importante" ? Est-ce que tu as mesuré ton framerate avec la v-sync activée ? Est-ce que tu as testé sur un exemple minimal pour être sûr que ce n'est pas autre chose dans ton programme qui interfère ?
Titre: Re : Question à propos de la vertical synchronisation
Posté par: Deu sex le Février 04, 2014, 11:38:58 am
Un peu comme si tu avais 150 ms dans un jeu en multi. Oui et j'ai bien 60 FPS dans les 2 cas (60-64 dans le cas du framerate limit 60). Effectivement jai un test avec seulement l'agent, son repositionnement et l'affichage. Je peux mettre le code complet (sans les sources des classes bien sur) si tu le souhaite, il n'est pas tres long :)
Titre: Re : Question à propos de la vertical synchronisation
Posté par: Laurent le Février 04, 2014, 01:43:45 pm
C'est bizarre. Surtout si tu es bien à 60 FPS dans les deux cas.
Titre: Re : Question à propos de la vertical synchronisation
Posté par: Deu sex le Février 04, 2014, 02:38:37 pm
Je te passe mon code, j'ai fait un effort pour l’écourter le plus possible, je l'ai teste bien sur :)


#include "librairies.h"
#include "cl_Agent.hpp"


int main(int argc, char* argv[])
{
#ifdef _DEBUG
        sf::RenderWindow RWindow(sf::VideoMode(RESX, RESY), "Steering Seek Behavior", sf::Style::Close | sf::Style::Titlebar);
#else
        sf::RenderWindow RWindow(sf::VideoMode(RESX, RESY), "Steering Seek Behavior", sf::Style::Fullscreen, sf::ContextSettings(24, 8, 8));
#endif
       
        RWindow.setVerticalSyncEnabled(true);
        //RWindow.setFramerateLimit(60);
        RWindow.setMouseCursorVisible(true);
        RWindow.setKeyRepeatEnabled(false);

        sf::Event Event;

        Agent MyAgent;

        while (RWindow.isOpen())
        {
                while (RWindow.pollEvent(Event))
                {
                        switch (Event.type)
                        {
                        case sf::Event::Closed:
                                RWindow.close();
                                break;

                        case sf::Event::KeyPressed:
                                switch (Event.key.code)
                                {
                                case sf::Keyboard::Escape:
                                        RWindow.close();
                                        break;

                                default:
                                        break;
                                }

                        default:
                                break;
                        }
                }

                float PosAgentX = (float)sf::Mouse::getPosition(RWindow).x;
                float PosAgentY = (float)sf::Mouse::getPosition(RWindow).y;
                MyAgent.SetPosition(PosAgentX, PosAgentY);

                RWindow.clear(sf::Color::Black);
                RWindow.draw(MyAgent.Circle);
                RWindow.display();
        }

        return EXIT_SUCCESS;
}
 
Titre: Re : Question à propos de la vertical synchronisation
Posté par: Laurent le Février 04, 2014, 03:35:08 pm
Sans cette classe Agent que l'on ne voit pas, ce serait bien ;) (un simple CircleShape fera l'affaire, non ?)
Titre: Re : Question à propos de la vertical synchronisation
Posté par: Deu sex le Février 04, 2014, 04:21:25 pm
Bien sur :) voila, j'ai même enlevé d'autres choses qui ne servaient pas, j'ai teste et j'ai le même problème.


#include "librairies.h"

int main(int argc, char* argv[])
{
#ifdef _DEBUG
        sf::RenderWindow RWindow(sf::VideoMode(RESX, RESY), "Steering Seek Behavior", sf::Style::Close | sf::Style::Titlebar);
#else
        sf::RenderWindow RWindow(sf::VideoMode(RESX, RESY), "Steering Seek Behavior", sf::Style::Fullscreen, sf::ContextSettings(24, 8, 8));
#endif
       
        RWindow.setVerticalSyncEnabled(true);
        //RWindow.setFramerateLimit(60);
        RWindow.setMouseCursorVisible(true);
        RWindow.setKeyRepeatEnabled(false);

        sf::Event Event;

        sf::CircleShape MyAgent;
        MyAgent.setRadius(RADIUS);
        MyAgent.setOrigin(RADIUS, RADIUS);
        MyAgent.setFillColor(sf::Color::Cyan);
        MyAgent.setOutlineThickness(3);
        MyAgent.setOutlineColor(sf::Color::Red);

        while (RWindow.isOpen())
        {
                while (RWindow.pollEvent(Event))
                {
                        switch (Event.type)
                        {
                        case sf::Event::Closed:
                                RWindow.close();
                                break;

                        case sf::Event::KeyPressed:
                                switch (Event.key.code)
                                {
                                case sf::Keyboard::Escape:
                                        RWindow.close();
                                        break;

                                default:
                                        break;
                                }

                        default:
                                break;
                        }
                }

                float PosAgentX = (float)sf::Mouse::getPosition(RWindow).x;
                float PosAgentY = (float)sf::Mouse::getPosition(RWindow).y;
                MyAgent.setPosition(PosAgentX, PosAgentY);

                RWindow.clear(sf::Color::Black);
                RWindow.draw(MyAgent);
                RWindow.display();
        }

        return EXIT_SUCCESS;
}
 
Titre: Re : Question à propos de la vertical synchronisation
Posté par: Laurent le Février 04, 2014, 08:39:49 pm
Je confirme qu'il n'y a rien de bizarre. Donc... c'est bizarre ;D
Titre: Re : Question à propos de la vertical synchronisation
Posté par: Deu sex le Février 06, 2014, 02:35:53 pm
J'ai remarqué que j'avais également ce genre de problemes sous Leadwerks Engine (un moteur 3D) des que j'active la v-synch, j'ai une latence assez enorme sur les mouvements de la souris, peut etre que c'est que de l'input lag, mais quand meme cest assez fort comme input lag. Vivement la G-Synch...
Titre: Re : Question à propos de la vertical synchronisation
Posté par: Deu sex le Février 06, 2014, 05:30:00 pm
Des news ! quand je met un framerate limiter a 60 FPS depuis nvidia inspector, l'effet de latence est fortement reduit ! un peu comme si sans le framerate limiter, il y avait 'trop' d'images par secondes à traiter pour la vsynch.

Je t'invite a tester mon code tel qu'il est, puis ensuite de mettre le framerate limiter de nvidia inspector à 60 FPS, et observe la difference :)

maj : effectivement, quand je met le framerate limiter de nvidia inspector a 65 fps au lieu de 60, la latence importante reviens, dommage qu'on puisse pas la mettre a 61 fps car a 60, il y a quand meme un peu de stuttering etant donné que ca ossille entre 59 et 61 fps.
Titre: Re : Question à propos de la vertical synchronisation
Posté par: MyPix le Février 17, 2014, 04:45:25 pm
Tu ne ferais pas dans l'endroit ou il y a les draw, ceci ?
Déclare ça en variable globale :
sf::Clock clock;
sf::Time time

et la ou il y a les draw :
time = clock.getElapsedTime();
if(time.asMilliseconds() >= 1000/60)
{
// Tu mets tes draw
clock.restart();
}

Comme ça, peut importe la situation, tu as du 60 Fps sans trop de lag (Je l'utilise dans mon jeu, et j'ai pas de lags ;) )