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

Auteur Sujet: Saccade lors de mouvements lents avec des sprites  (Lu 3670 fois)

0 Membres et 1 Invité sur ce sujet

Kokoba

  • Newbie
  • *
  • Messages: 5
  • "Yippee Ki Yay, motherfucker" - John McClane
    • Voir le profil
Saccade lors de mouvements lents avec des sprites
« le: Décembre 14, 2018, 07:08:45 pm »
Bonjour,

J'ai un petit souci que je n'arrive pas à m'expliquer après pas mal de tentative de debug.
Lorsque j'essaye de faire bouger un sprite de maniere assez lente (0.05 pixel/frame à 60Hz), le sprite descend de façon saccadé, voyez plutôt:


Je pensais que mon code été en cause, mais lorsque je remplace le sprite par un shape circle, ça me semble beaucoup plus fluide:


(N'hésitez pas a afficher l'image en grand et à zoomer pour voir la différence).

J'ai essayé de me déplacer en fonction du temps écouler entre deux frames, ou en ajoutant 0.05 "en dur" à chaque frame, même résultat.

Est-ce que ce problème vous dit quelque chose? Malgré mes recherches je n'ai rien trouver..

Je posterai bien du code, mais j'ai encapsulé la SFML, j'ai des calculs par rapport au parent de l'objet (c'est un mini moteur de jeu), donc je ne suis pas sûr ce que soit très concluant. J'ai vérifié en tout cas, au niveau du setPosition du sf::sprite, les valeurs sont bien en float, et elle augmente bien de 0.05 à chaque appel.

N'hésitez pas à demander ce que j'aurai pu oublier de mentionner et qui pourrait vous aider à y voir plus clair !

Edit: Je suis en SFML 2.4, en C++.

Merci d'avance  ;D
« Modifié: Décembre 14, 2018, 07:10:24 pm par Kokoba »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: Saccade lors de mouvements lents avec des sprites
« Réponse #1 le: Décembre 14, 2018, 07:17:15 pm »
Les saccades correspondent aux pixels : à 0.05 par frame et 60 frames par seconde, ça fait 3 pixels par seconde, ce qu'on constate sur ton gif. Jusque là tout est normal. Ce qu'il faudrait pour adoucir le mouvement c'est une interpolation de texels (pour que les positions intermédiaires entre deux pixels soient moyennées), et il me semble que c'est Texture::setSmooth (true) qui a un effet sur ça.
Laurent Gomila - SFML developer

Kokoba

  • Newbie
  • *
  • Messages: 5
  • "Yippee Ki Yay, motherfucker" - John McClane
    • Voir le profil
Re: Saccade lors de mouvements lents avec des sprites
« Réponse #2 le: Décembre 14, 2018, 07:26:30 pm »
Bonsoir,

Merci de ta réponse, et en effet, avec l'appel de cette méthode, c'est beaucoup plus fluide !

Par contre, autour du sprite, il y a comme une "ombre", et celle-ci clignote à chaque déplacement, c'est possible d'éviter ce phénomène?

Aussi quand tu parles d'interpolation de texels, est-ce que l'impact sur les performances est conséquent?

Encore merci!  :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: Saccade lors de mouvements lents avec des sprites
« Réponse #3 le: Décembre 15, 2018, 08:48:17 am »
Citer
Par contre, autour du sprite, il y a comme une "ombre", et celle-ci clignote à chaque déplacement, c'est possible d'éviter ce phénomène?
C'est le résultat de l'interpolation. C'est ce qui rend le mouvement plus fluide. Après il faudrait voir le résultat, car normalement ce n'est pas censé être si gênant.

Citer
Aussi quand tu parles d'interpolation de texels, est-ce que l'impact sur les performances est conséquent?
Aucun, c'est une fonction très basique des cartes graphiques.
Laurent Gomila - SFML developer

Kokoba

  • Newbie
  • *
  • Messages: 5
  • "Yippee Ki Yay, motherfucker" - John McClane
    • Voir le profil
Re: Saccade lors de mouvements lents avec des sprites
« Réponse #4 le: Décembre 16, 2018, 12:54:50 pm »
Bonjour Laurent,

Merci encore une fois de ta réponse rapide, et de tes explications !

J'ai changé le sprite pour un prendre un avec un détourage plus net, ça à permit de réduire l'effet d'ombre, par contre le scintillement n'a pas disparu, j'ai l'impression que ça fait comme un effet de balayage.

J'aimerai bien pouvoir te montrer à quoi ça ressemble, mais j'ai essayé de l'exporter en gif comme pour les précédente, sauf que la compression fait que ce dont je parle est à peine visible.

J'ai donc pris un autre sprite (avec un détourage correct) pour que tu vois mieux l'effet dont je parle:


Est-ce que tu vois bien ce dont je veux parler? Aurais-tu une idée de ce dont il s'agit?
J'ai l'impression que c'est lié (entre autre) au fait que les bords du sprites soit semi-transparent.

Merci d'avance :) !

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: Saccade lors de mouvements lents avec des sprites
« Réponse #5 le: Décembre 16, 2018, 02:25:45 pm »
L'interpolation mélange les pixels, tu as donc les pixels adjacents aux bords qui "bavent" dans ce cas. Il faut donc bien préparer son image.
Laurent Gomila - SFML developer

Kokoba

  • Newbie
  • *
  • Messages: 5
  • "Yippee Ki Yay, motherfucker" - John McClane
    • Voir le profil
Re: Saccade lors de mouvements lents avec des sprites
« Réponse #6 le: Décembre 16, 2018, 07:06:43 pm »
Je comprend bien le principe de l'interpolation. Mais est-ce que le fait que des pixels ne soit pas 100% opaque peut poser probleme?

Je m'explique, voici le résultat de l'interpolation:

On y voit clairement des pixels sombres (noirs?)

Voici le sprite d'origine, tiré de l'image et affiché sur un fond blanc:


Il n'y à pas cette bordure sombre autour.

Qu'est-ce que tu en penses?

Encore merci,
Kokoba

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: Saccade lors de mouvements lents avec des sprites
« Réponse #7 le: Décembre 16, 2018, 07:48:47 pm »
Il faudrait voir l'image d'origine, pas un truc retrafiqué ;)

Mais bon je peux déjà te dire ce qui se passe : dans l'image d'origine, les zones transparentes sont très probablement noires (la transparence c'est juste une valeur du canal alpha, il y a quand même une couleur avec), donc ça produit le contour sombre avec l'interpolation.
Laurent Gomila - SFML developer

Kokoba

  • Newbie
  • *
  • Messages: 5
  • "Yippee Ki Yay, motherfucker" - John McClane
    • Voir le profil
Re: Saccade lors de mouvements lents avec des sprites
« Réponse #8 le: Décembre 16, 2018, 08:29:27 pm »
Clairement je ne m'étais pas posé la question de la couleur des pixels transparent..

J'ai édité mon image avec Gimp en colorant en blanc tout ce qui était transparent avant de re-selectionner la zone en adoucissant les bords. Puis j'ai re-supprimé la sélection, relancé mon soft, et la miracle! C'est fluide, et le contour sombre à disparu !

Merci de tes réponses très rapides, félicitations pour cette superbe lib, et encore bravo de la connaitre comme ça sur le bout des doigts !

Sans doute à bientôt pour d'autres questions ! :P

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: Saccade lors de mouvements lents avec des sprites
« Réponse #9 le: Décembre 16, 2018, 08:43:42 pm »
Content que tu aies pu résoudre ton problème à 100% :)
Laurent Gomila - SFML developer