2010-05-14 5 views
0

J'ai produit ce moteur de jeu 2D basé sur des tuiles qui sera utilisé dans plusieurs projets.La méthode la plus efficace pour dessiner plusieurs quads en OpenGL

J'ai une classe appelée « ScreenObject » qui se compose principalement d'un

Dictionary<Point, Tile> 

La clé Point est de montrer où rendre la tuile sur l'écran, et la tuile contient une ou plusieurs textures être tiré à ce moment-là. Ce ScreenObject est l'endroit où les tuiles seront modifiées, supprimées, ajoutées, etc.

Ma méthode originale de dessiner les carreaux dans le test que j'ai fait était de parcourir le ScreenObject et dessiner chaque quadruple à chaque emplacement séparément. D'après ce que j'ai lu, c'est un énorme gaspillage de ressources. Ce n'était pas horriblement lent dans les tests, mais après avoir terminé les cours d'animation et les classes d'effets, je suis sûr que ce serait extrêmement lent.

Et une dernière chose, si cela ne vous dérange pas .. Comme je l'ai déjà dit, la classe Tile peut contenir plusieurs textures à dessiner à l'emplacement Point sur l'écran.

Je reconnais peut-être deux options pour moi ici. Ajoutez un quad à cet endroit pour chaque texture à dessiner ou, d'une façon ou d'une autre, utilisez une texture multiple pour le même quad (si c'est possible). Même si chaque tuile contenait une seule texture, ce serait 64 quads à dessiner sur l'écran. La plupart des tuiles contiendront 2-5 textures, de sorte que le nombre de quads augmenterait considérablement avec cette méthode. Serait-il possible d'ajouter un quad pour chaque nouvelle texture, ou est-ce que j'ignore une meilleure façon de le faire?

Répondre

0

Je aurait suspect en utilisant un dictionnaire serait plus lent que d'utiliser simplement un tableau droit. Si votre monde est composé de 512x512 tuiles, vous allouez un tableau 512x512 (262144) de longueur. YVous pouvez obtenir n'importe quelle tuile dans ce tableau en utilisant "array [x + (y * 512)]".

Vous savez combien de tuiles il y a, alors stockez un tableau où chacun pointe vers la tuile à cette position ou a un index à la tuile dans une liste (vous économiserez probablement de la mémoire de cette façon dans un tableau dont la taille est inférieure à 65536 ou peut-être même 256, et donc stocker l'index sous forme de 16 bits

Ensuite, vous trouverez la zone de la matrice que vous voulez rendre. évitez de changer autant que possible de textures, donc d'abord je vérifierais la taille de vos carreaux, puis j'essayerais de combiner la plus grande partie de la texture en une grande texture. De cette façon, vous devriez être en mesure de limiter le nombre de textures utilisées avec quelques grosses textures. Il suffit de trouver qu'un ensemble de dalles donné (par exemple, un sol rocailleux) utilisera les mêmes groupes de textures. Il se peut aussi qu'il y ait un peu de mélange sur l'herbe quelque part, alors il vaut peut-être mieux tenir les textures d'herbe dans les deux textures pour éviter de faire autant de swaps de texture. c'est-à-sacrifier la mémoire vidéo pour la vitesse.

Vous itérer ensuite sur la partie visible du tableau et d'en tirer toutes les tuiles en utilisant la texture 1, puis toutes les tuiles en utilisant la texture 2 et ainsi de suite.

0

Je recommande d'utiliser seul objet VAO composé de triangles + indices. Calculer la position du côté client et juste la mettre à jour sur chaque image (streaming).

utilisation atlas de texture pour stocker tout en texture unique (pour éviter les états de commutation). Vous pouvez utiliser l'outil Packer de texture.

rendu en un seul coup (si vous avez un tampon de profondeur est activée). Sinon, rendez les premiers objets opaques et restituez tout ce qui devrait être mélangé.

Questions connexes