Lo of the Dark 0.12.7 - Оптимизация во все поля

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

Основное

Главное, над чем я работал - это оптимизация игры. Хотя графония в проекте почти нет, движок, который я пользую, GLScene, как я отмечал ранее, не рассчитан на столь бесцеремонное обращение. Во-первых, он ожидает bsp-древо как основу того, с чем придется работать. Если не бсп, то, хотя бы, террейн. Здесь нет ни того, ни другого: уровень есть набор кусочков, представленных полигональными мешами. Причем даже на уровне 20х20 таких мешей набирается свыше 600. Плюс их надо постоянно обновлять по мере продвижения игрока - выводить как видимую только часть уровня. В итоге ежесекундно движок делает несколько десятков тысяч пусть и мелких, но телодвижений. Старая имплементация была далека от оптимума, и потому более крупные и насыщенные уровни, особенно те, на которых были объекты с заданным поведением, буквально клали довольно производительные компьютеры на лопатки.
Пришлось переписывать. Теперь игра обрабатывает уровень раз в секунду, а при движении и поворотах персонажа проводит дополнительные, упрощенные пересчеты (чтоб минимизировать или исключить мерцание объектов или кусков уровня), а частота обновления анимаций объектов с поведением была существенно урезана.
Увы, этого оказалось недостаточно. Так что в нагрузку к этим системам, пришлось приписывать автоматическую пересчитывалку дальности отрисовки уровня, которая следит за тем, чтоб показатель FPS не проседал ниже заданной отметки (по умолчанию - 30). Так стало получше, и теперь в целом игра выдает более-менее стабильную частоту кадров.
Ну а на добивание пришлось прикручивать к редактору новый функционал зон видимости. Эта фишка позволяет настраивать отображение частей уровня из других частей, тем самым добиваясь экономии ресурсов еще и за счет этого.

Мелочи и плюшки

Контент игры с прошлого раза почти не изменился - ну, разве что, на паре-тройке уровней стало больше декораций. Зато по текстовке стало поприятнее. Теперь игра позволяет прописывать предметам и монстрам текстовые описания. Они есть не у всех объектов обеих категорий, но у значительной части эти текстовочки таки появились.
Заодно я передвинул справочную информацию по управлению инвентарем и книгой заклинаний в гораздо более приметное место, а заодно научил шрифт описаний объектов и карт уменьшаться, когда окно значительно меньше приемлемого разрешения.

Скачатъ?



Просмотров: 1 676

alexprey #1 - 4 года назад 2
Рад снова видеть апдейты для игрушки)
Правда оптимизация похожа на костыли... А GLScene построен на основе вершинных/индексных буферов?
Дарин #2 - 4 года назад 0
alexprey:
Рад снова видеть апдейты для игрушки)
Правда оптимизация похожа на костыли... А GLScene построен на основе вершинных/индексных буферов?
Костыли и есть ) Причем там костыли подпирают костыли, подпирающие костыли =)
По технической части вопроса - ваааарп, этого я не знаю О__о Покопавшись в документации, четкого ответа не нашел, а значит надо рыть глубоко под капот Сцены, чтоб познать. Она однозначно работает на основе системы каких-то буферов, это да, но не думаю, что такой ответ сильно поможет =) Мне откровенно недостает профессионализма (гы) чтоб дать адекватный ответ :(
alexprey #3 - 4 года назад 0
Просто есть подозрение, что твои объекты размещаются в разных буферах. И поэтому для этого требуется время на переключение между ними (постоянно гоняется память). Я помню тогда еще на плюсах для директа пытался уменьшить кол-во переключений между буферами и реализовал один буфер на группы объектов. И за счет этого уменьшалось кол-во обращений к видео-карте, отсюда и прирост к производительности получался
Дарин #4 - 4 года назад 0
alexprey:
Просто есть подозрение, что твои объекты размещаются в разных буферах. И поэтому для этого требуется время на переключение между ними (постоянно гоняется память). Я помню тогда еще на плюсах для директа пытался уменьшить кол-во переключений между буферами и реализовал один буфер на группы объектов. И за счет этого уменьшалось кол-во обращений к видео-карте, отсюда и прирост к производительности получался
Мне, чесгря, кажется, что проблема больше в модульной структуре самой данной конкретной игры. Слишком много всего происходит. Сцена по идее работает так: создали уровень, загрузили в него объекты, и больше не трогаем, все, что надо, за нас делает обрезка границы камеры и туман. Но в этом-то проекте уровень все время меняется или может меняться, вот и приходится напрягать двигло не тем, чем надо (
prog #5 - 4 года назад 0
Определенно нужно запекать отдельные объекты в один по возможности - при твоем уровне детализации моделей, для видеокарты и процесса рендеринга стоимость добавления одного объекта намного выше стоимости удвоения всех его вершин. А если еще и двигло делает лишние операции на каждый чих с изменением геометрии уровня, то никакого суперкомпьютера не хватит чтобы это поднять.
P.S. Есть у меня одна мысль, но об этом сейчас напишу в личку.
alexprey #6 - 4 года назад 0
Кст, твои арты к игре, как всегда на высоте!)