Bonjour, j'aimerais solliciter votre aide pour optimiser correctement l'affichage d'une map.
Celle-ci fait 6400*6400px, avec grosso modo trois couches à afficher :
- Le terrain
- Les ressources et aménagements
- Les unités
Le rendu classique que j'utilise (draw de toutes les tuiles, bordures, ressources, unités à chaque frame) ne fonctionne pas très bien.
Même en optimisant les rendus (affichage uniquement si visible, etc..), quand on dézoome, on passe vite sous la barre des 300fps sur ma machine, avec parfois des crash sur les machines un peu moins puissantes type ordinateur portable.
J'ai tenté une méthode qui en terme d'optimisation fps donne de très bon résultats, mais j'obtiens des bugs de mémoire.
En gros, je crée un RenderTexture de 6400x6400 pour chaque couche (terrain, fog, unités...) que je mets à jour seulement quand il le faut (unité qui bouge, etc..).
Problème, j'obtiens des messages d'erreur OpenGL : OUT_OF_MEMORY m'indiquant que le rendu est impossible. Pourtant le jeu s'affiche bel et bien, à +500 fps, malheureusement j'obtiens des scintillements et pas mal d'artéfacts graphiques.
Pour résoudre ces problèmes de mémoire, j'ai tenté de créer plutôt des images 6400x6400, mais j'obtiens un crash systématique avec un message d'erreur d'allocation mémoire avec le code suivant :
for(int i = 0; i < 4; i++) mapImage[i].create(6400,6400);
Je suis assez étonné de ne pas pouvoir créer 4 images ou textures de 6400px de large, est-ce normal ?
Dernière question d'optimisation : J'ai lu un peu partout sur ce forum que changer de texture prenait pas mal de temps.
Dans ce cas, lequel de ces deux codes est le plus optimisé en terme de temps d'affichage ?
Dessiner les cases une par une en changeant à chaque fois de texture ou dessiner texture par texture ?
for(int x = 0; x < 100; x ++) {
for(int y = 0; y < 100 ; y++) {
sprite.setTexture(GetTexture(x,y));
window.draw(sprite);
}
}
ou bien :
for(int i = 0; i < NumberOfTexture; i ++) {
sprite.setTexture(GetTexture(i));
for(int x = 0; x < 100; x ++) {
for(int y = 0; y < 100 ; y++) {
if(CheckBonneTexture(i,x,y)window.draw(sprite);
}
}
}
Merci d'avance pour votre aide et vos conseils