Я знаю, что эффективность является ключевым моментом в программировании игр, и у меня был некоторый опыт рендеринга «карты» ранее, но, вероятно, не лучшим образом.
Для 2D-игры TopDown: (просто визуализируйте текстуры / плитки мира, ничего больше)
Скажем, у вас есть карта 1000x1000 (плитки или что-то еще). Если плитка не в поле зрения камеры, она не должна отображаться - это так просто. Не нужно рендерить плитку, которая не будет видна. Но поскольку у вас на карте есть 1000x1000 объектов или, возможно, меньше, вы, вероятно, не захотите перебирать все 1000 * 1000 плиток, просто чтобы посмотреть, будут ли они отображаться или нет.
Вопрос: Как лучше всего реализовать эту эффективность? Чтобы он «быстрее / быстрее» мог определить, какие плитки предполагается отображать?
Кроме того, я не строю свою игру вокруг плиток, визуализированных с помощью SpriteBatch, поэтому здесь нет прямоугольников, фигуры могут быть разных размеров и иметь несколько точек, например изогнутый объект из 10 точек и текстуру внутри этой формы;
Вопрос: Как вы определяете, находится ли этот вид объектов «внутри» вида камеры?
Это легко с прямоугольником 48x48, просто посмотрите, виден ли он X + Width или Y + Height в поле зрения камеры. Отличается несколькими точками.
Проще говоря, как эффективно управлять кодом и данными, чтобы не обходить / перебирать миллионы объектов одновременно.
Когда у вас много мобильных объектов, вы должны хранить их по их координатам в многомерной древовидной структуре. Таким образом, вы можете эффективно получить список всех объектов, которые находятся внутри данного прямоугольника. Вы даже можете упорядочить их по их x- или y-координатам, что важно для порядка отрисовки, когда спрайты объекта перекрываются.
Это также очень пригодится для обнаружения столкновений.
Подробности смотрите в статье в Википедии о деревьях kd .
Когда двумерные деревья слишком сложны для вас, есть и более простая, но не менее эффективная альтернатива: храните объекты как дочерние элементы плиток. Когда вы перемещаете объект, вы удаляете его из списка объектов его старой плитки и помещаете его в список объектов новой. Когда вы рисуете объекты, вы снова перебираете плитки в области просмотра и извлекаете их объекты. Затем вы сортируете их по y-координатам и рисуете.
источник
Не знаю, лучший ли это способ, но вот как я научусь это делать:
у вас есть двумерный массив «плиток»
и вы определяете положение «камеры» с помощью Vector2, вы будете рендерить только то, что находится внутри сцены, большой прямоугольник - это то, что вы видите на экране, бесполезно рисовать остальную часть сцены.
Теперь вам нужно получить смещения, если вы хотите, чтобы ваша камера находилась в центре сцены:
Теперь, в какой части массива видимые плитки начинаются и заканчиваются?
и в вашем методе рисования вы просто просматриваете видимую часть массива:
источник
У вас может быть одно растровое изображение, которое является целой сценой, но не отображается. А затем отображается растровый слой камеры размером с экран, который просто рисует из всей сцены, но только из той части, которая должна быть показана.
источник