Использование одной текстуры на плитку не очень эффективно. Тем более, что это означает, что вы не можете выполнять пакетирование (в любом реальном смысле).
Если по какой-то причине вам НУЖНО иметь их в качестве отдельных текстур в вашем контент-проекте (проще редактировать одну плитку и т. Д.), Вы можете довольно легко скомпилировать их в карты листов после загрузки.
Как вы делаете это в основном:
1: загрузить количество плиток (скажем, 40 32 * 32 плиток)
2: Определите хороший размер текстуры для карты тайла:
корень квадратный из 40 равен 6. что-то, поэтому мы округляем до 7. 7 * 32 - это 224, что хорошо, но 256 лучше, поэтому давайте сделаем текстуру 256x256. (вы можете сделать код, который выяснит это на лету)
3: создайте Rendertarget2D нужного размера.
4: активировать цель визуализации.
5: рендеринг тайлов на цели рендера:
int x, y = 0;
foreach (var tile in allTiles)
{
RenderTile(tile, x*32, y*32);
x++;
if (x >= 8)
{
x = 0;
y++;
}
}
Для бетч-рендеринга у вас есть буфер вершин с 4 * 40 вершинами. каждый набор из 4 имеет значение, указывающее индекс четырехугольника, которому он принадлежит (0,1,2 и т. д.). В вашем шейдере у вас есть массив матриц [40] для расположения плиток, а также массив tileIndex (int [40]) для определения того, какую плитку рендерить из карты тайлов.
Извините, но сейчас у меня нет времени написать весь код шейдера: s
Другой трюк, который я использовал в наших играх, - это предварительный рендеринг уровня на большие плитки (640x360), что значительно уменьшает количество вызовов на ничью, особенно при работе с 5+ слоями плиток из разных наборов плиток. , Единственное, что он не работает с динамическими плитками (анимированными плитками и т. Д.), Но вы можете пометить их и визуализировать их нормально, если хотите ...