Как стать автором
Обновить

Комментарии 20

Спасибо за статью! Ждём следующих частей.
Класс! Спасибо вам за уроки.
Жду следующую часть с нетерпением!
Очень ценю такие обзоры, написано с любовью прям.
Win 7 x64 демка не запускается :(
Хотя постойте, у меня не стоял XNA Framework! Приношу свои извинения.
ForhaxeD, это волшебно!
XNA установлен, но у меня видяха встроенная и демо не запускается, при запуске пишет: No suitable graphics card found.
Это означает, что у вас нет видеокарты с аппаратным DirectX9 на борту/нет драйверов нормальных.
Ну какие-то другие вещи свободно запускаются, например, Terraria 1.0.6, которая использует XNA 4-ой версии.
Это я понял, но ты быстрее написал ;)
Не самая удачная система частиц с точки зрения производительности. класс Particle лучше сделать структурой. Еще можно избавится от необходимости добавления и удаления частиц из списка во время отрисовки. Но в целом для демонстрации принципов работы с XNA вполне подойдет.
Надо бы пул частиц использовать, да
Если интересно, то можно посмотреть вот эту систему частиц mpe,
Точно! О структуре я как-то не подумал, буду использовать структуры, но статьи закончу в таком виде. Спасибо.
Я бы сделал так: делаем большой массив структур, поля которой описывают частицу, причем чтобы этот массив еще и разрастался по необходимости. В этой структуре также было бы поле Active, которое указывало бы, что частица активна. Это в принципе и основной регулятор: нужна частица — ставим Active в true, не нужна — в false. Еще будет массив свободных блоков. Каждый элемент этого массива — это индекс начала свободного блока, где частицы неактивны. Вначале туда помещается один индекс — нуль. При создании частицы берется первый такой свободной блок и в его начало помещается новая частица, а начало смещается на единицу. Если следующая частица также активна, то блок удаляется из списка блоков. При удалении частицы если слева от нее частица неактивна, то в список свободных блоков добавляем индекс текущей частицы. Если добавляем частицу, а список свободных блоков пуст, то значит нужно нарастить массив структур.

Пул — это такая структура данных, в которой удаленные объекты используются повторно.
Как-то ты, Леонид, смело предположил, что сортировка спрайтов не интересна. Во-первых, DepthStencilState никак не относится к сортировке напрямую; этот параметр указывает состояние буфера глубины, который повсеместно используется в трехмерных играх, но и в двумерных можно получить выгоду. Для чего он нужен? При отрисовке каждый пиксель после всех трансформаций имеет три координаты: координаты на экране и глубину. Эта самая глубина сравнивается с тем, что уже записано в буфер определенной операцией сравнения, которая задается состоянием (DepthStencilState). Если пиксель проходит тест, то он передается в пиксельный шейдер и записывается в буфер глубины. Для чего это нужно? Для регулирования порядка отображения спрайтов. Сейчас это делается напрямую: отрисовал один спрайт, потом второй, и вот второй находится над первым. С буфером глубины можно не заботится о порядке отрисовки спрайтов, но при этом если рисовать их в порядке от меньшей глубины к большей, то экономятся пиксели в пиксельном шейдере при перекрывающихся спрайтах, т.к. пиксели спрайта, который находится под пикселями другого спрайта не пройдут тест на буфер глубины.

Тут в дело вступает SpriteSortMode и layerDepth. Точно не знаю, как устроен spriteBatch (это нужно еще проверить), но я надеюсь, что layerDepth регулирует как раз ту самую глубину. Я писал свой собственный OutputBatch, который поддерживает вывод помимо спрайтов еще и примитивы, и там depth я сделал одним из главных параметров. Очень важная штука: SpriteSortMode.Texture — сортировка по текстурам. При смене текстуры необходимо менять состояние устройства, а это накладно, поэтому лучше спрайты с одинаковой текстурой группировать. В случае с системой частиц это не нужно. Также это не нужно, когда кол-во разных текстур не далеко ушло от количества спрайтов. В этом случае лучше сделать одну большую текстуру и воспользоваться sourceRectangle при использовании Draw. Это сильно повышает производительность.
Если у вас большой опыт, поделитесь знаниями в области 2д. Желательно примеры, очень интересна данная тема.
Перевыложите пожалуйста исходники и демо, а то у меня ничего не скачалось — ERROR 404 — Not Found!
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории