Среда, 20 Ноября 2024, 02:22

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Вопросы Оптимизации - [LOD] [BSP] [Frustum Culling] [Octree]
AkyltistДата: Среда, 28 Октября 2009, 02:28 | Сообщение # 1
заслуженный участник
Сейчас нет на сайте
Сегодня работал над игрой и столкнулся с такой проблемой, при загрузке на локацию 1500 травинок, не важно даже какого они типа, фпс довольно таки сильно падает, аж до 120, а мне такой расклад совершенно не нравится.

Генерация травы идет не полигонально, то есть трава представляет собой billboard построенный тремя плайнами и наложением текстуры с альфа каналом.

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

На основе таких данных считаю что - LOD использовать по крайней мере глупо. Текстура берется на точке инициализации и сразу создается 7-15 объектов травы с различной текстурой, после чего я данные объекты копирую в память и согласно файлу координат размножаю как прокси объекты. Т.Е.и тут работаем с минимальными затратами. Какая тут может быть детализация.(

Теперь встает вопрос а надо ли делать отсечение не видимых граней, ведь проверка на область видимости для такого количества объектов дело ресурсоемкое, в принципе я собираюсь сделать в выходном потоке проверку на видимость объекта, если он видим то включать его в рендер и отсекать грани, но мне придется работать с динамичесскими данными, высвобождением памяти и другими последствиями подобного рода алгоритмов, что тоже приведет к поеданию процессорного времени, хотя давольно таки должно облегчить FPS.

А теперь вопрос, кто сталкивался с рендером травы и деревьев, как Вы оптимизируете данные участки кода? есть ли еще методы? Или же придется полностью переходить на динамику и ручками работать с памятью средствами VBO, просто не хотелось бы терять гибкость(

nilremДата: Среда, 28 Октября 2009, 11:32 | Сообщение # 2
Просветленный разум
Сейчас нет на сайте
Ну ЛОД точно ни к чему. Чего там детализировать. Разве что для деревьев, да и то лучше использовать билборд с нормальной текстурой, чем "лысое" дерево.
Относительно BSP, подозреваю, что трава у тебя размещается процедурно(или кординаты каждой травинки прописаны заранее?), так что проку от разбиения пространства ноль.
Ну а вот без VFC вряд ли обойдешься. Он хоть и не самый качественный, зато самый быстрый.

Quote (Akyltist)
ведь проверка на область видимости для такого количества объектов дело ресурсоемкое

А у тебя что, чем-то сильно загружен процессор? Думаю, вряд ли сильнее чем видео.

Quote (Akyltist)
размножаю как прокси объекты.

Похоже это и есть узкое место, ведь в таком случае каждый объект рисуется отдельно. Здесь явный выигрыш в памяти(кстати - мизерный), но потеря в скорости. 1500 объектов по 6 полигонов да еще и двусторонние текстуры с альфой. Ужас.
Сложнее, но лучше, загнать все билборды в один буфер.

В общем, бери PerfHUD и вперед искать, где наибольшие затраты времени.
зы: Вот только OpenGL он не поддеживает.)


Windmill 2

WindMill 2D Game Engine
AkyltistДата: Среда, 28 Октября 2009, 13:36 | Сообщение # 3
заслуженный участник
Сейчас нет на сайте
Quote
Похоже это и есть узкое место, ведь в таком случае каждый объект рисуется отдельно.

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

Quote
А у тебя что, чем-то сильно загружен процессор? Думаю, вряд ли сильнее чем видео.

да тут Вы наверняка правы, пару тысяч тактов потерять. Попробую наверное через проверку schild-ов на асме накидать это местечко, будем надеяться украду еще хотя бы соточку fps.

Quote
В общем, бери PerfHUD и вперед искать, где наибольшие затраты времени.
зы: Вот только OpenGL он не поддеживает.)

Да и сижу я сейчас на АТИ, хотя вот рядом 9800 стоит, но на ней то все летает, а меня это не устраивает. Гдето была СДК для Оглы на тест FPU, но копать не охота, попробкую через
_QueryPerformanceFrequency();
_QueryPerformanceCounter( );
Отловить самые узкие места, на что стоит тратить время на что нет.

Если у кого еще есть какие мысли не стесняемся, по теме разумеется.

WXZRWДата: Среда, 28 Октября 2009, 14:09 | Сообщение # 4
Thousand faces conspiration
Сейчас нет на сайте
Quote (Akyltist)
Генерация травы идет не полигонально, то есть трава представляет собой billboard построенный тремя плайнами и наложением текстуры с альфа каналом.

Billboard насколько я понимаю может поворачиваться относительно камеры плеера? Если да, то не вижу смысла, у тебя фактически сэмпл травы должен выглядеть нормально со всех сторон ибо у тебя 3 plane а не 1 plane.

Quote (Akyltist)
Текстура, накладываемая на прямоугольники, состоит из нескольких элементарных текстур. Это сделано для того, чтобы можно было добиваться разнообразия травы.

Сильно влиять не будет, тем более если у тебя прокси.

Quote (Akyltist)
На основе таких данных считаю что - LOD использовать по крайней мере глупо

Для травы не вижу смысла. Есть вариант - урезать количество травы в зависимости дальности семплов от игрока. Бей траву в мире на ячейки, уменьшай количество семплов в ячейке по дальности. LOD в том виде чем он традиционно является - для травы я думаю не нужен. Вообще ты можешь сделать отдельный network для травы и замешать его с октри или с тем, чем ты мир делишь.

Quote (Akyltist)
Теперь встает вопрос а надо ли делать отсечение не видимых граней, ведь проверка на область видимости для такого количества объектов дело ресурсоемкое, в принципе я собираюсь сделать в выходном потоке проверку на видимость объекта, если он видим то включать его в рендер и отсекать грани, но мне придется работать с динамичесскими данными, высвобождением памяти и другими последствиями подобного рода алгоритмов

Зависит от способа, я бы предложил опять же отсекать как минимум ячейку за один этап, т.е. группу обьектов травы. Но возможно при подавлении количества травы в зависимости от дальности - этот вопрос снимется.

Quote (Akyltist)
А теперь вопрос, кто сталкивался с рендером травы и деревьев, как Вы оптимизируете данные участки кода? есть ли еще методы?

Трава отдельным network (cells/nodes), деревья как обычный обьект. Для деревьев LOD это подавление количества треугольников меша, для травы - подавление количества семплов на ячейке. Также само через прокси все - 1 обьект с мешем, остальные обьекты с матрицами.

У меня в этом плане проще(или сложнее, я хз) - обьекты могут быть обьединены в группировки, тогда действия идут не по обьектно, а сразу с группой
обьектов.

AkyltistДата: Среда, 28 Октября 2009, 14:24 | Сообщение # 5
заслуженный участник
Сейчас нет на сайте
Quote
Зависит от способа, я бы предложил опять же отсекать как минимум ячейку за один этап, т.е. группу обьектов травы. Но возможно при подавлении количества травы в зависимости от дальности - этот вопрос снимется.

Уже занимаюсь этим, метод хорош, единственный недостаток, это области выгрузки и подгрузки, подгружать всегда приходится больший объем чем нам необходим, чтобы камера не находилась постоянно на стыке. Думаю сделать несколько массивов травы и проверять центры массивов на вхождение в область видимости. Это заметно снизит количество которое необходимо для рендеринга, и учитывая видимые массивы не так уж и много придется делать проверок на отсечение невидимых граней. Как один недостаток, теряется гибкость создания карт для игры, так как локаций довольно таки много, ну тут уж ничего не поделаешь. Еще подумываю массивы при инициализации засунуть в GPU и брать непосредственно от туда, 3 метра памяти GPU не критично)

Quote
деревья как обычный обьект

то есть как обычный меш типа зданий?
Quote
Для деревьев LOD это подавление количества треугольников меша

у меня странное желание заменять дальние деревья на спрайты с одного буфера, но пока не столкнулся нет необходимости...

Спасибо за подсказки, если кто до чего новогодойдет, то поделитесь плз.

WXZRWДата: Среда, 28 Октября 2009, 14:41 | Сообщение # 6
Thousand faces conspiration
Сейчас нет на сайте
Quote (Akyltist)
Уже занимаюсь этим, метод хорош, единственный недостаток, это области выгрузки и подгрузки, подгружать всегда приходится больший объем чем нам необходим, чтобы камера не находилась постоянно на стыке. Думаю сделать несколько массивов травы и проверять центры массивов на вхождение в область видимости. Это заметно снизит количество которое необходимо для рендеринга, и учитывая видимые массивы не так уж и много придется делать проверок на отсечение невидимых граней. Как один недостаток, теряется гибкость создания карт для игры, так как локаций довольно таки много, ну тут уж ничего не поделаешь. Еще подумываю массивы при инициализации засунуть в GPU и брать непосредственно от туда, 3 метра памяти GPU не критично)

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

Quote (Akyltist)
то есть как обычный меш типа зданий?

У обьектов есть проперти, т.е. можно опознать как обрабатывать обьект. Мой двиг среднего уровня (класса В я бы сказал), поэтому отрисовка деревьев идет AlphaFunc без лишних замутов. В итоге выглядит нормально, скорость хорошая. Из 280К трианглов всей геометрии в мире более 140К было на деревья, т.е. лес... Падение фпс было сравнительно небольшим, примерно как от любых обычных обьектов.

Quote (Akyltist)
у меня странное желание заменять дальние деревья на спрайты с одного буфера, но пока не столкнулся нет необходимости...

Импостор или именно спрайт? Хммм, сделай лучше очень сильный LOD, думаю будет выглядеть лучше спрайта, по скорости же отличие будет небольшим сравнительно. Или подавляй количество деревьев (вообще не рисуй) на ячейке. Но это уже слишком радикально.

Если хочешь более жестокий способ - тогда предложу occlusion culling. Либо image based либо geometry analysis.

Либо доки SIGGRAPH по деревьям, но я не видел там ничего такого особого.

AkyltistДата: Среда, 28 Октября 2009, 14:55 | Сообщение # 7
заслуженный участник
Сейчас нет на сайте
Quote
Либо доки SIGGRAPH по деревьям, но я не видел там ничего такого особого.

там нет ничего такого чего бы я не знал.

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

WXZRWДата: Среда, 28 Октября 2009, 15:02 | Сообщение # 8
Thousand faces conspiration
Сейчас нет на сайте
Quote (Akyltist)
На счет импостера - Вы правы именно импостер, не стоит путать терминологию

Ну вот если импостор, тогда другое дело. Все же лучше спрайта, имхо.

Quote (Akyltist)
Генерация деревьев идет по L системе, с использованием самолетика, поэтому в зависимости от дистанции до группы деревьев просто снижение Branch параметров, такие как радиус и количество ветвлений и снижение текстуры, этого вполне хватает, но предполагается, что можно будет летать в игре, если не в изначальной конфигурации, то в более поздней, однако потенциал на это хочу заложить заранее, чтобы не пришлось мучатся

У меня несколько проще - все деревья смоделены и поставлены на карте маппером... Поэтому таких вопросов у меня не возникает. Когда-то занимался этим тоже, но для моего проекта это просто нерентабельно и не нужно. Поэтому деревья это в принципе тоже что и другие обьекты, но на них дейстсвует AlphaFunc. Хотя при желании можно сделать что-то дополнительно, так как любой обьект можно опознать по проперти. Летать у меня нельзя вообще, можно только ходить...

Кстати фог одобряю, идея неплохая. Много чего можно скрыть в тумане =)

AkyltistДата: Среда, 28 Октября 2009, 20:01 | Сообщение # 9
заслуженный участник
Сейчас нет на сайте
Поколдовал сегодня над деревьями с травой, сейчас работаю над системой генерации матриц выдимости, чтобы загружать их непосредственно с картой а не генерировать в процессе игры. Пришел к выводу, что квадри лучше всего способствует работе с деревьями, правда было бы еще не плохо организовать для них импостеры, но там опять свои заморочки с дистанцией камеры, объектов и пересечений, ну думаю и это не сложно будет обойти.

--------------------------------
A,S,D,W
V
Esc
Shift
--------------------------------

  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг