Лучший способ управления ресурсами в игре
Недавно я приступил к разработке игры и сейчас занимаюсь созданием MMORTS-игры (многопользовательская онлайновая стратегия в реальном времени), но я застрял в одном месте и мне нужно предложение, как им управлять. Ниже случай:-
Общая информация об игре
Все данные сохраняются в SQL Server 2008
Эта игра разрабатывается для использования в мобильных телефонах.
выше - значок игровых ресурсов с его значением.
Каждый ресурс имеет свое увеличение в час, предположим:
Дерево:- 100/ час
Камень:- 100/ час
Питание:- 100/ час
проблема
Игра, которую я разрабатываю, будет иметь 10 тысяч пользователей, использующих эту игру одновременно, что означает, что я не могу постоянно обновлять значение ресурса. Итак, мой вопрос, как мне управлять ресурсами игры (дерево, камень, еда)?
Зачем обновлять значение ресурса в базе данных?
Это потому, что если человек нападает на город, то сколько ресурсов (дерево, камень, еда) доступно для захвата.
Мой текущий подход
Изменение стоимости в момент нападения на город, но есть ли лучший способ сделать это?
Пожалуйста, не стесняйтесь задавать любые вопросы и менять метки вопроса, так как я не знаю, какой тег здесь подойдет.
1 ответ
Зачем вам вообще нужно его обновлять, если у вас есть начальное значение и скорость роста, это довольно простой расчет. StartValue + (HoursSinceStart * Rate)
, это покроет ваши дисплеи. Затем каждый раз, когда вы добавляете / удаляете ресурс по определенному действию, вставляете новую запись с суммой проведенных действий и новую отметку времени.
Например, используя Wood, User1 начинается с 100:
Ресурс
ResourceID Name HourlyIncrease
------------------------------------
1 Wood 100
2 Stone 100
3 Food 100
UserResource
UserID ResourceID Value CreatedDateTime
---------------------------------------------
1 1 100 2015-09-04 10:00:00
Чтобы получить значение в @DateTime, вы можете использовать:
DECLARE @DateTime DATETIME2 = SYSDATETIME(),
@UserID INT = 1,
@ResourceID INT = 1;
SELECT TOP 1
Quantity = Value + (r.HourlyIncrease * DATEDIFF(HOUR, ur.CreatedDateTime, @DateTime))
FROM UserResource AS ur
INNER JOIN Resource AS r
ON r.ResourceID = ur.ResourceID
WHERE ur.ResourceID = @ResourceID
AND ur.UserID = @UserID
AND ur.CreatedDateTime < @DateTime
ORDER BY ur.CreatedDateTime DESC;
Затем, если пользователь делает что-то, что использует количество 50, просто создайте новую запись:
DECLARE @DateTime DATETIME2 = SYSDATETIME(),
@UserID INT = 1,
@ResourceID INT = 1,
QuantityChange INT = -50;
INSERT UserResource (UserID, ResourceID, Value, CreatedDateTime)
SELECT TOP 1
ur.UserID,
ur.ResourceID,
Value = Value + (r.HourlyIncrease * DATEDIFF(HOUR, ur.CreatedDateTime, @DateTime)) + QuantityChange,
CreatedDateTime = @DateTime
FROM UserResource AS ur
INNER JOIN Resource AS r
ON r.ResourceID = ur.ResourceID
WHERE ur.ResourceID = @ResourceID
AND ur.UserID = @UserID
AND ur.CreatedDateTime < @DateTime
ORDER BY ur.CreatedDateTime DESC;
Таким образом, вы избегаете ненужных транзакций для вещей, которые предназначены только для отображения.
NB. Я предполагал, что ресурс будет увеличиваться только после полного часа, если это не так, вам может понадобиться что-то вроде:
Quantity = Value + FLOOR((r.HourlyIncrease * DATEDIFF(SECOND, ur.CreatedDateTime, @DateTime) / 3600))
Тем не менее, для целей игры, если это будет постоянно увеличиваться, вероятно, лучше всего просто извлечь 3 компонента (скорость, время и начальное значение) и сохранить их в течение сеанса, а также выполнить расчет для сторона клиента.