Jakie są różnice między teksturami, TextureRegion, TextureAtlas, Sprite i Image w libgdx?

12

Szukałem samouczków. Widziałem osoby używające powyższych klas do ładowania obrazów.

Zgodnie z moim rozumieniem wszystkie klasy mogą odczytywać w postaci braku zasilania dwóch obrazów, TextureRegion / TextureAtlas są zwykle używane do ładowania arkusza sprite, w którym arkusz zawiera wiele obrazów. W przypadku tekstury / duszka / obrazu są one używane do ładowania arkusza duszka z pojedynczym obrazem.

Nie jestem jednak pewien, w której sytuacji powinienem użyć Texture / Sprite / Image, a w której sytuacji powinienem użyć TextureRegion / TextureAtals.

Popraw mnie, jeśli się mylę, ponieważ jestem nieco zdezorientowany terminologiami interfejsu API po przejrzeniu różnych samouczków.

użytkownik15783
źródło

Odpowiedzi:

18

Po pierwsze, Texture vs TextureRegion: Kiedy robisz coś takiego jak Texture t = nowa tekstura (ścieżka), ładujesz to do GPU. Ponadto powinieneś załadować moc 2 tekstur. Możesz pracować z innymi rozdzielczościach (Texture.setEnforcePotImages = false), ale zaleca się stosowanie pow 2.

Teraz TextureRegion pobiera „kawałek” z tekstury, bez względu na jej wymiar. Zaletą posiadania jednej tekstury i wielu teksturRegionu tej tekstury jest to, że NIE ładujesz każdego regionu do GPU.

Jak możesz sobie wyobrazić, jeśli chcesz rysować za pomocą SpriteBatch, o wiele bardziej wydajne jest użycie TextureRegion zamiast wielu tekstur, przepraszam, że mój angielski nie jest wystarczająco dobry. Oto dobre wytłumaczenie: Tekstury TextureRegion i SpriteBatch


Teraz chcesz użyć TextureRegion i jednego obrazu o mocy 2 rozdzielczości ze wszystkimi arkuszami sprite i obrazami. Czy musisz utworzyć TextureRegions ze wszystkimi współrzędnymi i wymiarami? Czy potrzebujesz otworzyć farbę, aby policzyć piksele? Nie, nie masz. Możesz użyć czegoś takiego jak TexturePacker . Spakuje każdą teksturę do jednego obrazu ORAZ utworzy plik .pack zawierający wymiary i współrzędne wszystkich z nich.

TexturePacker

Wynik będzie mniej więcej taki:

Pakiet

Zamiast tworzenia tekstury utwórz obiekt TextureAtlas w następujący sposób:

Utwórz TextureAtlas

Teraz utworzenie TextRegions byłoby tak proste, jak:

findRegion

(Pamiętaj, że nazwa regionu to nazwa oryginalnego obrazu bez rozszerzenia).


Sprite przechowuje informacje o geometrii, kolorze i teksturze do rysowania duszków 2D za pomocą Batch. Oznacza to, że możesz je łatwo obracać i przenosić. Stworzyłem własną klasę Entity i nie potrzebuję klasy Sprite. Prawdopodobnie zrobiłbyś to samo. Nie uważam tej klasy za bardzo przydatną.


Klasa obrazu dziedziczy od aktora. Oznacza to, że możesz dodać go do sceny. Jest to część pakietu Scene2D. Jeśli jesteś nowy w libgdx i nie wiesz o tym pakiecie, to wystarczająca ilość informacji o tej klasie. To naprawdę interesujący temat, ale nie ma odpowiedzi na to pytanie.

Mam nadzieję, że to pomoże :)

kirchhoff
źródło
Dzięki! Teraz jest to wyraźniejsze. :) A co z wydajnością tworzenia TextureRegion z Texture i tworzenia TextureRegion z TextureAtlas?
user15783,
4
@ user15783 Zadaj jako nowe pytanie.
David J. Liszewski,
Wiele dobrych informacji, ale ta część jest niedokładna / myląca: „NIE ładujesz każdego regionu do GPU” W rzeczywistości ładujesz każdy region do GPU. Po prostu wiele TextureRegions może odnosić się do różnych (lub nakładających się) części tekstury, a Texturezawsze odnosi się do całego obrazu. Ponieważ zmiana tekstur jest droga, jest to dobre. Twój opis sprawia, że ​​brzmi to jak rozproszone TextureRegiontekstury (a la. GL_ARB_sparse_texture), Ale libGDX i większość sprzętu, na którym działa, nie obsługuje tego rozszerzenia.
bcrist
Ponadto proszę preferować bloki kodu obniżki SE zamiast zrzutów ekranu kodu. W ten sposób można łatwo kopiować i wklejać rzeczy, jeśli ludzie chcą. Wystarczy rozpocząć każdy wiersz bloku kodu czterema spacjami. Rozpiętości kodu inline można tworzyć, otaczając tekst ze
znaczącym