Деформации против func_detail – влияние на fps в Source
Суть вопроса. Испокон веков человечество терзается одним мучительным вопросом. Философы Древней Греции и Рима безрезультатно корпели над его решением. В Средние века за него взялись алхимики, но и им он не покорился. Даже великие умы индустриальной эпохи не продемонстрировали ощутимого прогресса.
К счастью для всех, сегодня я дам на него ответ и положу конец многовековому спору: что выгоднее для производительности в движке Source – func_detail или деформации? Если вы вдруг подумали о проблеме бытия, то мне искренне жаль вас разочаровывать, но бросьте – жизнь всё равно полна разочарований.
Методика
Статья будет короткой, но ёмкой – меньше слов, больше цифр и скриншотов. Всё достаточно прозрачно и чётко систематизировано. Для пущей наглядности я создам две абсолютно идентичных тестовых карты: на одной всё будет реализовано через func_detail, а на другой через деформации. Далее мы сравним fps на обеих картах с одинаковых позиций. Довольно просто, да? Так и должно быть, ведь нам надо сравнить деформации и func_detail в абсолютном выражении, сохраняя все остальные параметры неизменными.
Тестирование
Первой тестовой картой будет карта с деформациями. Вот скриншот с демонстрацией fps.
Сама карта очень простая, состоит из семи одинаковых домов, стоящих в заранее определённых местах и окружённых четырьмя стенами. Детализации домов достаточно для небольшой нагрузки на рендерный движок. Для скептиков приложу скриншот в каркасном режиме, можете убедиться, что всё действительно сделано из деформаций.
Напомню, что в каркасном режиме Source зелёным отображаются деформации, розовым браши (мир, func_detail, браш-энтити и т.п.), синим пропы, а жёлтым декали/оверлеи. На этой карте fps составляет 289. Теперь давайте взглянем, сколько кадров в секунду выдаёт карта с func_detail. Долгожданный скриншот уже здесь:
Сюрприз, сюрприз. Тут мы наблюдаем 330 fps, что намного быстрее версии с деформациями. Ну и каркасный режим, чтобы развеять любые сомнения:
По правде говоря, я думал, результаты будут примерно равными, раз уж движок и с тем и с другим справляется хорошо, но в конце концов Source – он ведь про BSP, так что по сравнению с полигональными сетками браши пользуются небольшими привилегиями (впору задуматься о теории заговора).
А теперь из этого вытекает вопрос: стоит ли нам полагаться исключительно на func_detail? Конечно же нет. Оба варианта имеют свои неудобства и преимущества, и вы непременно окажетесь в тупике, пользуясь только одним. Идеальным решением будет брать самое лучшее от обоих вариантов.
Как насчёт совместить их в нашей маленькой тестовой карте: давайте сделаем стены из деформаций, а двери, окна, рамы и крыши из func_detail. Готовьтесь, скриншот уже здесь:
Так гораздо лучше, правда? Теперь у нас 311 fps, вполне себе золотая середина. Ну и без каркасного скриншота мы не обойдёмся:
Итак, чему мы сегодня научились? Что ж, помимо очевидного применения деформаций в природном рельефе (камни, скалы, извилистые/бугристые дороги), где они необходимы, будет неплохой идеей разбавить ими общий счётчик брашей, который непременно достигнет максимума на детализированной карте. Вы сохраните fps на высоких значениях и сможете добавлять дополнительные постройки, не боясь упереться в потолок разрешённых брашей (ещё один приемлемый вариант – замена брашей моделями/пропами, но это уже выходит за рамки нашей статьи).
Я человек науки, и я знаю, что одного образца недостаточно для однозначных выводов. Ничего страшного, у меня есть вторая тестовая карта, на которой мы проверим обнаруженные ранее факты. Сама идея двух одинаковых карт остаётся прежней, но теперь мы добавим тут и там статичных/физических пропов и ещё немного декалей. Начнём с версии с деформациями:
230 fps, в целом недурно. Проверим под другим углом:
220 fps, более-менее то же самое. Теперь каркасный скриншот:
Деревья на фоне в обеих версиях – func_brush, так что тут все на равных.
И вот, настал момент истины, которого вы так ждали: будет ли fps выше в версии с func_detail, подтверждая мои изыскания, или же я публично опозорюсь? Скриншот поможет разобраться:
Я знал, что я прав, и вовсе не волновался (не считая только что вытертого со лба холодного пота). 255 fps в позиции A. Теперь проверим позицию B под другим углом:
250 fps. Да, вот он, сладкий вкус победы… простите, увлёкся. Кхм… Вернёмся к научному подходу. Каркасный скриншот в виде доказательства:
Резюмируем все действия и цифры в аккуратной таблице:
Вы сами видите разницу между обеими версиями карт и сглаживание этой разницы в смешанной версии. Цифры говорят сами за себя.
Подведение итогов
Мы можем сделать вывод, что полагаясь исключительно на func_detail, вы быстро достигнете допустимого предела брашей, и это сильно ограничит ваш полёт фантазии. Также можно столкнуться с проблемой Т-образного стыка, а в областях с обилием func_detail возможны мерцания и исчезновения геометрии при взгляде под определённым углом.
С другой стороны, обратившись только к деформациям, вы потеряете в производительности. К тому же, есть вероятность заметных швов и разрывов между деформациями.
Следовательно, будет лучше грамотно распределять деформации и func_detail. Производительность поднимется, улучшится освещение возле граней, и вы получите природный рельеф, даже близко не подобравшись к пределу брашей – берите лучшее от обоих вариантов.
Автор will2k, MapCore: Displacement Vs. Func_detail.
Изучаем Source
- Играем в Source SDK, руководство по маппингу для начинающих
- Играем в Source SDK, триггеры
- Играем в Source SDK, освещение и отражение
- Играем в Source SDK, как создавать текстуры
- Влияние тяжёлых и лёгких ассетов Source на производительность
- Гайд по Counter-Strike: Global Offensive. Создание профессиональных карт
- Контр-картография: CSGO возрождает de_cbble