Преимущество TextureAtlas и как им правильно пользоваться

Я рефакторинг своих небольших ролевых игр, которые я разработал в libgdx.

У меня возник общий вопрос, как правильно пользоваться текстурным атласом. У меня около 100 актеров с 10 видами спрайтов. В настоящее время я не использую атлас, но я хотел бы увеличить производительность рендеринга, поскольку это единственное, что занимает много времени внутри моего игрового цикла (получено около 100 биндов и 15 вызовов рендеринга..)

Итак, мы рассмотрели класс TextureAtlas ссылка на git, и мне было интересно, как мне получить от него больше производительности. Если я получу спрайт с правильной текстурой, я получу копию, так что я все равно переключу привязку OpenGL, верно? Так что это не было бы лучшим решением, особенно если бы у меня было около 100 актеров со своим собственным спрайтом, или я ошибаюсь и просто не понял это правильно?

Сам Атлас рекомендует не вызывать getsprite несколько раз, но мне нужно сделать это, чтобы у каждого актера был свой спрайт с собственным статусом.

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


person BennX    schedule 16.01.2014    source источник


Ответы (2)


Если я получу спрайт с правильной текстурой, я получу копию, так что я все равно переключу привязку OpenGL, верно?

Нет, вы получаете TextureRegion этого. (Спрайт — это более специализированный объект TextureRegion).

Поэтому, когда вы рисуете все свои спрайты, если они из одного и того же TextureAtlas, им понадобится только один рисунок.

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

Просто используйте TextureAtlas#createSprite:

sprite = textureatlas.createSprite("example");

Когда вы рисуете их, например, так:

batch.begin();
sprite.draw(batch)
sprite2.draw(batch);
sprite3.draw(batch);
batch.end();

Если 3 спрайта взяты из одного и того же TextureAtlas, они сбрасывают пакет только один раз.

Редактировать
TextureRegion — это только координаты и размер (прямоугольник), ссылающиеся на текстуру (атлас). Не волнуйтесь, текстура не копируется. Он единственный, неважно, сколько спрайтов вы создадите из него :)

person Lestat    schedule 16.01.2014
comment
То есть текстура текстурной области спрайта должна быть ссылкой на атлас? Я действительно не вижу этого внутри метода создания спрайта. - person BennX; 16.01.2014
comment
Да, Атлас - это Текстура. И да, TextureRegion — это только координаты и размер (прямоугольник), ссылающиеся на него. Не волнуйтесь, текстура не копируется. Он единственный, неважно, сколько спрайтов вы создадите из него :) - person Lestat; 16.01.2014
comment
Большое спасибо. Я действительно был озадачен этим даже после того, как взглянул на код. Спасибо за решение. Возможно, вы тоже добавите это в свой ответ. - person BennX; 16.01.2014

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

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

person Tim B    schedule 16.01.2014
comment
Да, но как мне этого добиться? Чтобы получить несколько спрайтов с одной и той же областью текстуры атласа без привязки New при рендеринге. Похоже, что спрайт get копирует текстуру, или я совершенно не прав. Извините, я совершенно озадачен - person BennX; 16.01.2014
comment
Извините, я знаком с атласами текстур, но не знаком с библиотеками, которые вы используете, поэтому не могу быть более конкретным. - person Tim B; 16.01.2014
comment
@Bennx просто вычисляет все координаты UV в соответствии с несколькими спрайтами, расположенными на текстуре. - person vallentin; 16.01.2014
comment
Нет необходимости пересылать текстуру на видеокарту. Этого все равно не произойдет. Текстуру не нужно повторно отправлять, но переключение контекста текстуры по-прежнему требует больших затрат. - person noone; 16.01.2014