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

Auteur Sujet: [RenderTexture] Optimisation de rendu maps  (Lu 2865 fois)

0 Membres et 1 Invité sur ce sujet

r4gTime

  • Newbie
  • *
  • Messages: 14
    • Voir le profil
    • E-mail
[RenderTexture] Optimisation de rendu maps
« 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 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 :)



r4gTime

  • Newbie
  • *
  • Messages: 14
    • Voir le profil
    • E-mail
Re: [RenderTexture] Optimisation de rendu maps
« Réponse #1 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 :)