Привет, очередной девлог моей ммошки, на этот раз он полностью посвящен оптимизации всего.

Та сама работа от которой не остается красивых артефактов в виде арта и скриншотов но она чертовски важна /o/

Клиент

Начнем с самого больного, я использую игровой движок Phaser3 на основе html5 и я считаю это самая большая моя ошибка, но так сложилось исторически :D

В общем до недавнего времени я даже не знал в какую сторону копать что бы улучшить производительность игры. Бутылочное горлышко в данном случае всегда является Цпу, мне не доступен параллелизм (для сокетов разве что webworker), нормальный батчинг, адекватный кулинг, как движок себя ведет на разных системах это отдельная боль.

Это стоит знать всем кто хочет делать хоть что то серьезное на html5 (просто не делайте это).

Единственное что я могу делать это уменьшать кол-во игровых объектов на экране, в списке отображения и обновления.

Я экспериментировал с батчингом через рендер текстуры, с чанками для отрисовки карты (github), написал свой ленивый кулинг (github) в обход системы движка с полным выбрасыванием объектов из DisplayList, UpdateList это все работает но все еще недостаточно.

Теперь я перешел на шейдеры, сам я шейдеры писать не умею (я не умею думать логикой цветов >_>). Я написал небольшое решение для создания шейдеров на все случае жизни а сам шейдер заставил писать нейронку.

Логика проста, чем больше я смогу заменить объектов в игру, тем больше я освобожу ресурсов.

Код для тех кто вдруг страдает такой же фигней как и я, для промта нейронки. На этом шаблоне написано 2 десятка шейдеров разной степени упорости)

github

Я не использую Post шедеры т.к. они намного менее гибки, и как показала практика начинают артефачить по любому поводу.

Заменил целую кучу объектов на шейдеры, какие то уже были давно но текущий список такой:

- Все хп бары
- Метки на мини карте
- Туман войны
- Выделения машинок, прицел, навигация
- Снаряды (хотя тут не все так просто)
- Облака, буря, ветер
- Ну и по мелочи: подсветки предметов, атаки босса, вода

Суммарно кол-во объектов на экране сократилось в 2 раза, FPS стал стабильнее даже мой ноут со встроенной интел карточкой вытягивает 45 кадров в секунду, хотя раньше это было 15 кадров и падал с ошибкой framebuffer'a.

На экранах с 144гц были артефакты которые хз чем были вызваны но теперь их нет.

Бонусом я получил более вылизанную картинку, а прицел теперь вообще одно удовольствие)

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

Клиентское предсказание и серверная компенсация лага

Ну так как я делаю ммо надо уже сделать эту задачу

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

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

- к сообщению добавляет обязательно inputID что бы мы могли синкатся с сервером, у меня это цикличный байт от 0-255 который генерит клиент

- пока пакет долетает до сервера машинка уже находится в будущем состояние

- когда от сервера прилетает реальная позиция мы удаляем все инпуты у которых inputID меньше чем у серверного, пересчитываем все предсказания заново на основе свежих серверных данных

В общем классическая схема, я раньше не хотел делать т.к. у меня игра довольно медленная но практика и фидбек показали что надо, теперь инпут лаг от нажатия клавиш составляешь 0 мс.

С оружием немного сложнее:

- Отвязал "прицел" от серверных данных, теперь прицел говорит о "намерение" игрока а не реальная позиция где упадет снаряд. От данных зависит только позиция коллизии но задержка в 100мс там нещитова)

- Сделал предсказание поворота оружия, а потом удалил потому что это не дало импакта вообще )

- Привязал анимацию выстрела к позиции вылетела пули, что бы анимация не отставала от машинки

- Улучшил физику снаряда, теперь снаряд наследует скорость машинки и это косвенно улучшило игровой фидбек

Компенсация лага:

- Сервер каждый тик теперь отсылает тик ид, который мы отсылаем с инпутом игрока

- На основе этого мы можем высчитать лаг клиента в тика и компенсировать позицию вылета пули с учетом скорость машинки игрока

- Компенсация лага ток на 2 тика (64мс), читеры могут делать бесполезный чит на 2 тика :D

Это не полноценная компенсация лага но это улучшило ощущения игры с низким пингом на 120%

Оптимизация сервера

Тут в целом куча всего было сделано от батчига сообщений в бд до "spatial partitioning" в расчетах физики и обзора. Самое главное что я смог оптимизировать сейчас работу сервера с 200 сек процессорного времени на 50-80 сек.

Раньше сервер с полной выкладкой работал на 6 машинах то теперь достаточно 2х, а вообще и на одном ноутбуке работает)

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

200 ботов в одной точке карты, вместо тысячи слов)

В общем пока как то так)