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

Auteur Sujet: Question à propos de la vertical synchronisation  (Lu 3946 fois)

0 Membres et 4 Invités sur ce sujet

Deu sex

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Question à propos de la vertical synchronisation
« 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();
 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Question à propos de la vertical synchronisation
« Réponse #1 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 ?
Laurent Gomila - SFML developer

Deu sex

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Re : Question à propos de la vertical synchronisation
« Réponse #2 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 :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Question à propos de la vertical synchronisation
« Réponse #3 le: Février 04, 2014, 01:43:45 pm »
C'est bizarre. Surtout si tu es bien à 60 FPS dans les deux cas.
Laurent Gomila - SFML developer

Deu sex

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Re : Question à propos de la vertical synchronisation
« Réponse #4 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;
}
 
« Modifié: Février 04, 2014, 02:40:16 pm par Deu sex »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Question à propos de la vertical synchronisation
« Réponse #5 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 ?)
Laurent Gomila - SFML developer

Deu sex

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Re : Question à propos de la vertical synchronisation
« Réponse #6 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;
}
 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Question à propos de la vertical synchronisation
« Réponse #7 le: Février 04, 2014, 08:39:49 pm »
Je confirme qu'il n'y a rien de bizarre. Donc... c'est bizarre ;D
Laurent Gomila - SFML developer

Deu sex

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Re : Question à propos de la vertical synchronisation
« Réponse #8 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...

Deu sex

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Re : Question à propos de la vertical synchronisation
« Réponse #9 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.
« Modifié: Février 06, 2014, 05:42:09 pm par Deu sex »

MyPix

  • Full Member
  • ***
  • Messages: 117
    • Voir le profil
    • E-mail
Re : Question à propos de la vertical synchronisation
« Réponse #10 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 ;) )