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

Auteur Sujet: Conception multiples entités 2D - RTS  (Lu 1965 fois)

0 Membres et 1 Invité sur ce sujet

Snouf

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
    • E-mail
Conception multiples entités 2D - RTS
« le: Janvier 14, 2018, 05:54:20 pm »
Bonjour à tous!

Je suis actuellement sur un projet de jeu type "RTS" que je développe sous la SFML 2.4 en C++.

Le développement avançait bien lorsque je me suis rendu compte qu'un certain nombre d’unités ou de tiles faisait un "lag" affreux (700 tiles -> 3 images/s ).

Après avoir fait des recherches, j'ai trouvé qu'un "trop grand nombre d'appel a la fonction draw" pouvait en être la cause. Etant donné que chaque tile ou unité est une classe comprenant un sf::Sprite, un référence sur une texture, un nb de points de vie... ect , cela me donnait un appel a draw() pour chaque personnage, un pour chaque tiles.. ect.

J'ai donc essayé la méthode de la VertexArray pour dessiner en premier temps mon TileMap en entier. Cela fait, je me rend compte que pour 700 tiles le rendu est bien instantané.

Mais en utilisant cette technique un problème se pose a moi, comment gérer l’ordre d'affichage des unités ? tiles ? Avant je pouvais faire mes tests sur leur position, état, visibilité a l'écran et appeler le draw sur chaque entité. Maintenant tout est en "block" et je suis bloqué pour trouver la bonne méthode de conception...

Voici donc mes deux questions:
- Cela est t'il normal que la SFML lag avec 700 appels a draw() ? (tiles[1]->draw() )
- Si il faut bien utilisé la méthode VertexArray, avez vous une piste de conception pour pouvoir gérer les éléments comme expliqué si dessus ( est dans l'écran, a dessiner en premier, ect..) ?

Merci d'avance pour toute réponse  :(

ps: J'ai oublié de préciser que c'est un rts 2D iso comme Age of Empires II par exemple.
« Modifié: Janvier 14, 2018, 06:30:28 pm par Snouf »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: Conception multiples entités 2D - RTS
« Réponse #1 le: Janvier 14, 2018, 06:36:44 pm »
Citer
- Cela est t'il normal que la SFML lag avec 700 appels a draw() ? (tiles[1]->draw() )
Le lag c'est un délai, toi ce que tu constates c'est plutôt une lenteur :)
Ensuite, les performances dépendent de tellement de choses (matériel, driver, OS, code de ton programme, ...) qu'il est bien entendu impossible de répondre à cette question.

Citer
- Si il faut bien utilisé la méthode VertexArray, avez vous une piste de conception pour pouvoir gérer les éléments comme expliqué si dessus ( est dans l'écran, a dessiner en premier, ect..) ?
Ce n'est pas du "tout ou rien". Tu peux gérer certaines parties avec des sprites, et d'autres avec des vertex array. Commence par regrouper en vertex array les choses faciles (les tuiles de fond qui sont les unes à côté des autres, typiquement).
Laurent Gomila - SFML developer

Snouf

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
    • E-mail
Re: Conception multiples entités 2D - RTS
« Réponse #2 le: Janvier 14, 2018, 07:26:40 pm »
Merci de ta réponse.

Je vais être plus précis sur ma première question alors :Est-il possible que la SFML ne puisse pas rendre assez rapidement le draw() de beaucoup d'entités ( exp : 700 sprites qui utilise la même texture).
Pour ce qui est du code, on a juste le main et les 700 sprites, donc pas de problème liés à mon code.
Pour la configuration, elle est récente, plutôt bonne et à jour.

J'ai déjà regroupé les éléments ensembles, vous me confirmé donc qu'il ne faut pas regrouper les éléments différents comme les personnages ?

Avez vous une idée pour ma seconde question ?

Merci d'avance :)


void main()
{
  sf::Texture texture = load(blablabla);

  sf::Sprite sp1;
  ...
  sf::Sprite sp700;

  sp1.setTexture(texture);
  ...
  sp700.setTexture(texture);

  window.draw(sp1);
  ...
  window.draw(sp700);
 


« Modifié: Janvier 14, 2018, 07:45:34 pm par Snouf »

Snouf

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
    • E-mail
Re: Conception multiples entités 2D - RTS
« Réponse #3 le: Janvier 15, 2018, 06:22:07 pm »
Bon finalement j'ai trouvé !

C'est juste que j'avais deux "std::cout.. endl;" dans ma boucle de rendu.
Et que les entrées/sorties ca coute chère, ce qui donnait ce ralentissement !

Donc pas du tout un problème de draw(), après les test on peut bien faire 1600 draw() chaque frame sans problème !

Sujet résolu donc, merci !  ;D