Які відмінності між 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.