Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: r4gTime le Mars 02, 2021, 06:37:46 pm

Titre: [RenderTexture] Optimisation de rendu maps
Posté par: r4gTime le Mars 02, 2021, 06:37:46 pm
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 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 :)


Titre: Re: [RenderTexture] Optimisation de rendu maps
Posté par: r4gTime le Mars 03, 2021, 12:38:07 am
J'ai trouvé la réponse alors je la poste ici pour ceux que ça intéresse (comme je ne l'ai pas vue ailleurs, peut-être que ça peut servir) :

Il suffit en fait de stocker l'image dans... une texture tout simplement.

Vous dessinez la map entière dans un RenderTexture et vous la stockez dans une Texture.

Votre boucle d'affichage ne fait que draw les 4 ou 5 textures qui constituent vos couches d'affichage (terrain, brouillard, ressources, unités...)

Quand une couche doit changer (découverte du brouillard par exemple), vous redessinez l'image dans un Rendertexture et vous la stockez à nouveau. On a un temps de rendu inférieur à la milliseconde :)