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

Auteur Sujet: [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.  (Lu 17987 fois)

0 Membres et 1 Invité sur ce sujet

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Salut, tout est dans le titre, il faut dire mon projet est assez gros, mais bon en gros ce n'est rien d'autre que le déplacement d'un personnage sur une carte mais entre un serveur et un client. (Le serveur fais les test de collision, le client ne fait rien d'autre que de récupérer la position du personnage et bouger la vue en conséquence, il averti aussi le serveur lorsque le client presse une touche pour avancer...)
Je ne pense pas que ce soit le réseau qui soit lent vu que si je ne déplace pas la vue, les monstres bougent bien, mais, dès que je déplace le personnage et la caméra ça saccade, ça me fait genre un déplacement par seconde.
Bref je ne sais pas si tu veux mon code pour tester..., mais tu devras surement le réadapter car j'utilise aussi une base de donnée ainsi que d'autres librairie. (Qt, gmp et boost.)
Ha oui et aussi les rendertextures ne marchent pas sur les machines qui n'ont pas de carte graphique, pour les ombres ça m'affiche juste une bande noire au milieur de l'écran.
J'ai testé de faire tourner le serveur et le client sur deux machines différentes mais ça saccade toujours de trop, même si ça saccade un peu moins dans ce cas la.
« Modifié: Avril 16, 2013, 10:36:03 am par Lolilolight »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Malheureusement, il n'y a pas une aura magique sur ce forum qui fait que les problèmes du genre "salut j'ai un gros projet, ça marche pas comme je veux, c'est quoi mon problème ?" se résolvent magiquement. On n'est pas des sur-hommes, à ce stade il faut que tu commences à débroussailler, faire plein de tests, avec des morceaux de code beaucoup plus simples, que tu utilises les outils adéquats (debugger, profiler, ...).

C'est comme ça qu'on résoud ce genre de gros problème, pas en postant sur un forum et en attendant magiquement une réponse ;)
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
J'aimerais plutôt savoir si tu connais des outils que je pourrai utiliser pour savoir détecter les causes de ces déplacements saccadés, en gros, les endroits ou c'est lent, bref, je ne sais pas trop si tu vois ce que je veux dire.  :-\

Je n'ai pas de problème de plantges mais quand j'en ai, le débugueur que j'utilise avec code blocks ne me donne pas toujours tout les détails non plus et des fois je me retrouve avec des erreurs du genre !ntdl!LdrxFormatVirtualImage, ou bien des fonctions dont il ne me donne pas les noms, y aurait t'il pas un autre débugueur qui donne des informations plus précise ?
Et je voudrais aussi faire des tests avec le code de la SFML juste histoire de voir sa rapidité.
Désolé pour ce premier message mais j'ai pas mal d'autres choses à faire en ce moment.
Tu me parles de profiler mais c'est quoi exactement ?
« Modifié: Avril 16, 2013, 03:16:24 pm par Lolilolight »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
La première chose à faire, c'est de limiter la quantité de code à tester/vérifier. Quand tout à coup quelque chose ne marche pas dans un gros projet, et qu'on ne sait pas d'où ça vient, il faut réduire le champ d'investigation sinon on peut passer des heures voire des journées, et pas toujours sur le bon morceau de code.

Donc soit tu désactives un max de truc, si ton application le permet, soit tu prends un projet tout neuf et tu essayes de reproduire ton problème en repartant de zéro. Ca demande un peu de boulot, mais une fois que tu as fini tu ne peux que tomber sur la cause du problème.

Vu que c'est le déplacement de la caméra qui semble poser problème, concentre toi sur cette partie. Reproduis le même mouvement dans une petite application, mais sans tout ce qu'il y a autour.

Citer
Je n'ai pas de problème de plantges mais quand j'en ai, le débugueur que j'utilise avec code blocks ne me donne pas toujours tout les détails non plus et des fois je me retrouve avec des erreurs du genre !ntdl!LdrxFormatVirtualImage, ou bien des fonctions dont il ne me donne pas les noms, y aurait t'il pas un autre débugueur qui donne des informations plus précise ?
Ce n'est pas un problème de debugger, mais d'utilisateur ;)
Il faut apprendre à interpréter les informations du debugger, à le diriger au bon endroit et à lui faire sortir les infos intéressantes. Par exemple, quand il crash dans la fonction LdrxFormatVirtualImage de ntdl.dll, ce n'est que le tout dernier appel. Il faut afficher la pile d'appels pour voir la suite d'appels qui ont mené à celui-ci ; à force de remonter dans les appels tu vas retomber dans tes fonctions.

Citer
Tu me parles de profiler mais c'est quoi exactement ?
Un profiler est un outil qui t'indique combien de temps prend chaque fonction ou morceau de code. Ca sert à identifier les goulets d'étranglements dans une application trop lente.
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Ok bah je vais essayer de faire un projet plus simple avec juste un déplacement de la caméra et voir avec un profiler ce qui ralenti mon application.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Le profiler ne sera sans doute pas nécessaire dans ton cas, essaye déjà sans ;)
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Oui, j'ai essayer sans, en commentant du code et le problème vient plutôt des transferts réseau qui sont lent..., bref, peut être que ma machine manque de capacité pour un serveur réel de mmorpg, faudrait que je me renseigne quelle est la capacité des serveurs du genre dofus.


Déja pour charger la map ça prend longtemps.
(Au passage si quelqu'un à une réponse.)
« Modifié: Avril 18, 2013, 10:29:43 am par Lolilolight »

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Bon j'ai fais des tests plusieurs techniques avec et sans transferts réseau, mais quoi que je fasse c'est toujours aussi lent, même en affichant juste une liste de tile (sans déplacer la vue et sans passer par le réseau.), donc juste avec un QSMLCanvas, je me retrouve avec un taux de rafraichissement qui varie de 0.00xx millisecondes à 3.5 secondes la plupart du temps, voir plus, donc avec un framerate de 0 la plupart du temps, pour ça que ça saccade comme ça...
Que j'exécute le serveur ou le client sur la même machine ou sur 2 machines différente, cela ne vas pas mieux...
Bref je n'ai pas trop le choix, soit je cherche et test avec plusieurs librairies de plus bas niveau pour voir si c'est toujours aussi lent ou bien je repasse en java ou la je n'avais pas de soucis de lenteur...

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Bon j'ai essayer, sur 2 machines différentes pour ne pas avoir les threads du serveurs et le client qui tournent sur la même machine, j'ai désactivé aussi les transferts réseaux pour le déplacement de la vue, mon thread pour les animations, les renderTextures pour l'affichage des ombres ce qui me faisais ralentir mon application encore plus en laissant juste un thread qui fait tourner le client et un affichage des sprites qui sont statique, je me retrouve toujours avec un déplacement saccadé et la vue qui bouge comme si ça faisait plusieurs tours de boucle dans ma fonction update avant de se déplacer et je me retrouve avec un FPS qui chute petit à petit a 1 quand je laisse la touche enfoncée pour me déplacer et qui revient à 60 quand je ne me déplace plus ce que je ne trouve pas normal.
Mon algorithme pour récupérer ce qui est visible à l'écran est linéaire, donc rapide, c'est juste une boucle qui récupère toutes les tiles qui sont affichable à l'écran à l'aide d'une formule et ajoute tout cela dans un vecteur, donc, je ne pense pas que le problème vient de là.
Sa fait comme si Qt et la SFML travaillaient indépendamment, la vue ne se déplace pas à chaque tour de boucle comme ça le devrait.
Je ne sais pas si quelqu'un à réussi à trouver une solution à ce problème, si oui, qu'il m'en fasse part, se serait sympa.

PS : j'ai test sur plusieurs machine, une avec carte graphique, une autre avec chipset intel, même problème, mon OS c'est window 7 et ma carte graphique ATI Radeon hd 5470 et j'ai bien mis à jouer mes driver sur le site du constructeur.

Mais la SFML consomme trop de ressource et parfois même j'ai mon PC qui se met en hinernation tout seul. (Bref, je dis la SFML, mais ça peut être aussi le c++ 2011 ou bien QT ou peut être même les 3, il faut que je fasse des tests en utilisant chacune de ses librairies indépendamment, remplacer les threads par ceux de std::bind, etc...)
« Modifié: Avril 26, 2013, 01:04:31 pm par Lolilolight »

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Bon je pense savoir d'où ça vient, j'ai appris il y n'a pas longtemps que ubuntu serveur consomme beaucoup de ressources, donc, dans les librairies opensource (orienté réseau et threading.) il y en a surement qui consomment beaucoup de ressources.
Je vais essayer de faire tout rien que avec Qt et openGL, on verra ce que ça donne. :)
Donc je vais laisser un peu tomber ce forum pour l'instant, et plutôt aller voir du côté des autres librairies.


Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
J'ai trouvé! :)
Dans le contruteur de qsfmlcanvas le problème c'est que par défaut dans ton tutoriel tu initialises la variables frameTime a 0 du coup, je l'ai changé, j'ai mis 60 et là ça ne saccade plus. :)
Bref il faudrait que tu change un peu ton tutoriel. ^^

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Mais par contre quand je rajoute le réseau et les threads ça saccade toujours et ça consomme toujours autant de ressources. :/

lepiaff

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
    • E-mail
Salut, moi j'aimerais savoir comment tu utilise sfml et qt ensemble ...
En plus tu utilise code::blocks? J'apprécierais une petite explication car c'est ce que je voudrais faire mais franchement rien à faire même avec le tuto.

EDIT : Ok, trop simple à faire sous code::blocks et ça marche de suite. Moi j'essayais sous QtCreator et impossible d'y arriver avec le même code... Ça m'arrange donc merci.
« Modifié: Avril 27, 2013, 05:16:20 pm par lepiaff »

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Bah en fait je crois que avec une valeur de 0 pour le taux de rafraichissement, ça faisais tourner mon processeur à fond, et donc, me bouffais toutes lers perfs, ici j'ai bien un FPS de 60 quand la caméra ne bouge pas, mais, quand je veux la faire bouger en rajoutant le réseau et les threads pour animer mon personnage, ça recommence à saccader et je me retrouve avec un FPS de 0. :/

Je ne sais pas trop ce que je vais faire, il faudrait que j'essaye avec d'autres librairies pour les threads, le réseau et peut être aussi pour le graphisme en utilisant Qt directement avec opengl pour voir si le résultat est toujours le même ou bien si c'est plus rapide qu'avec la SFML..., donc, il va encore falloir changer mon code.
Mais bon ça finira bien par tourner.
« Modifié: Avril 28, 2013, 05:55:54 pm par Lolilolight »

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Bon j'ai trouvé! (Enfin.)
C'était ma fonction qui cherchais les tiles visible à l'écran qui ralentissait tout.
Du coup je l'ai optimisée et j'ai mis un sf::clock pour qu'elle ne s'exécute que toute les 0.1 secondes, du coup, ça ne saccade plus.
C'est une fonction fort lente en effet, de plus, je n'ai pas pu faire comme quelqu'un qui m'a montré, car lui, (Grégouar.) n'utilisais pas de coordonnée négatives, du coup, au lieu de faire un vecteur de Tile a 3 dimension (coordonnée x, coordonnée y, profondeur.), j'ai du faire un autre système de grille en forme de losange, de plus, j'en ai besoin pour faire mon système de collision.
Et bon dans ma fonction je récupérais les coordonnées des polygônes, pour x et y allant de la position initiale à la position finale de la vue, et je comparé ce polygone a toutes mes cases pour voir si il était visible ou pas.
J'ai fais beaucoup plus simple en faisant simplement un test pour voir si le polygône est dans le rectangle de la caméra.
Mea culpa.