Каковы различия между текстурами, текстурным регионом, текстурным атласом, спрайтом и изображением в libgdx?

12

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

Насколько я понимаю, все классы могут читать не в двух степенях изображений, TextureRegion / TextureAtlas обычно используются для загрузки листа спрайта, в котором лист содержит несколько изображений. В то время как для Texture / Sprite / Image они используются для загрузки листа спрайта с одним изображением.

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

Пожалуйста, исправьте меня, если я ошибаюсь, так как я немного озадачен терминологией в API после просмотра различных руководств.

user15783
источник

Ответы:

18

Во-первых, Texture против TextureRegion: когда вы делаете что-то вроде Texture t = new Texture (path), вы загружаете это в GPU. Кроме того, вы должны загрузить мощность 2 текстуры. Вы можете работать с другими разрешениями (Texture.setEnforcePotImages = false), но рекомендуется использовать pow из 2.

Теперь TextureRegion берет «кусок» из текстуры, независимо от ее размера. Преимущество наличия одной текстуры и нескольких текстурных областей этой текстуры состоит в том, что вы НЕ загружаете каждый регион в графический процессор.

Как вы можете подумать, когда вы хотите рисовать с помощью SpriteBatch, гораздо эффективнее использовать TextureRegion вместо нескольких текстур, извините, мой английский недостаточно хорош. Вот хорошее объяснение: текстуры TextureRegion & SpriteBatch


Теперь вы хотите использовать TextureRegion и одно изображение с разрешением 2 со всеми таблицами спрайтов и изображениями. Вы должны создать TextureRegions со всеми координатами и размерами? Вам нужно открыть краску для подсчета пикселей? Неееет, ты не. Вы можете использовать что-то вроде TexturePacker . Он упакует каждую текстуру в одно изображение и создаст .pack-файл с размерами и координатами всех из них.

TexturePacker

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

пак

Вместо создания текстуры создайте TextureAtlas, например так:

Создать TextureAtlas

Теперь создание ваших TextureRegions будет так же просто, как:

findRegion

(Обратите внимание, что название региона - это имя исходного изображения без расширения).


Sprite содержит информацию о геометрии, цвете и текстуре для рисования двумерных спрайтов с использованием пакета. Это означает, что вы можете легко вращать их и двигаться. Я создал свой собственный класс Entity, и мне не нужен класс Sprite. Вы, вероятно, сделали бы то же самое. Я не считаю этот класс действительно полезным.


Класс изображения наследуется от актера. Это означает, что вы можете добавить его на сцену. Это часть пакета Scene2D. Если вы новичок в libgdx и не знаете об этом пакете, вам достаточно информации об этом классе. Это действительно интересная тема, но не ответить на этот вопрос.

Надеюсь, поможет :)

Кирхгофа
источник
Спасибо! Теперь все понятно. :) Тогда как насчет производительности создания TextureRegion из Texture и создания TextureRegion из TextureAtlas?
user15783
4
@ user15783 Задайте как новый вопрос.
David J. Liszewski
Много полезной информации, но эта часть неточна / вводит в заблуждение: «вы НЕ загружаете каждый регион в графический процессор». Фактически, вы загружаете каждый регион в графический процессор. Просто несколько TextureRegions могут ссылаться на отдельные (или перекрывающиеся) части текстуры, в то время как Textureвсегда относится ко всему изображению. Поскольку переключение текстур стоит дорого, это хорошо. Ваше описание звучит так, как будто оно TextureRegionимеет дело с разреженными текстурами (а-ля GL_ARB_sparse_texture), но libGDX и большая часть оборудования, на котором он работает, не поддерживает это расширение.
bcrist
Также, пожалуйста, предпочитайте блоки кода уценки SE над скриншотами кода. Таким образом, можно легко копировать и вставлять вещи, если люди этого хотят. Просто начните каждую строку блока кода с четырех пробелов. Встроенные интервалы кода можно создать, окружив текст символом серьезного ударения (backtick): `
bcrist