Создание Онлайн-Сервера Для Мобильных Многопользовательских 2D-Игр В Реальном Времени (Жанры Rpg И Стратегии) ​​С Api На Php, Часть 2

Тем, кто еще не успел ознакомиться с первой частью раздела, рекомендую прочитать первая статья где я рассказываю о самой идее API-сервиса.

В этой части будут обсуждаться проблемы, с которыми придется столкнуться.



Асинхронность и масштабируемость

Когда наш сервер обрабатывает запрос игрока на то или иное действие, для расчета требуется время (на момент написания статьи оно составляет ~5-10 мс).

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

Подробнее о том, зачем это нужно, можно узнать из моего видео:

Параметры

PHP сегодня работает в двух режимах
  • ФПМ (тот режим, когда есть один «управляющий» процесс и куча дочерних процессов, которые открываются динамически по количеству обращений к сайту, например) - это процесс с коротким жизненным циклом
  • интерфейс командной строки - режим работы переводится как Интерфейс командной строки, но когда слышишь слово командная строка, многие думают, что для работы на экране она должна быть открыта - это не так, на самом деле php скрипт работает как демон на заднем фоне.

    Он не имеет условного процесса управления.

    Это процесс длительного жизненного цикла

Оба этих режима тратят +- 2 мс на подъем процесса; в режиме CLI мы можем написать свой сервер для обработки запросов (причём не только http, но и websocket, который будет выбран в качестве «маршрутизатора», удерживающего игроков).

Каждый из них имеет ряд особенностей, с которыми им приходится иметь дело.

Каждую из опций можно вызвать друг из друга (например, процесс CLI можно вызвать из FPM функциями семейства exec, которые тратят на вызов +- 30 мс, а из CLI можно вызвать FPM, отправив запрос поднять процесс напрямую в сокет fpm и даже эмулировать передачу данных POST и GET) Мы можем использовать CLI для управления сервером (скриптом, который слушает запросы пользователей), который создает новые процессы FPM (через сокет) в сервисах (предположим, наша архитектура API будет построена в виде сервисов), не дожидаясь ответа.

(они отправляются и забываются) для поддержания асинхронности.

Также НПС должны жить своей жизнью (идти в атаку) и жить они будут в режиме CLI, о чем я снял подробное видео:

Проблемы

  • Так или иначе, на поддержание минимальной функциональности процесса CLI тратится 0,7% процессорного времени (мы рассматриваем сервер с одним ядром) и большое количество NPC «съедают» весь процессор
  • PHP выделяет ОЗУ (как в CLI, так и в FPM) процессу больше, чем ее фактическое потребление ~+50% (этот параметр можно посмотреть с помощью функции Memory_get_usage(true)), что при большом количестве NPC-процессов будет « съесть» больше оперативной памяти, чем следовало бы.

    Кроме того, количество одновременных процессов PHP FPM ограничено настройками файла конфигурации.

  • Каждый раз при запуске CLI в память загружаются обычные PHP-скрипты (сам фреймворк).

  • При использовании библиотек типа Apcu (позволяет кэшировать данные в памяти, включая ряд ресурсов, объектов и php-массивов) в режиме Cli мы не можем получить то, что было создано в режиме FPM (и наоборот, так как в FPM этот кеш живет до тех пор, пока php-fpm перезапускается) в CLI до конца работы демона и только в нем самом) и таким образом в CLI нужно искать другой способ доступа к общей памяти
  • Но мы не можем работать только в CLI (например, когда приходит запрос от игрока и нам нужно запустить процесс).

    Каждый из режимов тратит время на поднятие процесса (новый процесс cli создается из php-функций семейства exec, которые тратят +-30 мс), fpm +-2 мс, а хорошим пингом в играх считается 60 мс.



Решение проблемы

  • Для решения проблемы потребления памяти при каждой загрузке скриптов в php используется технология опкэш который по сути разместит всю структуру в общей памяти (эти php-файлы загружаются в начале скрипта через автозагрузку композитора или прямое требование).

    Демонстрация его работы на видео:

  • Количество одновременных php fpm можно увеличить, изменив настройки самого fpm, однако проблему ниже это не решит
  • Объединение НПС и объектов в так называемые управляющие «пулы», которые синхронно управляют десятками или сотнями живых НПС и объектов (например, 1 пул — 1 карта).

    Это решит проблему чрезмерного потребления памяти и процессора (ведь поддержание CLI-скрипта, который ничего не делает, требует процессора и так и сяк 0,7%, а 100 CLI-скриптов тратят в десятки раз больше, чем пул из 100 NPC под его контролем).

    Пример того, как это будет выглядеть, можно увидеть на видео:

  • Мы также не можем использовать общий кеш Apcu (который кэширует ресурсы, объекты и php-массивы без какой-либо сериализации) для доступа к нему с нашими NPC (поскольку они работают в CLI), но мы можем обратиться к библиотекам для работы с общей памятью, например Шмоп и подобное в php
Я постарался кратко и подробно описать некоторые первые проблемы, с которыми сталкивается разработчик сервера для игр реального времени, не нагружая их кодом и примерами (которые будут в следующих статьях, где сравниваются технологии, используемые для хранения и обработки).

данные будут) Для тех, кому интересна идея моего творчества, есть адрес проекта где я делюсь исходным кодом.

буду признателен за лайк Подпишитесь на мой профиль чтобы не пропустить новые статьи.

В опросе могут участвовать только зарегистрированные пользователи.

Войти , Пожалуйста.

Статья лучше по качеству/восприятию, чем первая часть? 47,83% Все равно плохо и ничего не будет работать 11 30,43% Стало немного лучше, но не верю, что намеченный сервис выйдет 7 21,74% Лучше или хуже, но сама идея такого сервиса кажется реальной и полезно 5 0% Стало лучше 0 Проголосовали 23 пользователя .

6 пользователей воздержались.

Теги: #Разработка игр #api #php #unity #unity3d #разработка игр для android #сервер для онлайн-игр #разработка игр для ios

Вместе с данным постом часто просматривают: