Оптимизация сервера Team Fortress 2 на 100 человек

Краткий пересказ видео о превращении сервера на сотню человек из небольшого эксперимента с ужасными лагами в рабочую идею

В обновлении от 25 июля 2023 года Valve ввела команду -unrestricted_maxplayers, позволяющую поднять максимальное количество игроков на сервере до 100. До этого максимальное количество ограничивалось 32, за исключениями нескольких серверов с приватными плагинами, позволяющими увеличить число до 64

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

Простые тесты показали, что снижением тикрейта со стандартного 66 до 10 можно поднять производительность сервера, сохраняя игру в пределах комфортного геймплея. Улучшить производительность должен был и смена физического движка. Jolt Physics использовался в Horizon Zero Dawn и после того как был выложен в общий доступ на GitHub, был перенесён умельцами для его использования в играх на движке Source.

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

отдельное видео о забавной работе вагонетки в tf2

В итоге ни снижение тикрейта, ни смена родного Havok не потребовалось (как и последние 2 параграфа этого текста) — перенос сервера на Ryzen 7800X3D смог обеспечить полную плавность игры даже с сотней игроков при тикрейте в 66.

Оставалась одна проблема — защита сервера падения от превышения лимита объектов.

Дело в том что в Team Fortress 2 сервер может обсчитывать не более 2048 объектов за один кадр. Превышение этого числа приводит к падению игры, а, значит, и сервера.

Каждый из 100 потенциальных игроков может при своём спавне может загрузить сервер на 11 объектов — включая свою модель, экипированное оружие и косметику и активные предметы вроде шумелок, насмешек и трекера контрактов. Цифра в 1100 не кажется большой при лимите в 2048, но это если не знать о том что объектами считаются не только игроки и создаваемые ими ракеты, стрелы, турели, телепорты, банки с мочой и прочие проджектайлы, но и существующие на карте пропы, частицы, звуки и динамические объекты

Большинство популярных карт в игре оставляют места на менее чем 1100 объектов
Большинство популярных карт в игре оставляют места на менее чем 1100 объектов

По умолчанию на обычном сервере превысить такой лимит крайне сложно и практически невозможно практически, но реально теоретически на некоторых загруженных объектами картах с использованием демоменов —каждый игрок может нагрузить сервер 14 липучками Шотландского сопротивления и 4 гранатами любого гранатомёта.

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

52 объекта, или 4% "бюджета" сервера на Upward — одной из самых популярных карты в игре, занимают едва заметные и не влияющие на игру провода
52 объекта, или 4% "бюджета" сервера на Upward — одной из самых популярных карты в игре, занимают едва заметные и не влияющие на игру провода

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

При раскрутке минигана хевик включает анимацию злости создавая объект, при отпускании левой клавиши он меняет эмоцию, создавая второй объект. До 2022 года в игре была возможность краша сервера спамом ЛКМ при использовании автокликера 
При раскрутке минигана хевик включает анимацию злости создавая объект, при отпускании левой клавиши он меняет эмоцию, создавая второй объект. До 2022 года в игре была возможность краша сервера спамом ЛКМ при использовании автокликера 

Крайними мерами стала система экстренной выгрузки объектов. Если сервер замечал, что количество объектов приближается к критическому числу, он начинал выгружать все не критически важные объекты, начиная с выпадающих после смерти патронов с боеприпасами. Следом идёт выгрузка фоновых звуков и частиц карты. В крайнем случае сервер превращает создавать любые объекты и автоматически меняет карту — это крайняя мера, которая используется обычно лишь на одной карте в игре — pl_bloodwater

Вишенкой на торте было добавление на сервер proximity voice chat, а также осознание того, что один подобный сервер обходится ежемесячно в 200 долларов.

33
Начать дискуссию