Подтвердить что ты не робот

Как работают игры в реальном времени на PHP?

Некоторые MMO игры реального времени, такие как Travian или oGame, закодированы в PHP.

Не могли бы вы вкратце объяснить, как такая игра работает за кулисами? Как игра делает обновления в режиме реального времени без запросов игрока?

Также, какую нагрузку и пропускную способность сервера можно было бы ожидать при запуске игры RTS, такой как Travian с 1000 активными игроками?

4b9b3361

Ответ 1

Несмотря на то, что эта тема довольно старая, я думаю, что у меня все еще есть "лучше" (если можно так выразиться), отвечая на ваш вопрос, тогда неопределенные ответы "обновления выполняются cronjobs".

Травиан, т.е. дает вам иллюзию того, что он работает в режиме реального времени с помощью javascript. Что на самом деле происходит в задней части, следующее:

Игрок A отправляет атаку игроку B. В базе данных MySQL это записывается с отметкой времени прибытия. Каждый раз, когда игрок А изменяет или обновляет страницу, запускается script (с использованием включает), который проверяет любую активность в отношении этого игрока (подкрепление прибывает, атаки, достигающие целей и т.д.). script, очевидно, проверяет текущее время и просматривает все действия с меткой времени, которая меньше текущей. Это означает, что действие должно было произойти. В этот момент действие фактически обрабатывается.

Это также означает, что если ни игрок, ни игрок B никогда не войдут в систему снова, что атака никогда не будет вычислена, если кто-то еще не атакует игрока B, тогда будут обработаны все действия для игрока B и атакующего игрока.

Ответ 2

Обычно есть две части: веб-интерфейс и фоновый демон (часто называемый "обработчиком событий" ).

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

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

Если вы не полностью в режиме реального времени, но используете "тики" (например, действия выполняются каждые x минут), вы можете, конечно, использовать cronjob вместо фонового демона, - но тогда вам нужно использовать другой способ избежать условий гонки.


В моей собственной игре у меня есть фоновый демон, который имеет RPC-подобный интерфейс, поэтому в веб-интерфейсе я просто вызываю функцию syncCall('someFunction', ....);, которая затем подключается к фоновому демона через сокет и выполняет заданную функцию, возвращая все эта функция возвращается.

Однако, если бы я написал новую игру в настоящее время, я бы, конечно, пошел с асинхронным решением, таким как node.js или одна из фреймворков async python. Это избавляет от необходимости иметь две разные части, но для некоторых частей вам придется позаботиться о блокировке, так как всякий раз, когда вы возвращаетесь из одной из ваших функций, вызванной самим node, может быть выполнен обратный вызов из другого события.

Ответ 3

Обновления выполняются заданиями cron, скорее всего, или другой возможностью является то, что они делают это при входе в систему/изменении любой страницы. Полоса пропускания может сильно различаться в зависимости от того, насколько активны пользователи, сколько возможностей есть и т.д. Я думаю, вы должны измерить ее на основе localhost/test hist с примерами запросов, потому что это очень сильно зависит от проекта.

Кроме того, если будет значительное количество игроков и т.д., я бы подумал, что он не кодирует его в PHP + MySQL, а в Python & PostgreSQL, возможно, даже Java или других системах.

Ответ 4

Ну как user1842120 сказал: Травиан в реальном времени - иллюзия.

Я просто объясню, как работает "realtime" в веб-играх...

Представьте, что есть 3 игрока, 2 из них в сети.., P1-атаки P3, при перезагрузке страницы или изменении страницы будет активирован script, а P3 будет атакован..

P3 находится в автономном режиме, он не видит атаки, но это происходит. Когда P3 появляется в сети, P3 видит, что на его/ее деревню нападают, просто:

Вам нужен только один клиент (онлайн-пользователь/браузер на странице), чтобы запустить игру.

Ответ 5

Я думаю, что я бы использовал iframes и javascript для их обновления. Так что 1 info iFrame, что скрытые и qui/output iFrames, которые ссылаются на php и которые обновляются все время.