Спрайты в игровом программировании, несколько файлов против одной "текстуры"? - PullRequest
3 голосов
/ 21 сентября 2009

Прошу прощения, если мой язык неверен, так как я новичок в программировании игр. Я смотрел на некоторые проекты с открытым исходным кодом и заметил, что некоторые спрайты разделены на несколько файлов, каждый из которых сгруппирован так, чтобы 2D-объект выглядел так, как будто он анимируется. Это прямо вперед. Тогда я увижу другой подход, когда 2d-объект будет находиться в одном png-файле или что-то похожее, все рядом друг с другом.

Есть ли преимущество использования одного подхода к другому? Должны ли спрайты быть в отдельных файлах? Почему они иногда все на одном листе?

Ответы [ 3 ]

15 голосов
/ 21 сентября 2009

Первый подход, как правило, более прост и прост в программировании, поэтому вы часто его видите в проектах с открытым исходным кодом.

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

5 голосов
/ 21 сентября 2009

Каждый раз, когда вы переключаете свою текущую привязанную текстуру, вы получаете штраф (иногда очень большой, если системе не хватает памяти и начинает публиковать и выгружать текстуры). Таким образом, чем больше вещей вы можете нарисовать с помощью одной текстуры, тем лучше. Переходя к крайностям, если вы никогда не переключали привязки текстур, вы понесли бы штраф 0.

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

Другая проблема заключается в том, что иногда вещи в вашем виртуальном мире просто не относятся к такой группировке. В то время как вы можете иметь большую текстуру с каждым небольшим украшением для вашего пользовательского интерфейса (оконные рамы, кнопки и т. Д.), Вам будет сложнее использовать одну текстуру для разных врагов, потому что они могут даже не появиться на экране в в то же время, или вы не сможете рисовать их один за другим из-за схемы рисования «спереди назад», необходимой для прозрачности.

2 голосов
/ 22 сентября 2009

Не так давно одной из причин использования упакованных спрайтов вместо отдельных было то, что графическое оборудование ограничивалось текстурой с двумя степенями свободы (256, 512, 1024, ...). Таким образом, вы бы потратили значительное количество памяти, не упаковывая спрайты, так как вам пришлось бы увеличить все до степеней двух измерений, прежде чем загружать их. Вокруг этого работала упаковка нескольких спрайтов в одну текстуру.

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

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

...