Quelles sont les différences entre Texture, TextureRegion, TextureAtlas, Sprite et Image dans libgdx?

12

J'ai cherché des tutoriels. J'ai vu des gens utiliser les classes ci-dessus pour charger des images.

Selon ma compréhension, toutes les classes peuvent lire dans une non-puissance de deux images, TextureRegion / TextureAtlas sont généralement utilisées pour charger une feuille de sprite, dans laquelle la feuille contient plusieurs images. Alors que pour Texture / Sprite / Image, ils sont utilisés pour charger une feuille de sprite avec une seule image.

Cependant, je ne sais pas trop dans quelle situation je devrais utiliser Texture / Sprite / Image et dans quelle situation je devrais utiliser TextureRegion / TextureAtals.

Veuillez me corriger si je me trompe, car je suis un peu confus par les terminologies de l'API après avoir consulté divers didacticiels.

user15783
la source

Réponses:

18

Tout d'abord, Texture vs TextureRegion: lorsque vous faites quelque chose comme Texture t = nouvelle Texture (chemin), vous la chargez dans le GPU. De plus, vous devez charger la puissance de 2 textures. Vous pouvez travailler avec d'autres résolutions (Texture.setEnforcePotImages = false), mais il est recommandé d'utiliser pow of 2.

Maintenant, TextureRegion, prend un "morceau" d'une texture, peu importe sa dimension. L'avantage d'avoir une Texture et plusieurs TextureRegion de cette Texture est que vous ne chargez PAS chaque région dans le GPU.

Comme vous le pensez peut-être, lorsque vous souhaitez dessiner avec le SpriteBatch, il est beaucoup plus efficace d'utiliser TextureRegion au lieu de plusieurs textures, je suis désolé, mon anglais n'est pas assez bon. Voici une bonne explication: Textures TextureRegion & SpriteBatch


Maintenant, vous voulez utiliser TextureRegion et une seule image avec une résolution de 2 avec toutes les feuilles de sprites et les images. Devez-vous créer TextureRegions avec toutes les coordonnées et dimensions? Avez-vous besoin d'ouvrir la peinture pour compter les pixels? Non, non. Vous pouvez utiliser quelque chose comme TexturePacker . Il regroupera toutes les textures dans une seule image ET créera un fichier .pack avec les dimensions et les coordonnées de toutes.

TexturePacker

Le résultat sera quelque chose comme ceci:

Pack

Au lieu de créer une texture, créez un TextureAtlas, comme ceci:

Créer TextureAtlas

Maintenant, créer vos TextureRegions serait aussi simple que:

findRegion

(Notez que le nom de la région est le nom de l'image d'origine sans l'extension).


Sprite contient les informations de géométrie, de couleur et de texture pour dessiner des sprites 2D à l'aide de Batch. Cela signifie que vous pouvez facilement les faire pivoter et les déplacer. J'ai créé ma propre classe Entity et je n'ai pas besoin de la classe Sprite. Vous feriez probablement la même chose. Je ne trouve pas cette classe vraiment utile.


La classe d'image hérite d'Actor. Cela signifie que vous pouvez l'ajouter à une étape. Cela fait partie du package Scene2D. Si vous êtes nouveau sur libgdx et que vous ne connaissez pas ce paquet, c'est assez d'informations pour vous sur cette classe. C'est un sujet vraiment intéressant, mais pas de réponse dans cette question.

J'espère que cela aide :)

kirchhoff
la source
Merci! C'est plus clair maintenant. :) Qu'en est-il alors des performances de création de TextureRegion à partir de Texture et de création de TextureRegion à partir de TextureAtlas?
user15783
4
@ user15783 Poser comme nouvelle question.
David J.Liszewski
Beaucoup de bonnes informations, mais cette partie est inexacte / trompeuse: "vous ne chargez PAS chaque région dans le GPU" En fait, vous chargez chaque région dans le GPU. C'est juste que plusieurs TextureRegions peuvent référencer des parties distinctes (ou se chevauchant) d'une texture, tout Textureen se référant toujours à l'image entière. Comme changer de textures coûte cher, c'est bien. Votre description donne l'impression de TextureRegiontraiter des textures clairsemées (a la. GL_ARB_sparse_texture) Mais libGDX et la plupart du matériel sur lequel il fonctionne ne prennent pas en charge cette extension.
bcrist
De plus, veuillez préférer les blocs de code de démarque de SE aux captures d'écran de code. De cette façon, il est facile de copier et coller des choses si les gens le souhaitent. Commencez simplement chaque ligne du bloc de code avec quatre espaces. Les étendues de code en ligne peuvent être créées en entourant le texte avec le caractère accent grave (backtick): `
bcrist