Методы оптимизации карт

Материал из Наша Wiki - Наша энциклопедия Half-Life
Перейти к: навигация, поиск

Как найти причину(-ы) низкого fps

Поиск причины низкого fps начинаеться с проверки того, рендеряться ли участки карты невидимые игроку. Загрузите свою карту, зайдите в проблемное место и последовательно наберите в консоли две команды: sv_cheats 1 и mat_wireframe 1
После набора второй команды влючиться режим рендеринга "wireframe" - только ребра брашей, без текстур - что позволит увидеть все, что в данный момент рендериться. Оптимизация видимости осуществляеться с помощью HINT-брашей, о чем ниже будет подробно написано. После того, как вы отсечете невидимые участки карты можно переходить к второму этапу - поиск и оптимизация ресурсоемких задач, как то различные эффекты и шейдеры, прозрачность, дисплейсменты и оверлеи, etc. Для удобного и быстрого поиска есть специальный cfg-файл. Скачайте его и скопируйте в папку cfg вашего мода/игры. Потом в игре вам всего лишь надо набрать в консоли exec dev.cfg и появяться следующие возможности:

  • включиться счетчик fps (cl_showfps 2)
  • включиться счетчик загруженности текстурами видеопамяти (mat_show_texture_memory_usage 1)
  • На нижний ряд буквенных клавиш временно забиндяться вот такие вещи (работает только при английской раскладке клавиатуры):

z - отключает рендеринг ворлд-брашей.
x - отключает рендеринг prop_static моделей.
c - отключает рендеринг всех остальных моделей.
v - отключает рендеринг дисплейсментов.
b - отключает рендеринг func_brush, func_breackable и другие брашевые ентити
n - отключает рендеринг оверлеев
m - отключает рендеринг декалей
, - отключает рендеринг спрайтов
. - отключает рендеринг частиц (дым, пыль и т.п.)
/ - отключает рендеринг ентить всех типов(модели, брашевые модели, обычные ентити и т.п.)

Фишка этого конфига в том, что нажав и удерживая нужную клавишу/группу клавиш вы отключаете рендеринг нужного, а отпустив - все возвращаеться к исходному варианту. С помощью этого конфига определите, сколько fps дает отключение разных элементов карты и переходите к их оптимизации. Также консольная команда +showbudget выведет вам на экран график, где наглядно показаны все процессы, выполняемые движком Source в текущий момент, и сколько приходиться затрат ресурсов на каждый из них.

Оптимизация с помощью HINT-брашей

Команда mat_leafvis 1 в действии

Итак, самый главный и базовый метод оптимизации - сделать так, чтобы в любой момент максимум не видимой для игрока части карты не рендерился. Это делаеться делением всего обьема карты на "листья". Чтобы понять, что такое "лист" и спокойно дальше читать статью - рекомендую загрузить любую стандартную карту (HL2,CSS,DoDS - что под рукой), ввести в консоли команду mat_leafvis 1 и побегать по карте (эта консольная команда включает отображение границ того листа, в котором вы сейчас находитесь). Итак, наша карта поделена на листья - это делает VBSP в начале компиляции за несколько секунд. Дальше в дело всутпает VVIS - он берет лист и вычисляет, какие другие листья видны из него; эта информация записываеться и VVIS переходит к следующему листу, и так пока они не кончаться. Когда вы загружаете карту в игре - эта информация активно используеться: в каком листе вы сейчас находитесь и какие листья из него видно: движок будет рендерить только те модели/текстуры, которые находяться внутри видимых в текущий момент листьев.

На практике только на карте состоящей из корридоров и помещений VVIS сделает не_очень_плохое отсечение невидимых в текущий момент частей карты да и то не всегда. Чтобы сделать отсечение невидимых частей уровня лучше у вас будет всего один инструмент - вы сможете создавать сами листья там, где сочтете нужным. Но обсчет ваших листьев будет все равно осуществлять VVIS - надо знать всего 4 принципа его работы:

  1. Видимость листьев относительно друг друга рассчитываеться просто: если из любого места одного листа видно любое место (хоть самый краешек) другого листа - они считаються видящими друг друга и соответственно все что в них находиться - рендериться.
  2. Положение игрока в любом листе не учитываеться. Или вы в листе или нет; как только вы зашли хоть в самый уголок листа - включаеться рендеринг всего, что только видно из этого листа.
  3. Дисплейсменты и func_detail/func_brush не учитываються VVIS
  4. Ребра ворлд-брашей (в т.ч. и закрашенных текстурой nodraw) являються основным источником листьев, делаемых автоматикой VVIS.

Пока эти правила "повиснут в воздухе" - нужна небольшая практика, чтобы они стали понятными и привязались к конкретным образам. Ну раз нужна практика - она есть у меня :). Вот вам карта-инвалид, на которой автоматика буксует по полной. Эту карту мы и будем оптимизировать: http://projectD2.com/2007/

  1. О роли Func_detail и вообще о методах уменьшения числа листьев.
  2. Особенности видимости обьединенных моделей типа func_brush + умеренно используйте env_sprite (эффект ореола вокруг ламп и т.п.) - они не отсекаються геометрией и HINT-брашами. В игре наберите команду mat_wireframe 1 - вы увидите, что они рендеряться через весь уровень. О больших обьектах (ошибка Cant find good match for....)
  3. О glview.exe
  4. Двух и трех маршрутные карты. Не допускать одновременной видимости всех игроков на сложной по геометрии карте.
  5. На что ориентироваться в плане производительности.

Оптимизация моделей под Source

  1. Комплексные модели (с картой примером).
  2. LOD (Level Of Detail) для моделей.

Оптимизация текстур и материалов

256vs128.jpg

Чтобы повысить fps на карте за счет оптимизации текстур надо знать следующие моменты:

1)Уменьшая разрешение текстуры в двое (например с 256х256 пикс на 128х128 пикс) вы уменьшаете количество пикселей в четыре раза - это несколько снижает обьем вычислений при рендеринге. Также примените к уменьшеной текстуре фильтр Sharpen в фотошопе - это немного снизит размазанность уменьшенной текстуры в игре. Тем не менее этот метод оставьте напоследок, т.к. размазанные текстуры не есть хорошо да и прирост производительности не сильно большой (ощутимее всего он будет, когда вы уменьшаете карту нормалей или отражений - т.е. что то более ресурсоемкое, чем обычная текстура); но все что может быть уменьшено - должно быть уменьшено.


2)Используем детальные текстуры маленького размера + уменьшаем размер основной текстуры. Подоробно описано в статье Прозрачные текстуры. Альфа-канал..


3)Оптимизируем прозрачные текстуры по мере возможности - подробно описано в статье Детальные текстуры (detail textures).


4)Экономим на картах нормалей, отражений и т.п.


5)LOD (Level Of Detail) для текстур на моделях.


6)Используем Proxies-скрипты в файлах материалов.


7)В некоторых случаях можно применить устаревший метод рендеринга текстур - Point sampling. Метод рендеринга текстуры задать очень легко - с помощью программы VTF-Edit поставить один флажок в свойствах vtf-файла текстуры(и не забыв нажать кнопку "сохранить" после этого). Если вам не понравиться то, как выглядит текстура в игре с этим старым типом рендеринга - вы просто зайдете в свойства текстуры еще раз и снимете этот флажок. Ускорение рендеринга текстур этим старым и забытым методом "point sampling" достигаеться за счет примитивности: при удалении/приближении к текстуре в игре никакой интерполяции между пикселами не производиться, здраствуй первый Quake :D - в итоге издалека текстура выглядит движущимся мессивом пикселей, а подойдя в упор - вы увидите каждый пиксел четко, что снижает реализм игры. Но в некоторых случаях этот метод может поднять фпс на вашей карте без заметных на глаз искажений. Кликайте на картинку справа, там все понятно. От себя замечу, что эффект "мессива" из пикселей при значительном удалении от такой текстуры можно уменьшить, если при создании текстуры выбрать метод фильтра для mip-map уровней текстуры "smoothen" - т.е. уменьшаем контрастность мип-текстур.


8)Параметр "$nodecal" 1 в vmt тех текстур, которые находяться далеко от игрока может немного помочь в сетевой игре - декали от пуль не будут появляться на них, что позволит fps иногда проседать чуть меньше. Для тех текстур, что покрывают браши на 3D-skybox этот параметр не нужен (декали там и так не появяться).

Дополнительная информация

  1. Func_brush ентитя имеет тот же баг, что и prop_static ентитя - используйте комплексные модели из брашей!
  2. Скейл лайтмапов