-
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();
-
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 ?
-
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 :)
-
C'est bizarre. Surtout si tu es bien à 60 FPS dans les deux cas.
-
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;
}
-
Sans cette classe Agent que l'on ne voit pas, ce serait bien ;) (un simple CircleShape fera l'affaire, non ?)
-
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;
}
-
Je confirme qu'il n'y a rien de bizarre. Donc... c'est bizarre ;D
-
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...
-
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.
-
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 ;) )