Показать сообщение отдельно
Старый 06.10.2015, 17:18   #2
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: [MySql] Очередь

Геймплей имеет также влияние на решение.

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

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

Если все же будет планирование и авто-завершение, то тут нужно скрипт который будет постоянно проверять бд на завершенные работы, и запускать скрипты для их завершения, и проверять если есть еще работы для обработки которые ожидают.

Я бы сделал что-то типо:
id, user, added, activated, duration

Где added и activated - DATETIME. activated будет назначен только при активации. Если activated + duration уже в прошлом - значит задача завершилась. Если activated не указан, значит задача в очереди и не обрабатывается.

Скрипт получает все задачи которые activated AND (activated + duration) < now, производит операции по завершению (там добавить вещи в инвентарь или т.п.). Далее смотрит если у этого user'а есть еще задачи которые имеют не указанный activated, если такие есть, то устанвливает activated на now.

Индексация по activated, и еще compound index по user,activated.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
pax (06.10.2015), tirarex (10.10.2015)