Оптимизация.

Производительность... Это слово преследует нас повсюду. Производительность компьютера... Производительность видеокарты... И так далее. "Какая может быть связь между маппингом и производительностью?" - спросите вы. Да самая прямая! Любая карта - это огромнейший набор брашей (простой и сложной геометрии) и множество моделей (статических и физических). Все это компьютеру надо обработать и вывести на экран. Не забывайте так же, что модели могут взаимодействовать друг с другом и игроком. То есть картина мира на вашей карте постоянно изменяется и компьютер вынужден постоянно делать перерасчет - что изменилось и как оно расположено сейчас... Если не использовать некоторых хитростей, то карта будет перерассчитываться полностью, а ведь это ТЫСЯЧИ брашей и моделей. И вся эта нагрузка ложится на ваш процессор и видеокарту...
Так как же облегчить жизнь своему компьютеру и компьютерам тех людей, что будут играть на вашей карте? Об этом мы и поговорим....

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

Давайте разберем этот вопрос на примере. Посмотрите на этот рисунок:

Проект


Как вы видите, у нас есть четыре зоны, в одной находиться игрок, в другой - некоторые объекты. Если следовать привычной нам логике, то игрок объектов не видит, так как они расположены за стеной. Однако ваша видеокарта, прекрасно их видит и отрисовывает. Убедиться в этом можно, если скомпилировать проект и ввести в консоли команды:
  • sv_cheats 1
  • mat_wireframe 1

Как видит уровень игрок:

Отображение уровня для игрока


Как видит уровень видеокарта:

Отображение уровня для видеокарты


Как видите, не смотря на то, что объекты скрыты от взгляда игрока, видеокарта прекрасно их видит и тратит ресурсы на их обработку и отрисовку. Из-за этой особенности, у вас падает FPS и возрастает нагрузка на видеокарту. Как же облегчить жизнь вашему компьютеру и компьютерам пользователей вашей карты?

Использовать оптимизацию уровня. Этого можно использовать несколько различных возможностей:
во-первых: не игнорируйте параметры StartFadeDist/Pixels и EndFadeDist/Pixels у моделей. Данные параметры отвечают за отрисовку модели вашей видеокартой, дистанция задается в юнитах. Первый параметр определяет расстояние, на котором прорисовывается контур предмета и заливается полупрозрачной текстурой. Второй параметр - определяет расстояние, на котором проявляются все детали предмета и заливает предмет реальной текстурой.
Средняя карта содержит от 2000 моделей и игнорирование этих параметров равноценно нокауту для видеокарты.

Во-вторых: Используйте AREAPORTAL-браши - специальный энтити-объект обладающий переменной прозрачностью. А также не игнорируйте использование Skip- и Occluder-брашей, они могут серьезно вас выручить.

В-третьих: Зонируйте карту! Используйте модульную систему при картостроении. Переулок между двумя улицами, можно использовать как ворота между модулями карты и установить в нем areaportalwindow. НИКОГДА не делайте небо "одной коробкой" на всю карту. Каждую зону карты накрывайте своим Skybox'ом с переходами между зонами. Иначе теряется весь смысл использования вспомогательных брашей. Исключение, только для карт типа - KillBox, маленькие кубические "мясные" карты.

Начнем применять это на учебном уровне, начнем с StartFadeDist/Pixels и EndFadeDist/Pixels моделей. В первом коридоре, изменим эти значения так, что бы сферы не выходили за ширину коридора:

Задание свойств


Посмотрим, как это выглядит в игре:

Отображение уровня для игрока


Как видите, объекты из первого коридора, теперь не отрисовываются вашей видеокартой, но этот способ содержит и небольшую подлость. Увидеть ее можно, если перейти в общий коридор:

Отображение уровня для игрока


Как видите, коридор выглядит пустым, объекты начинают проявляться по мере приближения к ним:

Отображение уровня для игрока


Отображение уровня для игрока


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

Вернем свойства объектов к прежним значениям и опробуем способ номер два, использование служебных текстур. Начнем работу со SKIP-брашей. Запомните, SKIP-браш обязательно должен плотно прилегать к брашам геометрии! Не соблюдение этого простого правила сведет на нуль всю пользу от его использования.
Создайте два SKIP-браша: один расположите вертикально, вплотную к торцам стен, второй - "положите" на стены (помните, SKIP-браш должен плотно прилегать к брашам геометрии):

SKIP-браши


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

SKIP-браши в игре


А вот если выйти в общий коридор, картина моментально и кардинально меняется:

SKIP-браши в игре


Опробуем теперь AREAPORTAL-браш. Так как AREAPORTAL-браши так же должны всеми гранями прилегать брашам геометрии, добавим на карту перемычки:

Перемычки


А уже под ними поставим AREAPORTAL-браши:

AREAPORTAL-браши


Укажем их как "func_areaportalwindow" и настроим:

AREAPORTAL-браши


Так как противолежащие плоскости AREAPORTAL-брашей должны быть изолированы друг от друга, накрываем коридоры вместо SKIP-браша обычным:

AREAPORTAL-браши


Проверяем в игре, что у нас получилось:

AREAPORTAL-браши


Перемещаемся по коридору и видим просто замечательную картину - предметы , скрытые от взгляда, обрезаются AREAPORTAL-брашами:

AREAPORTAL-браши


AREAPORTAL-браши


AREAPORTAL-браши


AREAPORTAL-браши


AREAPORTAL-браши


AREAPORTAL-браши


Казалось бы, вот оно решение, но у func_areaportalwindow AREAPORTAL-браша тоже есть в запасе пакость для маппера. Если отойти на расстояние, на котором func_areaportalwindow переходит в закрытое состояние, то мы увидим, что AREAPORTAL-браш начинает отображать на своей поверхности текстуры неба:

AREAPORTAL-браши


AREAPORTAL-браши


Решить эту проблему можно следующим образом:
1. Создаем браш покрытый текстурой "tools/toolsblack" переводим его в "func_brush";

AREAPORTAL-браши


2. Задаем ему имя, остальные настройки не меняем, растягиваем браш таким образом, чтобы AREAPORTAL-браш был полностью скрыт им (на рисунке показан "разрезанный" func_brush);

AREAPORTAL-браши


3. Меняем свойства AREAPORTAL-браша, задаем имя и указываем браш-маскировку, которому будут передаваться свойства;

AREAPORTAL-браши


4. Повторяем первые три шага для остальных AREAPORTAL-брашей и, в результате, в игре, мы получаем такую картину:

AREAPORTAL-браши


AREAPORTAL-браши


AREAPORTAL-браши


Как вы можете видеть, по мере приближения/отдаления по отношению к AREAPORTAL-брашу, меняется прозрачность привязанного к нему func_brush.

Пришла пора разобраться со следующим способом "ограничения видимости" - Occluder-браши. Приведем наш тестовый проект к первоначальному виду:

Проект


Создадим браш, равный по размерам нашей стене и покроем его текстурой "tools/toolsoccluder":

Occluder-браш


Превратим браш в "func_occluder" не меняя свойств по-умолчанию и совместим его со стеной:

Occluder-браш


Повторяем шаги для оставшихся стен и проверяем результат в игре:

Occluder-браш


Occluder-браш


Occluder-браш


Occluder-браш


Как видите, Occluder-браш оказался самым "нетребовательным" элементом. Достаточно просто создать его. Он не ограничивает обзор геометрии уровня, но на нуль "режет" отрисовку любого энтити-объекта расположенного за ним.

Переходим к третьему пункту - "Зонирование уровня". Как это реализовывается на практике? Обычно переход между зонами выполняется в виде коридора, либо здания. Разберем на примере:

Создадим новый проект и "построим" в нем здание:

Зонирование


Закройте дверные проемы связкой "AREAPORTAL-браш + func_brush" как мы уже разбирали выше, а открытые участки перегородите "забором", SKIP-брашами и OCCLUDER-брашами:

Зонирование


Наполните обе зоны карты моделями, скомпилируйте проект и просмотрите его в игре:

Зонирование


Зонирование


Зонирование


Зонирование


Зонирование


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

Комментариев 0

Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.