¿Cuáles son las diferencias entre Texture, TextureRegion, TextureAtlas, Sprite e Image en libgdx?

12

He buscado tutoriales. He visto personas que usan las clases anteriores para cargar imágenes.

Según tengo entendido, todas las clases pueden leer en dos imágenes sin potencia, TextureRegion / TextureAtlas se usan generalmente para cargar hojas de sprites, en las que la hoja contiene varias imágenes. Mientras que para Textura / Sprite / Imagen, se usan para cargar una hoja de sprite con una sola imagen.

Sin embargo, no estoy tan seguro de en qué situación debería usar Texture / Sprite / Image y en qué situación debería usar TextureRegion / TextureAtals.

Corríjame si me equivoco, ya que estoy un poco confundido por las terminologías en la API después de buscar varios tutoriales.

usuario15783
fuente

Respuestas:

18

Primero, Texture vs TextureRegion: cuando haces algo como Texture t = new Texture (path), estás cargando eso en la GPU. Además, debe cargar la potencia de 2 texturas. Podría trabajar con otras resoluciones (Texture.setEnforcePotImages = false), pero se recomienda usar pow de 2.

Ahora, TextureRegion, toma una "pieza" de una textura, sin importar su dimensión. La ventaja de tener una textura y múltiples regiones de textura de esa textura es que NO está cargando todas las regiones en la GPU.

Como puede estar pensando, cuando desea dibujar con SpriteBatch, es mucho más eficiente usar TextureRegion en lugar de múltiples Texturas, lo siento, mi inglés no es lo suficientemente bueno. Aquí hay una buena explicación: Textures TextureRegion y SpriteBatch


Ahora, desea utilizar TextureRegion y una sola imagen en potencia de resolución 2 con todas las hojas de sprites e imágenes. ¿Tienes que crear TextureRegions con todas las coordenadas y dimensiones? ¿Necesitas abrir paint para contar píxeles? Noooo, no lo haces. Puedes usar algo como TexturePacker . Empacará cada textura en una imagen Y creará un archivo .pack con dimensiones y coordenadas de todas ellas.

TexturePacker

El resultado será algo como esto:

Paquete

En lugar de crear una Textura, cree un TextureAtlas, como este:

Crear textura Atlas

Ahora, crear tus TextureRegions sería tan simple como:

findRegion

(Tenga en cuenta que el nombre de la región es el nombre de la imagen original sin la extensión).


Sprite contiene la información de geometría, color y textura para dibujar sprites 2D usando Batch. Esto significa que puede rotarlos y moverlos fácilmente. He creado mi propia clase Entity, y no necesito la clase Sprite. Probablemente harías lo mismo. No encuentro esta clase realmente útil.


La clase de imagen hereda del actor. Esto significa que puede agregarlo a una etapa. Es parte del paquete Scene2D. Si es nuevo en libgdx y no conoce este paquete, esta información es suficiente para usted sobre esta clase. Es un tema realmente interesante, pero no responde en esta pregunta.

Espero eso ayude :)

Kirchhoff
fuente
¡Gracias! Eso está más claro ahora. :) Entonces, ¿qué pasa con el rendimiento de crear TextureRegion desde Texture y crear TextureRegion desde TextureAtlas?
user15783
44
@ user15783 Haga una nueva pregunta.
David J. Liszewski
Mucha información buena, pero esta parte es inexacta / engañosa: "NO está cargando todas las regiones en la GPU" De hecho, está cargando todas las regiones en la GPU. Es solo que múltiples TextureRegions pueden hacer referencia a partes distintas (o superpuestas) de una textura, mientras que Texturesiempre se refieren a toda la imagen. Dado que cambiar texturas es costoso, esto es bueno. Su descripción hace que suene como TextureRegionofertas con texturas dispersas (a la. GL_ARB_sparse_texture) Pero libGDX y la mayoría del hardware en el que se ejecuta no admite esa extensión.
bcrist
Además, prefiera los bloques de código de descuento de SE a las capturas de pantalla de código. De esa manera, es fácil copiar y pegar cosas si la gente lo desea. Simplemente comience cada línea del bloque de código con cuatro espacios. Los espacios de código en línea se pueden crear rodeando el texto con el carácter de acento grave (retroceso): `
bcrist