Forum de la communauté SFML

Aide => Général => Discussion démarrée par: Lolilolight le Avril 16, 2013, 10:32:47 am

Titre: [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Avril 16, 2013, 10:32:47 am
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.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Laurent le Avril 16, 2013, 10:49:34 am
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 ;)
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Avril 16, 2013, 03:14:40 pm
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 ?
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Laurent le Avril 16, 2013, 04:13:47 pm
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.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Avril 16, 2013, 05:39:35 pm
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.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Laurent le Avril 16, 2013, 06:55:17 pm
Le profiler ne sera sans doute pas nécessaire dans ton cas, essaye déjà sans ;)
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Avril 18, 2013, 10:28:02 am
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.)
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Avril 25, 2013, 03:26:03 pm
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...
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Avril 26, 2013, 12:59:11 pm
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...)
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Avril 27, 2013, 01:39:13 pm
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.

Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Avril 27, 2013, 02:29:43 pm
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. ^^
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Avril 27, 2013, 04:02:51 pm
Mais par contre quand je rajoute le réseau et les threads ça saccade toujours et ça consomme toujours autant de ressources. :/
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: lepiaff le Avril 27, 2013, 04:22:25 pm
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.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Avril 28, 2013, 05:53:43 pm
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.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Avril 29, 2013, 03:13:52 pm
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.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Laurent le Avril 29, 2013, 03:16:27 pm
Finalement je reviens sur ce que j'ai dit, un profiler t'aurait permis de mettre le doigt immédiatement sur le morceau de code "lent", sans que tu aies à pratiquer toute sorte de tests plus ou moins fastidieux.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Avril 29, 2013, 08:35:41 pm
Bah en fait je l'ai vu en utilisant le profiler. :)
Pratique ce truc!
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Laurent le Avril 29, 2013, 08:59:49 pm
Ah ! Ok, impec alors :P
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Avril 30, 2013, 01:48:50 pm
Oui mais seulement ce n'est pas tout, j'ai du aussi faire un thread qui remet à jour toute la scène toute les x millisecondes, et quand je partage le travail entre plusieurs thread c'est fluide!

J'ai dû faire aussi pareil pour le réseau pour ne pas surcharger le serveur de requêtes.
J'ai du également utiliser les mutex, sinon je me retrouvais avec un écran qui clignotais ça sa se remettais à jour pendant que a faisait les calculs.

Mais j'ai un autre problème maintenant que je vais citer dans un autre post.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Mai 03, 2013, 06:49:30 pm
J'ai passé mon éditeur en SFML2.0, et j'ai eu le même problème donc j'ai du optimiser et j'ai trouvé un algorithme beaucoup mieux encore, c'est le même que celui de Grégouar mais en plus compliqué car vu que il y a aussi des indices négatifs et que je ne peux pas faire de vecteurs avec des coordonnées négatives, et en plus je n'utilise qu'un vecteur à une dimension donc j'ai du décaler les éléments en tenant compte de la tile ayant la coordonnée la plus petite en x et en y, et faire à chaque fois un décalage si ça me donne un indice négatif. (Donc décalage d'indice + redimentionnement de vecteur.)
Mais bon j'ai réussi et c'est très optimal donc je suis content.
Je ne sais pas ou j'ai du avoir la tête quand j'ai codé mon 1ère algorithme mais pas sur les épaule en tout cas.  :-\

Je pourrai faire la même chose en supprimant des tiles pour pas me retrouver avec un vecteur trop grand si je supprime trop de tiles mais se sera pour après..., c'est déjà pas mal hardcore mais je suis fier car j'ai réussi à améliorer un algorithme qu'on m'avait montré. (pour une fois.) u_u
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Mai 05, 2013, 06:43:59 pm
Bon voila j'ai fais les choses suivantes :

-J'ai optimisé mon algorithme au mieux pour récupérer toutes les entités visibles à l'écran.
-J'ai effectué une approximation pour la position du personnage entre les temps de transferts réseau pour essayer d'avoir un mouvement plus fluide.
-J'appelle toutes les fonctions qui remettent à jour la scène dans un thread.

Malgré tout ça saccade encore un petit peu. (Je posterai une vidéo avec le framerate quand j'aurai plus de temps car en ce moment j'ai pas mal de boulot à l'extérieur.)

Il me semble que la SFML 2.0 est un peu plus lente. (Depuis que j'ai passé mon éditeur en SFML 2.0 j'ai du aussi optimiser l'algorithme hors que ça ne saccadais pas autant avec la SFML 1.6, cependant avec la SFML 1.6 ça ne tournais carrément plus sous windows.)
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Mai 06, 2013, 11:53:10 am
Voila ce que ça donne en ayant testé tout les modules de la SFML. (Graphisme, Qt, les threads, le réseau, couplage avec Qt, etc...)
http://www.youtube.com/watch?v=Er5F6s8q_Qc&feature=youtu.be (http://www.youtube.com/watch?v=Er5F6s8q_Qc&feature=youtu.be)
Je pense que je vais repasser à du mono maintenant que j'ai optimisé mon algorithme pour la mise à jour de la scène car là j'ai l'impression que ça ne marche pas très bien parfois il ne change pas les tiles pour mes animation du coup les jambes du perso test que j'ai fait ne bougent pas quand il avance.
C'est sans doute dû aux appel à lock et unlock sur le mutex, bref...
Mais bon on voit que ça saccade toujours un peu et j'ai fait une petite map exprès pour qu'il y ai justement moins d'éléments à afficher.
Et je n'ai pas encore rajouter les monstres.
Mais j'ai l'impression que la SFML 2.0 est quand même un peu plus lente que la SFML 1.6 car ça saccadais moins en 1.6...
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Eroy le Mai 06, 2013, 12:01:06 pm
"les render textures ne..."
Tu utilises des RenderTextures ?
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Laurent le Mai 06, 2013, 12:07:43 pm
Citer
Mais j'ai l'impression que la SFML 2.0 est quand même un peu plus lente que la SFML 1.6 car ça saccadais moins en 1.6...
Sur un code complètement équivalent, peut-être un tout petit peu (mais ce n'est pas significatif). Mais comme SFML 2 propose des solutions bien plus optimisées (vertex array) pour les cas à problème, en fin de compte si tu as des performances moindres c'est que ton approche est mauvaise.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Mai 06, 2013, 12:12:07 pm
Bon je suis passé en monothread et le résultat est +/- le même mais j'ai quand même un FPS déja un peu + élevé, mais toujours en dessous de 60 qui est la valeur de la synchro verticale.
Et oui j'utilise des rendertextures pour les ombres...

La seule chose que je n'ai pas encore testé mais ça se sera pour quand le projet sera fini, c'est le son.
PS : heu, Laurent : je n'utilise pas les VertexArray, à part pour les lumières mais ici je n'en ai pas mise.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Eroy le Mai 06, 2013, 12:49:11 pm
Fais attention aux rendertexture, on peut pas vraiment les utiliser en dynamique car ça pompe autant qu'un display principal. Essaie de le virer voir si ça règle pas tes problèmes. ^^

Le mieux c'est que tu regardes les temps d'exécution morceau par morceau de ce qui est executé à chaque frame pour savoir ce qui est lent, c'est le seul moyen de trouver d'où viens le problème.

Et en multithread tu as obligatoirement des fps moins important cela ne rime pas avec les perfs.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Mai 06, 2013, 12:55:56 pm
Ok, ok, il me semble aussi que les renderTexture bouffent pas mal, de toute façon il va falloir que j'utilise autre chose que les RenderTextures mais je ne sais pas trop quoi, en SFML 1.6 j'utilisais la fonction pour faire des captures d'écrans dans laquelle je dessinais les ombres et je dessinais par dessus la scène avec le blending.
Il va falloir que je repasse à ça je pense car, les renderTextures ne marchent pas avec les machines qui n'ont pas de carte graphique et je veux que ça marche sur le plus de PC possible.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Laurent le Mai 06, 2013, 01:15:13 pm
Plusieurs choses à clarifier.

1. sf::RenderTexture n'est pas plus lent que sf::RenderWindow, en fait ils utilisent tous deux exactement le même code pour le dessin. Ce qui peut être lent, c'est de passer de l'un à l'autre, car il faut changer de contexte OpenGL. Mais ce n'est pas inhérent à sf::RenderTexture, ça ferait la même chose avec deux sf::RenderWindow utilisées en alternance par exemple. Bref, dire que "les sf::RenderTexture ça bouffe pas mal", c'est un peu trop approximatif.

2. sf::RenderTexture fonctionne en théorie sur toutes les configurations ; les GPUs qui ne supportent pas l'implémentation "moderne" ont une implémentation de secours, un peu plus lente, mais qui marche partout. Et normalement les plus gros bugs, notamment avec les cartes Intel intégrées, ont tous été résolus. Donc si tu as des problèmes à ce niveau il faut me le dire, pas juste se contenter de clamer que "sf::RenderTexture ne marche pas sur certains GPUs" ;)

3. La capture d'écran est toujours dispo avec SFML 2, et elle est bien plus lente que sf::RenderTexture, car elle nécessite des transferts du GPU vers le CPU, qui est un sens à éviter à tout prix car les cartes graphiques ne sont pas optimisées pour.

De manière générale, à moins que ce ne soit officiellement dit (dans les tutos, le bug tracker, ou par moi), faites des tests rigoureux avant de vous baser sur des affirmations approximatives.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Eroy le Mai 06, 2013, 02:00:49 pm
Non mais là le soucis c'est que à tout les coups il fait un getTexture sur son renderTexture pour aller ensuite le passer à son render principal (c'est tentant, j'ai aussi essayé au début x3). Et c'est de ce problème que je parle en disant "utilisation dynamique".
Ptetre le préciser dans la doc : "ne fais pas ça noob !", enfin ça l'est peut-être déjà. :p
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Laurent le Mai 06, 2013, 02:16:51 pm
Citer
Non mais là le soucis c'est que à tout les coups il fait un getTexture sur son renderTexture pour aller ensuite le passer à son render principal
Et ? Le but de dessiner sur une texture c'est justement d'utiliser cette texture par la suite, pour dessiner sur une autre cible de rendu, non ? Donc quel est le souci au juste ?
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Eroy le Mai 06, 2013, 02:17:36 pm
il doit le faire à chaque frame.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Laurent le Mai 06, 2013, 02:32:47 pm
Il doit faire quoi à chaque frame ?
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Eroy le Mai 06, 2013, 02:36:27 pm
Ben s'il gère les ombres il a pu être tenté de déplacer les ombres des persos sur son render ce qui l'oblige à récupérer la texture au moins à chaque foi que quelque chose se déplace.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Laurent le Mai 06, 2013, 02:40:48 pm
Citation de: SFML/Graphics/RenderTexture.cpp
const Texture& RenderTexture::getTexture() const
{
    return m_texture;
}

Ce code extrêmement simple a deux implications :
- tu peux appeler cette fonction autant que tu veux sans impacter les performances
- ce n'est même pas la peine de rappeler cette fonction après que le contenu de la texture a changé, l'instance de sf::Texture qui est renvoyée est toujours la même, seuls les pixels ont changé

Ce qui prend du temps c'est le dessin en lui-même, en dehors de ça sf::RenderTexture ne fait rien de coûteux de plus que sf::RenderWindow. Une fois que tu as dessiné quelque chose, ça y est c'est sur la texture et prêt à être utilisé.

Histoire de remettre une petite couche : sf::RenderTexture et sf::RenderWindow sont strictement identiques, la seule chose qui change c'est que l'une va écrire des pixels sur une texture, et l'autre sur une fenêtre. Il n'y a donc rien de mystique dans sf::RenderTexture qui la rendrait plus lourde à utiliser.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Eroy le Mai 06, 2013, 02:47:49 pm
Oui je le sais bien je me suis mal exprimé.

Ce que je veux dire c'est que si on ne sais pas que dessiné est lourd ou juste qu'on débute avec la sfml (ce qui était mon cas quand j'ai rencontré le problème) on peut être tenté de faire :

- je crée x renderTextures (personnages, décores, eau, ombres, lumières...)
- je déplace mes éléments graphiques dessus
- à chaque frame je rafraichi mes renders pour qu'ils prennent en compte les nouvelles positions
- à chaque frame je récupère donc les nouvelle textures
- et à chaque frame je redessine le renderTarget principal avec mes nouvelles textures.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Laurent le Mai 06, 2013, 02:52:14 pm
Pourquoi passer par X textures de rendu intermédiaires ? Je veux dire, qu'est-ce qui t'avait fait pensé que c'était ça qu'il fallait faire ?
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Eroy le Mai 06, 2013, 03:01:25 pm
Et bien, comme tu l'as constaté les vues ne sont pas forcément évidentes à comprendre dans un premier temps (bien qu'elles deviennent indispensable par la suite x)) alors quand on tombe au début sur le renderTexture on se dit "hey mais attends, voilà ce que je cherchais ! et en plus ça marche nickel !".

Je pense que c'est la principale explication. Le fait que la renderTexture est une notion de conteneur simplifie la compréhension fasse à la vue qui est simplement liée aux objets. S'il y avait une classe toute simple "objets graphiques + vue" personne aurait de soucis avec les vues. Enfin c'est une supposition.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Laurent le Mai 06, 2013, 03:04:41 pm
Ok je vois. J'espère que maintenant, avec les tutoriels à jour, ce genre de mauvaise interprétation pourra mieux être évitée.

Citer
S'il y avait une classe toute simple "objets graphiques + vue" personne aurait de soucis avec les vues.
C'est sans doute vrai. Mais là on toucherait à des trucs déjà un peu trop haut niveau pour SFML.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Eroy le Mai 06, 2013, 03:12:12 pm
Oui, ça impliquerait d'associé des drawable+transformable et ajouter un draw de cet objet à renderTarget, ce qui est plutôt le rôle d'une sur-couche (moteur ou framework) surtout à cause de la notion d'inclusions récursives qui peut nuire aux bonnes pratiques dans certains framework.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Mai 06, 2013, 06:22:47 pm
Bah moi, ce que je fais c'est que à chaque tour de boucle :
-Je dessine mes ombres sur mes render texture.
Pour les autres couches, je stocke tout dans un vecteur et j'affiche d'abord les couches du sol puis les décors (bâtiments, murs, arbres, etc...), il n'y a que pour les personnages et les monstres ou je suis obligés d'insérer la tile dans le vecteur car eux, lui ils bougent donc,parfois je dois le dessiner devant parfois derrière les décors.)
Mais j'ai déja une classe entité et une grille virtuelle en isométrique qui gère tout ça. (Couches, collisions, récupérer toutes les entités qui sont dans la vue de manière rapide, etc...)
Donc il n'y a que les ombres et les lumière pour lesquelle j'utilise une render texture que je rends en en add et en multiply avec une render texture.
Je mettrai des screens des différences que j'ai avec les ombres sur mes 2 PC. (Celui avec carte graphique et mon autre plus ancien avec juste un bête chipset intel.)
Sur l'un ça m'affiche les ombres sur l'autre ça m'affiche une ligne noir horizontale au milieu de l'écran.

Bref..., et à chaque passage de la boucle je dois refaire des setView sur la RenderTarget de la fenêtre et sur la RenderTarget des render texture, sinon, les ombres ne se déplacent pas avec la caméra...
A mon avis c'est ça qui ralenti..., les appells successifs à setView.

Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Eroy le Mai 06, 2013, 06:50:14 pm
non justement le setView est super performant et tu peux même setter une vue différente pour chacun de tes sprites sans que ça baisse les perfs (c'est ça la force c'est que c'est juste un set d'un pointeur, ya aucun calcul qui est fait).

Par contre tu ne dois pas passer par un renderTexture pour gérer les ombres, il vaux mieux que se soit des sprites indépendants, se sera beaucoup plus performant (tu vas multiplier par 2000 les perfs à ce niveau).

En gros les render textures sont fait pour créer des textures mais au coup par coup. Par exemple une minimap non mobile, tu vas la créer une seule fois à partir de ta map lors de son chargement et la transformer en texture, ce qui te permettra de la gérer en temps que simple sprite et donc de bien augmenter les perfs. Ce qu'il ne faut surtout pas faire justement c'est dessiner des renderTexture au frame par frame car c'est juste pas fait pour ça et c'est super lent du coup et ce, même si tu n'en utilise qu'un... Ca double ton temps de dessin à chaque frame et ça tu ne veux pas. xD


ps: faut vraiment que tu te fasses des tests de temps pour voir toi même ce qui pompe sinon tu n'arriveras jamais à optimiser "à vue d'oeil".
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Laurent le Mai 06, 2013, 06:59:57 pm
Non non non et non. sf::RenderTexture sert aussi à faire des rendus temps réels (qui changent à chaque frame). Les ombres sont un excellent cas d'utilisation de cette classe. Rien n'est plus performant, si on le fait bien. Je le répète une dernière fois : sf::RenderTexture n'implique aucune perte de performances par rapport à la même chose dessinée sur une fenêtre.

Et puis je vais m'arrêter là parce que j'ai l'impression de tourner en rond ;D

Testez les choses correctement avant de lancer des conclusions à la va-vite.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Mai 06, 2013, 08:15:31 pm
Mais ça n'aurait pas été mieux de faire une vue par renderframe parce que moi je ne vois pas du tout l'intérêt de faire une vue par rendertexture, et puis suffise que je dessine et que je change de vue si je veux dessiner la minimap qui reste fixe... et ça marche. ;)
Je procède comme ça pour dessiner une grille fixe en iso au dessus de la map que je crée avec mon éditeur.
Moi je pencherais plutôt pour utiliser une rendertexture comme un layer plutôt que une seconde vue, bref...
Sinon au niveau des perfs ça donne dessin fois deux et même si ce n'est pas forcément plus lent avec les rendertexture comme tu le dis si bien Laurent je me rend compte qu'il y a quand même une petite différence au niveau des perfs vu que il y a plusieurs appels à display à faire.

Si ça avait été moi l'auteur de la SFML j'aurai créer les rendertexture plutôt pour faire de nouveaux layers plutôt que pour faire des autres vues.
Même si ça ne change pas tellement au niveau des perfs, ce qui me pose plutôt problème je pense c'est la synchronisation entre le client et le serveur des données pour avoir des mouvements le plus fluide possible.
Mais bon si tu cumules le tout, les rendertexture ne bouffe pas tellement les perfs mais c'est le fait de tout cumuler ou là ça se voit plus.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Eroy le Mai 06, 2013, 08:40:56 pm
Heureusement que c'est pas toi sinon les tutos seraient incompréhensibles  :-* (relis toi, surtout sur les longues phrases parce que des fois ça part un peu en couille x])

Laurent on c'est pas compris encore (toute façon ya personne qui me comprend  :'( ), ce que je veux dire c'est que oui ça ne pompe pas plus de dessiner sur un renderTexture et un renderWindow mais par contre cela implique de dessiner une texture en plus : celle du renderTexture. Et se sont, dans le cas des ombres par exemple, de grosses textures et donc très lentes à dessiner, plus que de passer par une vue + un trie pour gérer les ordres.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Laurent le Mai 06, 2013, 09:02:08 pm
Citer
de grosses textures et donc très lentes à dessiner
Là encore, tu bases ce genre de conclusion sur quoi ? Sur l'intuition, qui te dit que plus c'est gros plus ça prend du temps ?
C'est archi-faux : le fillrate (taux de remplissage des pixels) des cartes graphiques permet de remplir tout l'écran en un temps plus que négligeable par rapport à tout ce qui est fait à côté (changement de contexte, d'états, de texture, ...). Donc petite ou grosse texture, aucune différence.

Citer
plus que de passer par une vue + un trie pour gérer les ordres
Oui mais là on ne parle pas d'ordre. Les render-textures sont typiquement utilisées pour la gestion des ombres car elles permettent de mettre en oeuvre des techniques de rendu impossibles à réaliser sans surface de rendu intermédiaire. Par exemple, afficher toutes les lumières en blending additif sur la render-texture, puis la render-texture en blending multiplicatif sur la fenêtre. Ou encore, les ombres en mode opaque sur la render-texture, puis la render-texture en multiplicatif sur la fenêtre.

Citer
Laurent on c'est pas compris encore
Je crois que c'est moi qui ne me fait pas comprendre, quand je dit d'arrêter avec les conclusions à la va-vite... :-\
Sérieux, cette discussion en est remplie, et je passe mon temps à vous contredire. Je pense qu'on (enfin surtout vous) perd notre temps plus qu'autre chose.
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Eroy le Mai 06, 2013, 09:31:46 pm
Ouais enfin... je me base sur des tests, test que j'ai pris le temps de refaire avant d'écrire mon message histoire d'être certain de pas dire de conneries. Et en l'occurrence, en règle général, plus une texture est grosse et plus elle est longue à dessiner et c'est tout à fait logique.
Après c'est évident que dans certains cas particuliers c'est intéressant...

Ca a au moins l'avantage de relancer mon intérêt pour cette classe que j'ai complètement mise de côté...
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Mai 06, 2013, 10:20:51 pm
Bon je ne vais pas rallongé le débat, pour le moment c'est assez rapide pour me permettre d'implémenter le gameplay, ensuite j'essayerai de voir du côté de la synchronisation entre le serveur et le client pour voir si il n'y a pas moyen de faire mieux... (pour le moment je me contente d'envoyer le temps écoulé entre 2 tour de boucle côté serveur et l'envoyé au client pour estimer la position du personnage entre 2 requêtes successive que j'envoie au serveur tout les x dixièmes de secondes pour ne pas surcharger la bande passante.

Mais il y a peut être d'autres tehnciques qui sont, mieux, bref faut que je cherche sur un autre forum car je crois pas que ici ce soit le bonne endroit pour en parler, mais j'en ai déja une en tête mais je l'implémenterai plus tard.

Car sans le réseau c'est plus fluide. (Mais pas parfais pour autant.)


Mais bon je me débrouille car heureusement je suis pas trop mauvais pour inover.

Mais bon ça m'empêchera pas de pouvoir implémenter correctement le game play et l'IA donc je suis plutôt satisfait. ^^
 (Enfin du moins pour le moment parce que si après ça saccade encore comme ça je crois pas que j'aurai un grand succès. :/)


Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Eroy le Mai 06, 2013, 10:45:40 pm
Déjà c'est pas du tout normal que ton client saccade à cause du serveur. Au pire tu peux avoir de la latence, ton personnage va pas réagir aussi vite etc mais par contre que se soit le serveur qui détermine la position client...
Par exemple si le serveur te donne la position du perso tu ne doit pas téléporter ton perso à cet endroit mais lui dire d'y aller en se déplaçant (mais le perso doit déjà avoir commencé à se déplacer, le serveur n'agit que comme un correcteur) et tu remet à jour cette position à chaque foi que le serveur t'en donne une nouvelle mais le serveur ne commande pas le client.
(et c'est pas toutes les 2 frames, c'est vraiment plus long qu'il faut prévoir car ton serveur arrivera pas à gérer autant de requêtes surtout si le mec a une connexion un peu lente)
Titre: Re : [SFML2.0] Déplacement de la vue lente, mouvement de la caméra saccadés.
Posté par: Lolilolight le Mai 07, 2013, 12:54:32 pm
Ok.