Деформации против func_detail – влияние на fps в Source

Разработка игр | |

displacement-vs-func_detail

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

К счастью для всех, сегодня я дам на него ответ и положу конец многовековому спору: что выгоднее для производительности в движке Source – func_detail или деформации? Если вы вдруг подумали о проблеме бытия, то мне искренне жаль вас разочаровывать, но бросьте – жизнь всё равно полна разочарований.

Методика

Статья будет короткой, но ёмкой – меньше слов, больше цифр и скриншотов. Всё достаточно прозрачно и чётко систематизировано. Для пущей наглядности я создам две абсолютно идентичных тестовых карты: на одной всё будет реализовано через func_detail, а на другой через деформации. Далее мы сравним fps на обеих картах с одинаковых позиций. Довольно просто, да? Так и должно быть, ведь нам надо сравнить деформации и func_detail в абсолютном выражении, сохраняя все остальные параметры неизменными.

Тестирование

Первой тестовой картой будет карта с деформациями. Вот скриншот с демонстрацией fps.

test2_disp

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

test2_disp_wireframe

Напомню, что в каркасном режиме Source зелёным отображаются деформации, розовым браши (мир, func_detail, браш-энтити и т.п.), синим пропы, а жёлтым декали/оверлеи. На этой карте fps составляет 289. Теперь давайте взглянем, сколько кадров в секунду выдаёт карта с func_detail. Долгожданный скриншот уже здесь:

test2_detail

Сюрприз, сюрприз. Тут мы наблюдаем 330 fps, что намного быстрее версии с деформациями. Ну и каркасный режим, чтобы развеять любые сомнения:

test2_detail_wireframe

По правде говоря, я думал, результаты будут примерно равными, раз уж движок и с тем и с другим справляется хорошо, но в конце концов Source – он ведь про BSP, так что по сравнению с полигональными сетками браши пользуются небольшими привилегиями (впору задуматься о теории заговора).

А теперь из этого вытекает вопрос: стоит ли нам полагаться исключительно на func_detail? Конечно же нет. Оба варианта имеют свои неудобства и преимущества, и вы непременно окажетесь в тупике, пользуясь только одним. Идеальным решением будет брать самое лучшее от обоих вариантов.

Как насчёт совместить их в нашей маленькой тестовой карте: давайте сделаем стены из деформаций, а двери, окна, рамы и крыши из func_detail. Готовьтесь, скриншот уже здесь:

test2_mix

Так гораздо лучше, правда? Теперь у нас 311 fps, вполне себе золотая середина. Ну и без каркасного скриншота мы не обойдёмся:

test2_mix_wireframe

Итак, чему мы сегодня научились? Что ж, помимо очевидного применения деформаций в природном рельефе (камни, скалы, извилистые/бугристые дороги), где они необходимы, будет неплохой идеей разбавить ими общий счётчик брашей, который непременно достигнет максимума на детализированной карте. Вы сохраните fps на высоких значениях и сможете добавлять дополнительные постройки, не боясь упереться в потолок разрешённых брашей (ещё один приемлемый вариант – замена брашей моделями/пропами, но это уже выходит за рамки нашей статьи).

Я человек науки, и я знаю, что одного образца недостаточно для однозначных выводов. Ничего страшного, у меня есть вторая тестовая карта, на которой мы проверим обнаруженные ранее факты. Сама идея двух одинаковых карт остаётся прежней, но теперь мы добавим тут и там статичных/физических пропов и ещё немного декалей. Начнём с версии с деформациями:

test_disp_a

230 fps, в целом недурно. Проверим под другим углом:

test_disp_b

220 fps, более-менее то же самое. Теперь каркасный скриншот:

test_disp_wireframe

Деревья на фоне в обеих версиях – func_brush, так что тут все на равных.

И вот, настал момент истины, которого вы так ждали: будет ли fps выше в версии с func_detail, подтверждая мои изыскания, или же я публично опозорюсь? Скриншот поможет разобраться:

test_detail_a

Я знал, что я прав, и вовсе не волновался (не считая только что вытертого со лба холодного пота). 255 fps в позиции A. Теперь проверим позицию B под другим углом:

test_detail_b

250 fps. Да, вот он, сладкий вкус победы… простите, увлёкся. Кхм… Вернёмся к научному подходу. Каркасный скриншот в виде доказательства:

test_detail_wireframe

Резюмируем все действия и цифры в аккуратной таблице:

displacement-vs-func_detail-sheet

Вы сами видите разницу между обеими версиями карт и сглаживание этой разницы в смешанной версии. Цифры говорят сами за себя.

Подведение итогов

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

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

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

Автор will2k, MapCore: Displacement Vs. Func_detail.

Изучаем Source

Владимир FrostBite Хохлов frostbite@progamer.ru

Поделиться

Обсудить