Я пишу игру, в которой игрок может строить и улучшать здания. Они могут иметь здания, производящие ресурсы. Игра обновляет количество ресурсов не позднее, чем за 10 минут. Если пользователь неактивен более 10 минут, я вычисляю правильную сумму при следующем обновлении страницы.
Игрок может начать модернизацию здания в момент времени 1. Его текущее производство золота составляет 100. Предполагается, что оно будет завершено в момент времени 100, а часть добычи ресурсов увеличится до 600. Но игрок снова войдет в систему в момент времени 200. Он должен получить 100 +600 золота, но как рассчитать?
Возможно, обновите таблицу user_resources с двумя столбцами — previous_production
а также previous_production_active_till
,
Когда при расчете ресурсов проверяйте, меньше ли последнее обновление, чем старый объем производства. Если это так, получите prev_time_delta, выполнив previous_production_active_till - last resources update
, Подсчитайте, сколько было добавлено в старых тарифах до значения previous_production_active_till, когда вычисляете вторую сумму для улучшенной ставки. Например, последнее обновление происходит в момент 1. Старое производство — 100 на 100 единиц времени. Старый курс длится до 100 раз. Новая ставка начинается с 100. Игрок входит в систему во время 200. Игра делает:
1-100=abs 99+1=100/100=1
100*1=100
теперь за оставшееся время мы берем новый дебит,
200-100=100+1=101/100=1
600*1=600
Немного справочной информации, это игра PHP, и игрок взаимодействует с игрой с помощью запросов POST / GET. Для оптимизации, чтобы уменьшить нагрузку на базу данных, я выбираю обновить ресурс игрока, проверяя каждую загрузку страницы в течение определенного промежутка времени, в данном случае 100 с момента их последнего обновления, и делайте каждое обновление только тогда.
Это один из вариантов, любой другой способ?
чтобы уменьшить нагрузку на базу данных я выбираю обновить ресурс игрока
путем проверки на каждой странице загрузки в течение определенного промежутка времени, 100 в
это дело с момента их последнего обновления и делать все обновления только потом.
Что если игрок будет перезагружаться каждые 2 минуты? Будут ли произведены его расчеты ресурсов для входа в систему при выполнении предыдущего запроса на вход?
Я думаю, вам не нужно думать только о 100 times
период сбора урожая игрока. При повторном входе игрок должен также получить сумму своего урожая со времени предыдущего запроса на вход в систему / calcHarvest.
Про здания я предлагаю рассмотреть два способа:
building_is_upgraded_timestamp
, И получить delta=(current_timestamp - building_is_upgraded_timestamp)
, затем EarnedHarvest = delta * Harvest_produce_per_second;
Harvest_produce_per_second
старого upgrade_level_building. добавлять LastEarnedByThisBuildingTimestamp
к каждому горному зданию. Так что вам нужно знать building_is_upgraded_timestamp
и сравнить это с current_timestamp
, Смотреть код:
//If we logged in firstly after building has been upgraded
if ( $current_timestamp > $building_is_upgraded_timestamp )
{
$delta_old_level_building = $building_is_upgraded_timestamp - $LastEarnedByThisBuildingTimestamp;
$delta_new_level_building = $current_timestamp - $building_is_upgraded_timestamp;
$earned_harvest = $delta_old_level_building * $Harvest_produce_per_second_previous_level_building + $delta_new_level_building * $Harvest_produce_per_second_current_level_building;
}
else // Logged in and building is still upgrading
{
$delta = $current_timestamp - $LastEarnedByThisBuildingTimestamp;
$earned_harvest = $delta * $Harvest_produce_per_second_previous_level_building
}
Других решений пока нет …