Salut !
Débutant dans le C++ et dans la SFML (que j'adore
), j'ai essayé de faire un petit test pour voir si je pouvais m'en sortir : créer des entités représentées sous forme de carrés et bougeant d'un mouvement aléatoire tout en restant à 60 FPS. Mais j'aimerais en dessiner plusieurs milliers voire millions à l'écran, donc faire un code pas mal optimisé.
Je rappelle que ceci n'a pas d'autre but que de tester la SFML, alors ne cherchez pas de sens caché et profond !D'abord, j'avais essayé avec un vector de RectangleShapes que je dessinais une par une. Bien sûr, ce n'était pas terrible et au bout d'environ 1000 carrés dessinés à l'écran à chaque tour de boucle, je tombais à 50 FPS. Sachant que tous les 1/60ème de seconde (pour les 60 FPS), je devais donner une nouvelle position à chaque carré puis le dessiner, cela représentait pas mal d'appels à
draw.
La seconde idée que j'ai eu et celle pour laquelle je poste ici, est d'utiliser un Vertex Array et donc de ne faire qu'un seul appel à
draw. Et après les tests, cela marche nickel, les carrés sont dessinés très rapidement !
Là d'où vient le problème c'est que je n'arrive qu'à en dessiner que 16 000 environ avant d'être à 50 FPS.
J'ai regardé quelle était la fonction qui me ralentissait tout et c'est celle-ci :
// Créé un tableau de Vertex
void Fourmiliere::creerVerArr() {
// On vide le Vertex Array
verArr.clear();
// Pour toutes les fourmis de la fourmilière ...
for (int i = 0; i < fourmiliere.size(); ++i) {
// ... on les fait bouger ...
fourmiliere[i]->Move();
// ... et l'on ajoute les vertex les composant au Vertex Array
verArr.append(fourmiliere[i]->getVertex()[0]);
verArr.append(fourmiliere[i]->getVertex()[1]);
verArr.append(fourmiliere[i]->getVertex()[2]);
verArr.append(fourmiliere[i]->getVertex()[3]);
}
}
En fait, cette fonction est appelée à chaque tour de boucle. Elle vide le Vertex Array pour le remplir avec les nouveaux Vertex (4 par carré, "Fourmi"), qui ont changé de position par rapport au tour de boucle précédent puisque les carrés bougent d'un mouvement aléatoire.
Donc je pense que le fait de demander à chaque tour de boucle à bouger chaque Vertex puis à recréer un Vertex Array est vraiment lent ...
Auriez vous une solution ?
Si mon explication n'est pas claire, n'hésitez pas à me poser des questions. Je vous mets mon code entier (assez court et commenté au maximum) :
https://www.dropbox.com/s/5zj30bo1w1cyt30/Fourmis1.zipVous pouvez appuyer sur la touche directionnelle droite pour créer plusieurs centaines voire milliers de "Fourmis" d'un coup, pour tester.
Merci d'avance,
Totocap.