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

Auteur Sujet: Comment s'assurer que la vitesse de mon jeu reste la même avec vsync ?  (Lu 3165 fois)

0 Membres et 2 Invités sur ce sujet

SmallPhil

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Bonjour, j'essaie de réduire le screen tearing dans mon jeu en activant la vsync, mais d'après ce que je comprends, le fps ne sera pas le même sur un moniteur avec un taux de rafraichissement différent du mien.

Est-ce vrai ? Si oui, comment s'assurer que la vitesse reste la même sur différents moniteurs, sans avoir à déplacer chaque objets selon le temps écoulé depuis la dernière frame ? (ce qui rendrait mon code plus difficile à lire...)



G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Comment s'assurer que la vitesse de mon jeu reste la même avec vsync ?
« Réponse #1 le: Février 20, 2016, 10:28:30 pm »
C'est impossible d'avoir un framerate identique tout le temps chez n'importe qui. Un PC moins puissant, un passage du jeu un peu plus gourmand, un autre programme qui s'active et prend des ressources, etc. et hop c'est la chute de FPS.

SmallPhil

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : Comment s'assurer que la vitesse de mon jeu reste la même avec vsync ?
« Réponse #2 le: Février 20, 2016, 11:25:36 pm »
Oui, ça je suis au courant  ;)

Ce que je voudrais faire, c'est faire en sorte que mon jeu ne roule pas plus vite sur un moniteur de 120Hz que sur un de 60Hz. Je crois (c'est ce que j'ai lu, mais je ne peux pas le tester), que vsync fait en sorte que le framerate est le même que celui de l'écran.

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Comment s'assurer que la vitesse de mon jeu reste la même avec vsync ?
« Réponse #3 le: Février 21, 2016, 07:25:37 am »
Etant donné que le framerate n'est pas fixe et que tu veux que le jeu tourne à la même vitesse quelque soit le framerate tu ne peux pas te passer de faire des calculs en fonction du temps écoulé depuis la dernière frame.

Tu peux faire l'update des positions (etc.) un certain nombre de fois suivant le temps écoulé depuis la dernière frame. (si tu choisis temps c'est 5ms et que ta frame dure 15 secondes, tu vas faire l'update 3 fois, si ta frame dure 2 secondes tu vas faire l'update 1 fois toutes les 2 ou 3 frames)
Plus d'infos sur cet article de gafferongames, c'est un classique indémodable.

SmallPhil

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : Comment s'assurer que la vitesse de mon jeu reste la même avec vsync ?
« Réponse #4 le: Février 21, 2016, 05:05:35 pm »
J'ai essayé de l'implémenter sans la dernière partie avec la prévision de la position pour le temps qu'il reste. Cela marche pour garder la même vitesse malgré le framerate, mais il reste du screen tearing...

#include <SFML/Graphics.hpp>

#include <iostream>
using namespace std;

int main()
{
        sf::RenderWindow window(sf::VideoMode(640, 480), "Framerate test");
        window.setVerticalSyncEnabled(true);

        sf::RectangleShape shape(sf::Vector2f(32, 32));
        sf::RectangleShape shape2(sf::Vector2f(32, 32));

        int a = 0;

        sf::Clock clock;
        double previous = clock.getElapsedTime().asSeconds();
        double lag = 0.0;

        while (window.isOpen()) {
                double current = clock.getElapsedTime().asSeconds();
                double elapsed = current - previous;
                previous = current;
                lag += elapsed;

                sf::Event event;
                while (window.pollEvent(event)) {
                        if (event.type == sf::Event::Closed) { window.close(); }
                }

                while (lag >= (1.0 / 60.0)) {
                        shape.setPosition(320 + sin(0.05*a) * 250, 240 + sin(0.1*a) * 50);
                        shape2.setPosition(320 + -sin(0.05*a) * 250, 120 + sin(0.1*a) * 50);
                        a++;
                        lag -= (1.0 / 60.0);
                }

                window.clear();
                window.draw(shape);
                window.draw(shape2);
                window.display();
        }

        return 0;
}
 

J'imagine que la seule façon de l'empêcher est de faire un calcul pour chaque objet en l'affichant ? Ça semble un peu compliqué...

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Comment s'assurer que la vitesse de mon jeu reste la même avec vsync ?
« Réponse #5 le: Février 21, 2016, 10:47:47 pm »
Bah le screen tearing ça apparait quand ta fréquence d'affichage du jeu colle pas parfaitement avec la fréquence d'affichage de ton écran.
Si t'as activé la vsync je crois pas que tu puisses faire quelque chose de plus. ;)

SmallPhil

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : Comment s'assurer que la vitesse de mon jeu reste la même avec vsync ?
« Réponse #6 le: Février 21, 2016, 11:03:44 pm »
Les mouvements sont encore très saccadés par moments (malgré, l'extrapolation de la position). Je crois que je vais simplement limiter le framerate à 60 fps, car ça ma l'air moins pire...

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Comment s'assurer que la vitesse de mon jeu reste la même avec vsync ?
« Réponse #7 le: Février 22, 2016, 12:28:07 am »
Pourquoi tu n'utilises pas le deltatime en désactivant la vsync ?
ta vitesse serais constante partout.

...
sf::Time dt = deltaClock.Restart();
pos.x += speed * dt.asSeconds();
pos.y += speed * dt.asSeconds();
...

SmallPhil

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : Comment s'assurer que la vitesse de mon jeu reste la même avec vsync ?
« Réponse #8 le: Février 22, 2016, 01:17:03 am »
1. Il faudrait que chaque partie du code qui dépend du temps ou d'un nombre de frames passées soit modifée pour utiliser la variable deltatime. (toutes les animations, les systèmes de spawn d'objets, les déplacements de sprites, etc.)

2. Cela briserait probablement le système de physique quand le framerate est trop bas.