Які відмінності між Texture, TextureRegion, TextureAtlas, Sprite та Image у libgdx?


12

Я шукав підручники. Я бачив людей, які використовують вищезазначені класи для завантаження зображень.

Як на моє розуміння, усі класи можуть читати без потужності два зображення, TextureRegion / TextureAtlas зазвичай використовуються для завантаження аркуша спрайту, в якому на аркуші міститься кілька зображень. У той час як для текстури / спрайта / зображення вони використовуються для завантаження аркуша спрайта з одним зображенням.

Однак я не дуже впевнений, у якій ситуації я повинен використовувати Texture / Sprite / Image і в якій ситуації я повинен використовувати TextureRegion / TextureAtals.

Будь ласка, виправте мене, якщо я помиляюся, оскільки мене трохи збентежили термінології в API після перегляду різних навчальних посібників.

Відповіді:


18

По-перше, Texture vs TextureRegion: Коли ви робите щось на кшталт Texture t = new Texture (path), ви завантажуєте це в GPU. Крім того, слід завантажувати потужність 2 текстури. Ви можете працювати з іншими резолюціями (Texture.setEnforcePotImages = false), але рекомендується використовувати Pow 2.

Тепер TextureRegion бере частину текстури, незалежно від її виміру. Перевагою наявності однієї текстури та декількох TextureRegion цієї текстури є те, що ви НЕ завантажуєте кожен регіон у GPU.

Як ви можете думати, коли ви хочете малювати за допомогою SpriteBatch, набагато ефективніше використовувати TextureRegion замість декількох текстур, вибачте, моя англійська мова недостатньо хороша. Ось хороше пояснення: Textures TextureRegion & SpriteBatch


Тепер ви хочете використовувати TextureRegion і одне єдине зображення потужністю 2 роздільної здатності з усіма спрайтами та зображеннями. Чи потрібно створювати TextureRegions з усіма координатами та розмірами? Вам потрібно відкрити фарбу для підрахунку пікселів? Нуо, ти цього не робиш. Ви можете використовувати щось на зразок TexturePacker . Він упакує кожну текстуру в одне зображення І створить .pack файл із розмірами та координатами всіх них.

TexturePacker

Результат буде приблизно таким:

Пакувати

Замість створення Texture створіть TextureAtlas, як це:

Створіть TextureAtlas

Тепер, створити TextureRegions було б так просто, як:

findRegion

(Зверніть увагу, що назва регіону - це ім'я оригінального зображення без розширення).


У спрайті зберігається інформація про геометрію, колір та текстуру для малювання двовимірних спрайтів за допомогою Пакетної. Це означає, що ви можете їх легко обертати і рухати. Я створив власний клас Entity, і мені не потрібен клас Sprite. Ви, певно, зробили б те саме. Я не вважаю цей клас справді корисним.


Клас зображень успадковується від Actor. Це означає, що ви можете додати його до етапу. Це частина пакету Scene2D. Якщо ви новачок у libgdx, і ви не знаєте про цей пакет, для вас достатньо інформації про цей клас. Це дійсно цікава тема, але не відповідати на це питання.

Сподіваюся, це допомагає :)


Дякую! Це зараз зрозуміліше. :) Тоді як щодо продуктивності створення TextureRegion з Texture та створення TextureRegion від TextureAtlas?
користувач15783

4
@ user15783 Задайте нове запитання.
Девід Дж. Лішевський

Багато корисної інформації, але ця частина є неточною / оманливою: "Ви НЕ завантажуєте кожен регіон у GPU" Насправді ви завантажуєте кожен регіон у GPU. Просто декілька TextureRegions можуть посилатися на окремі (або перекриваються) частини текстури, а Textureзавжди стосуються всього зображення. Оскільки перемикання текстур коштує дорого, це добре. У вашому описі це здається схожим на TextureRegionугоди з розрідженими текстурами (а-ля GL_ARB_sparse_texture), але libGDX та більшість апаратних засобів, на яких він працює, не підтримують це розширення.
bcrist

Крім того, будь ласка, віддайте перевагу кодам блоків розмітки SE над скріншотами коду. Таким чином легко копіювати та вставляти речі, якщо люди хочуть. Просто почніть кожен рядок блоку коду з чотирьох пробілів. Діапазони вбудованого коду можна створити за допомогою оточуючого тексту із символом серйозного наголосу (backtick): `
bcrist
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.