Показать сообщение отдельно
Старый 14.04.2010, 12:04
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 1  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
По умолчанию Кто как разруливает игровую ситуацию с производством если пользователь offline?

Ситуация стандартная (платформа AS3/PHP/Memcahe/MySQL):

Есть объект "завод", в нем крутится несколько айтемов на разной степени готовности. С определенной периодичностью мы по таймеру запускаем метод "завода", проверяющий готовность продукции, и готовые айтемы перемещаем на "склад", где они суммируются по видам продукции. Перемещение оформляем следующим образом:
- вызываем на сервере скрипт, который проверяет возможность операции и модифицирует две таблицы (таблицу текущего производства и таблицу склада) и в случае успеха возвращает информацию об изменениях
- во флэше слушаем ответ сервера и при получении изменений учитываем их в объектах "завод" и "склад" с последующей визуализацией.

Пока пользователь online, все банально.

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

Я вижу три варианта:

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

2. Проверять при каждом обращении к локации (не важно, кто обратился) наличие на заводе завершившихся производств с последующей отработкой перемещения продукции до выдачи информации по локации. Этот вариант мне нравится больше, но несколько усложняется процесс взаимодействия с сервером и, опять же, возрастает нагрузка на сервер.

3. Создать в базе дополнительную таблицу "завершение производства", в которую при открытии производства для конкретного айтема сразу писать время его завершения и все необходимые параметры. Тогда можно сделать скрипт, которые запускается кроном, но не ползает по всей базе, а просто отрабатывает те задания, которые пора отработать (с последующим удалением). Т.е., фактически мы эмулируем запрос на перемещение со стороны флэша. Тут все понятно, надо только как-то разрулить ситуацию, чтобы эти запросы не пересеклись, если пользователь в online.

Возможно, есть более простые варианты?

В общем, нужны советы от тех у кого это работает на большом количестве пользователей.