Учусь писать движки и игры на них и сейчас обстоит проблема в том, чтобы рисовались только те элементы на сцене, которые видны на экране. Как это называется?
Я вроде как понял что в этом может помочь BSP-дерево, типа бинарное разбиение пространства, это оно?
Я пока не понял как это bsp дерево работает с моделями. Есть пример кода из книги, но не ясно как этим пользоваться. Я даже подумал сделать что-то своё, но пока приходит на ум только в начале игры сделать анализ каждой позиции камеры и определить какие объекты попадают на камеру. Потом сохранить это в файл и доставать из файла при каждом запуске игры.
Но я думаю, что BSP сделано хорошо, но правильно ли я понял, что это именно то что нужно?
То-есть нужно сделать так, чтобы не нужно было по каждому элементу игры пробегаться каждый раз при рисовании, а должна быть какая-то структура, которая хранит уже разложенные объекты.
Или нужно при каждом движении пробегаться по каждому элементу и строить BSP-дерево?
v7
> Как это называется?
backface cull
отсекание граней.грань которая полигон с задней стороны(не смотрит в камеру) рендеру не подлежит.значит в экране рендерится меньше объектов
см нормали к полигонам.
Rikk
Я когда делал как-то игру, которую не закончил. Там карта мира состояла из множества тайлов. 100x100. По такому количествую при каждой отрисовке будет накладно пробегаться, поэтому я пошел на ухищрение. Но мне бы хотелось более грамотный способ узнать как делается.
гугли книга название -опенжл супер книга-.примерно
Райт Р.С.-мл., Липчак Б. "OpenGL. Суперкнига" (2006, DjVu)
Rikk
Спасибо, а что там искать?
рендеринг оптимизация объекты в камере отсечение
Rikk
Не думаю что там написано то, что нужно. Мне нужно отрисовывать карту 100x100 с видом сверху. Карта поделена на массив и надо знать какие из 10 000 объектов рисовать в экране.
v7
> надо знать какие из
для начала пробуй задавать минимальные и максимальные ху которые появляются в окне.это уже не вся карта а некая небольшая зона=число объектов в камере меньше=оптимизация.
Rikk
Вот я делал типа такого, как ты предлагаешь, но есть ли какой-то научный способ, типа как это в движках реализовано? Я искал в нескольких движках и не нашел того, что нужно. Не нашел кода как они объекты расскладывают.
v7
> Не нашел кода как они объекты расскладывают.
> https://youtu.be/1u6ajVn0VLw?t=5
Если я всё правильно понял, вам нужен кольцевой буфер
HungryBoba
Я знаешь как подумал сделать. Когда я создам например 100x100 объектов, то для них я создать блоки, и в каждый блок закину например 10x10 или 20x20 тайлов. И в рендере буду проверять минимальные размеры блоков и если размер попадает на экран, то рисовать весь блок.
v7
> но есть ли какой-то научный способ
по чистой науке.
процессор работает только одним методом—обращается на адрес.почитать записать из адреса в адрес.
других способов в науке нет.
отсюда логически выходит—работать с адресами памяти.метки указатели сортировки(один тайл лежит по адресу 100 а след за ним тайл лежит по адресу 200.промежуток сто адресов.отсортировать один тайл адрес 100,след тайл адрес 101).
v7
> Как это называется?
Perspective culling.
v7
> Я вроде как понял что в этом может помочь BSP-дерево,
Если хочешь велосипед, то пили октотрее на унордеред мапах(флат мапах а не стдшных).
v7
> По такому количествую при каждой отрисовке будет накладно пробегаться
Чушь. Нарисовать миллион спрайтов можно за 1 мс. Отсечение по деревьям нужно ежели у тебя миллионов 10 спрайтов или с 100к полигональных моделей.