Обновление базы данных каждую секунду неэффективно, поэтому рекомендуется использовать временные метки и рассчитывать по требованию.
Если для хранилища установлен лимит хранилища, то при подсчете, что на складе теперь должно быть 5000 золота, но он имеет место только для 1000, вы устанавливаете его только на 1000.
Если кто-то отправляет вам золото (увеличивается в случайное время), вы сначала вычисляете, каким должен быть склад, прежде чем добавлять новые ресурсы.
Если кто-то крадет у вас золото (уменьшается в случайное время), вы делаете то же самое.
По сути, при каждом обращении к количеству золота вы обновляете его до текущего текущее время в зависимости от того, когда оно было обновлено в последний раз.
Например:
- 1: 00 - я выхожу из золота 100/500, золото генерируется со скоростью 100 / час (last_updated : 1:00)
- 2: 00 - кто-то еще входит в систему и отправляет 200 золотых в мою деревню (last_updated: 1:00)
- 3: 00 - ресурсы прибывают в мою деревню, поэтому мы рассчитываем новое золото Stora ge: 100 за час производства + 200 от отправителя на общую сумму 400 сейчас (last_updated: 3:00)
- 4: 00 - Кто-то посылает рейд на мою деревню (last_updated: 3:00)
- 5: 00 - Ничего
- 6: 00 - Злоумышленник крадет у меня 200 золотых, поэтому мы рассчитываем новое хранилище золота: 300 для производства часов, но 300 + 400> 500, поэтому у нас есть только 500/500 в это время. Атака занимает 200, поэтому -200 за результат 400/500. (last_updated: 6:00)
- 6: 30 - я снова захожу, чтобы увидеть свое золото на 450/500, поскольку прошло 30 минут
Пример изменения ставки (например, если ваше производство было обновлено в автономном режиме):
- 0/1000 золота, 100 / час, у меня есть кое-что, что будет завершено через 2 часа, что увеличит производство до 200 / час
- Вы войдите в систему через 5 часов (или кто-то украдет, или кто-то даст), и теперь оно будет 100 * 2 + 200 * 3 = 800/1000
Вы будете знать последнюю отметку времени и текущее время
Если ожидающие события не меняют ставку, вы можете рассматривать все неактивное время как одну и ту же ставку
Если ставка изменилась, вам нужно знать, в какое время это делалось изменение курса. Тогда у вас есть много сегментов с разными скоростями: если пример начинается в 1:00, то в 3:00 вы знаете, что производство было изменено, поэтому вы можете иметь 2 сегмента: 1:00 ~ 3:00, 3:00 ~ 6 : 00 (вы делите неактивный временной отрезок на время (с) изменения ставок). Вы назначаете ставку для каждого сегмента, а затем можете рассчитать увеличение золота в каждом сегменте отдельно и суммировать их вместе. Опять же, вы делаете это всякий раз, когда к золотому значению обращаются.