Каково техническое определение «дозирования спрайтов»?

17

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

Bloodyaugust
источник

Ответы:

14

Технически, «пакетирование» объединяет несколько действий и их данные в одну структуру данных, поэтому все они могут выполняться одновременно, а не по отдельности.

Самым большим узким местом современных графических процессоров является не их рабочая мощность, а связь между вашей игрой, работающей на процессоре и графическом процессоре. Каждый пакет данных, отправляемых в графический процессор, имеет накладные расходы, но накладные расходы маленького пакета столь же велики, как и большого пакета, так что это большая выгода, когда вы отправляете один большой пакет, а не сотню меньших. И это то, что пакетирование; сделать одну большую упаковку из всех этих меньших.

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

API-Beast
источник
1
+1 за упоминание проблемы латентности; это тот же принцип, который применяется и к сетевому трафику и дисковым операциям ввода-вывода - в общем случае очень мало больших партий превосходит множество маленьких партий.
Максимус Минимус
9

Дозировка спрайтов - это метод отправки нескольких спрайтов в графический процессор с помощью одного вызова отрисовки.

Ни один из других ответов не указывает на реальную цель сделать это: минимизация изменений состояния и отправки команд GPU. Если у вас есть 100 спрайтов, которые я рисую, каждый со своей текстурой, аппаратное обеспечение может обрабатывать только один спрайт за раз. Десятки или даже тысячи шейдерных ядер практически не используются, а графический процессор тратит слишком много времени на настройку своего состояния рендеринга для переключателей текстур.

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

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

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

Существуют и другие способы пакетного спрайта (например, аппаратное копирование, использование геометрических шейдеров и т. Д.) И другие преимущества для этого, но суть в том, что пакетирование означает рисование нескольких объектов за один вызов отрисовки.

Шон Миддледич
источник
-1: минимизация изменений состояния не является «точкой» дозирования. Это просто требование, исходящее из структуры OpenGL. (Это точка текстурных атласов, но они не были запрошены.) Вопрос, в частности, требует определения «без учета платформы и языка».
API-зверь
Таким образом, метод рисования всего в буферный буфер сначала решает эту проблему, как? Разве данные по-прежнему не обрабатываются по одному для одного изображения в памяти, а затем передаются в передний буфер? Я думаю, что мое понимание должно быть немного ошибочным.
Bloodyaugust
4
Г-н Зверь: это не имеет ничего общего с OpenGL или любой платформой или языком. Именно так работает само оборудование на всех платформах и во всех графических API, использующих любой язык.
Шон Мидлдич
6

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

Таким образом, пакетирование спрайтов - это просто любая система, которая позволяет вам рисовать несколько спрайтов одновременно и, надеюсь, получить от этого некоторую эффективность. Обычно преимущество заключается в том, что все ваши спрайты используют одну и ту же текстуру, поэтому вы можете рисовать все спрайты в пакете без изменения текстуры, что является относительно медленной операцией.

Kylotan
источник