Was sind die Unterschiede zwischen Texture, TextureRegion, TextureAtlas, Sprite und Image in libgdx?

11

Ich habe nach Tutorials gesucht. Ich habe Leute gesehen, die die oben genannten Klassen zum Laden von Bildern verwendet haben.

Nach meinem Verständnis können alle Klassen in einer Nicht-Potenz von zwei Bildern lesen. TextureRegion / TextureAtlas werden normalerweise zum Laden von Sprite-Blättern verwendet, in denen das Blatt mehrere Bilder enthält. Während für Textur / Sprite / Bild ein Sprite-Blatt mit einem einzelnen Bild geladen wird.

Ich bin mir jedoch nicht sicher, in welcher Situation ich Texture / Sprite / Image verwenden soll und in welcher Situation ich TextureRegion / TextureAtals verwenden soll.

Bitte korrigieren Sie mich, wenn ich falsch liege, da mich die Terminologien in der API nach dem Betrachten verschiedener Tutorials etwas verwirren.

user15783
quelle

Antworten:

17

Erstens Texture vs TextureRegion: Wenn Sie so etwas wie Texture t = new Texture (Pfad) ausführen, laden Sie dies in die GPU. Zusätzlich sollten Sie die Leistung von 2 Texturen laden. Sie können auch mit anderen Auflösungen arbeiten (Texture.setEnforcePotImages = false), es wird jedoch empfohlen, pow of 2 zu verwenden.

Jetzt nimmt TextureRegion ein "Stück" aus einer Textur, unabhängig von ihrer Dimension. Der Vorteil einer Textur und mehrerer Texturregionen dieser Textur besteht darin, dass Sie NICHT jede Region in die GPU laden.

Wie Sie vielleicht denken, ist es beim Zeichnen mit SpriteBatch viel effizienter, TextureRegion anstelle mehrerer Texturen zu verwenden. Es tut mir leid, dass mein Englisch nicht gut genug ist. Hier ist eine gute Erklärung: Textures TextureRegion & SpriteBatch


Jetzt möchten Sie TextureRegion und ein einzelnes Bild mit einer Auflösung von 2 mit allen Spritesheets und Bildern verwenden. Müssen Sie TextureRegions mit allen Koordinaten und Dimensionen erstellen? Müssen Sie Farbe öffnen, um Pixel zu zählen? Nein, das tust du nicht. Sie können so etwas wie TexturePacker verwenden . Es wird jede Textur in ein Bild packen UND eine .pack-Datei mit den Dimensionen und Koordinaten aller erstellen.

TexturePacker

Das Ergebnis wird ungefähr so ​​aussehen:

Pack

Anstatt eine Textur zu erstellen, erstellen Sie einen TextureAtlas wie folgt:

Erstellen Sie TextureAtlas

Das Erstellen Ihrer TextureRegions ist jetzt so einfach wie:

findRegion

(Beachten Sie, dass der Name der Region der Name des Originalbilds ohne Erweiterung ist.)


Sprite enthält die Geometrie-, Farb- und Texturinformationen zum Zeichnen von 2D-Sprites mit Batch. Dies bedeutet, dass Sie sie leicht drehen und bewegen können. Ich habe meine eigene Entity-Klasse erstellt und benötige keine Sprite-Klasse. Sie würden wahrscheinlich das gleiche tun. Ich finde diese Klasse nicht wirklich nützlich.


Die Bildklasse erbt von Actor. Dies bedeutet, dass Sie es einer Bühne hinzufügen können. Es ist Teil des Scene2D-Pakets. Wenn Sie libgdx noch nicht kennen und dieses Paket nicht kennen, sind dies genügend Informationen zu dieser Klasse. Es ist ein wirklich interessantes Thema, aber in dieser Frage nicht zu beantworten.

Ich hoffe es hilft :)

Kirchhoff
quelle
Vielen Dank! Das ist jetzt klarer. :) Was ist dann mit der Leistung beim Erstellen von TextureRegion aus Texture und beim Erstellen von TextureRegion aus TextureAtlas?
user15783
4
@ user15783 Als neue Frage stellen.
David J. Liszewski
Viele gute Informationen, aber dieser Teil ist ungenau / irreführend: "Sie laden NICHT jede Region in die GPU" Tatsächlich laden Sie jede Region in die GPU. Es ist nur so, dass mehrere TextureRegions auf unterschiedliche (oder überlappende) Teile einer Textur Textureverweisen können , während sie sich immer auf das gesamte Bild beziehen. Da das Wechseln von Texturen teuer ist, ist dies gut. Ihre Beschreibung lässt es so klingen, als würde es TextureRegionsich um spärliche Texturen handeln (a la. GL_ARB_sparse_texture), Aber libGDX und der größte Teil der Hardware, auf der es ausgeführt wird, unterstützen diese Erweiterung nicht.
bcrist
Bitte bevorzugen Sie auch die Markdown-Codeblöcke von SE gegenüber Screenshots von Code. Auf diese Weise ist es einfach, Dinge zu kopieren und einzufügen, wenn die Leute wollen. Beginnen Sie einfach jede Zeile des Codeblocks mit vier Leerzeichen. Inline-Code-Bereiche können erstellt werden, indem Text mit dem schwerwiegenden Akzent (Backtick) umgeben wird: `
bcrist