Как работают стратегии в реальном времени в PHP? - PullRequest
14 голосов
/ 27 февраля 2012

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

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

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

Ответы [ 5 ]

12 голосов
/ 08 января 2013

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

Travian, т. Е. Дает вам иллюзию того, что он в режиме реального времени благодаря использованию JavaScript.На самом деле происходит следующее:

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

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

11 голосов
/ 27 февраля 2012

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

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

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

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


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

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

4 голосов
/ 27 февраля 2012

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

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

1 голос
/ 09 января 2014

Ну, как сказал пользователь 1842120: Travian realtime - это иллюзиянаходятся в сети .., P1 атакует P3, при перезагрузке страницы или изменении страницы сценарий будет активирован и P3 будет атакован ..

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

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

0 голосов
/ 03 декабря 2013

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

...